Skip to main content
Glama

Server Details

Draft, find, update and sign contracts in fynk, the European contract management platform. Your AI assistant can search and summarize your documents, create contracts from templates or PDFs, fill in parties, signatories and dynamic fields, build templates, manage tags, teams and metadata, and send documents out for e-signature (SES, AES, QES). It acts with your own fynk permissions via OAuth. Requires an Essential, Business or Pro plan (14-day free trial) with MCP enabled by an account admin.

Ownership verified
Status
Healthy
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.9/5.0

Scored across 68 tools

Disambiguation5/5

Despite the large surface, nearly every tool has a distinct resource+action: the create/update/delete/list verbs pair cleanly with resources (document, template, account-metadata, account-team, account-tag, etc.). Potential confusion points are explicitly handled — create-document-from-scratch vs -from-template vs -from-pdf-upload, find-* (fuzzy search) vs list-* (enumerate), get-document-info vs list-documents, and account vs external parties are all disambiguated in the descriptions. An agent can reliably select the right tool.

Naming Consistency5/5

Uniform kebab-case with a verb-first convention throughout: create-/update-/delete-/list-/get-/find-/move-/set-/replace-/duplicate-/archive-/restore-. Resource suffixes are predictable (account-tag, account-team, template-party, document-signatory). No mixing of camelCase or alternate verb styles.

Tool Count2/5

68 tools is very heavy for a single MCP surface, well beyond the comfortable 3-15 range. The domain is genuinely broad (documents, templates, account config, parties, signatories, dynamic fields, signature blocks), so most tools are individually justified, but the sheer count will challenge an agent's selection and context budget.

Completeness4/5

Core CRUD/lifecycle coverage is strong: documents (create from scratch/template/PDF, duplicate, archive/restore, stage moves, tags, teams, parties, signatories, dynamic fields, metadata, PDF download), templates (full authoring, parties, signature blocks, dynamic fields, content, publish state) and account config (types, metadata, tags, teams). Minor gaps: no document content editing, no delete operations (archive-only may be intentional), and no proposals/approvals or comment tooling.

Available Tools

68 tools
archive-documentArchive documentA
Destructive
Inspect

Archives a document, hiding it from the account's default document lists.

Use this tool when:

  • A document is no longer actively worked with and should be moved out of the way

  • The user asks to archive, hide, or clean up a document

Archiving does not delete anything: the document keeps all its data and can be restored later with the restore-document tool. The document must not already be archived.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_uuidYesUUID of the document to archive. If you don't already have the document's UUID, use the list-documents tool to find it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
created_atNoWhen the document was created.
updated_atNoWhen the document was last updated.
archived_atNoWhen the document was archived. Absent when the document is not archived.
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the destructiveHint/readOnlyHint/openWorldHint annotations by disclosing that nothing is deleted, all data is retained, the action is reversible via restore-document, and that an already-archived document is a precondition failure. This reconciliation of 'destructive' annotation with a reversible operation is exactly the kind of context annotations cannot convey.

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?

Front-loaded single-sentence definition, then compact bulleted triggers, then a short behavioral clause. Every sentence earns its place with no repetition of the schema or annotations.

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 one-parameter state-change tool with an output schema (so return values need no explanation), the description supplies preconditions, alternatives, reversibility, and data-retention behavior. Nothing material for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter's schema description already explains what the UUID is and points to list-documents for discovery. The body text adds no further parameter detail, so the 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?

States a specific verb (archives) and resource (document) plus the observable effect (hiding it from the account's default document lists), which lets an agent distinguish it from siblings like move-document-to-done-stage and restore-document without opening a schema.

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 enumerates when to use it ('no longer actively worked with', 'user asks to archive, hide, or clean up'), names the inverse operation (restore-document), and states the precondition that the document must not already be archived.

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

attach-account-users-to-teamAttach account users to teamA
Destructive
Inspect

Add one or more account users as members of a team.

Use this tool when:

  • The user asks to add people to a team

Existing members of the team are preserved. Use detach-account-users-from-team to remove members. Pass account_user_uuids from list-account-users, list-account-team-members (when copying members between teams), or the account-user uuids the user references.

ParametersJSON Schema
NameRequiredDescriptionDefault
team_uuidYesUUID of the team to add members to
account_user_uuidsYesUUIDs of the account users to add as members of the team

Output Schema

ParametersJSON Schema
NameRequiredDescription
iconNoIcon identifier for the team (e.g. "UserGroupIcon")
nameNoName of the team
uuidNoIdentifier for the team. Do not show to the user unless they ask for it
_entity_typeNoOnly relevant for tooling. Do not show to the user

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already carry the safety profile (readOnlyHint=false, destructiveHint=true, openWorldHint=false), so the description's burden is lower. It adds genuine behavioral context beyond the annotations: existing members are preserved (additive, not replacing) and where the UUID inputs originate. It does not state permission requirements or behavior on duplicate/invalid UUIDs.

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

Conciseness4/5

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

Front-loaded with the core action, then a short bulleted when-to-use block, then preservation and source-of-input detail. Every sentence earns its place, though the single-bullet 'Use this tool when' block is slightly heavier formatting than the content warrants.

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?

An output schema exists and annotations cover the safety profile, so return values and reversibility need not be spelled out. The description covers the mutation semantics and input provenance; only failure modes (duplicate membership, invalid/foreign UUIDs, permission errors) are unaddressed.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description goes further by telling the agent where to obtain account_user_uuids (list-account-users, list-account-team-members for copying between teams, or user-referenced UUIDs). That is real value beyond the schema's plain type definitions.

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

Purpose5/5

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

States a specific verb (add/attach) and resource (account users as team members) with clear scope: one or more users, added to a team. It also distinguishes itself from detach-account-users-from-team and from team-level update tools by clarifying that existing members are preserved.

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 an explicit trigger ('Use this tool when: The user asks to add people to a team') and names the inverse sibling (detach-account-users-from-team) for removal. It does not discuss edge cases such as users already being members or when to prefer update-account-team, so it stops short of a 5.

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

create-account-document-typeCreate account document typeAInspect

Create a new custom document type for the account.

Use this tool when:

  • The user asks for a new kind of document to be distinguished, e.g. "add a Framework Agreement document type"

  • A document or template needs a document type that the account does not have yet

Call list-account-document-types first: fynk already provides system document types such as "Non-Disclosure Agreement", "Rental Agreement" or "Service Agreement" to every account, and a custom type that duplicates one of them splits the account's documents across two types. Create a new type only when none of the existing ones fits.

Write name in Title Case, the way fynk's own types are named ("Data Processing Agreement", "Letter of Intent"), rather than copying the user's phrasing verbatim - a request for "a type for supplier framework contracts" should produce "Supplier Framework Agreement".

description and prompt are how a new type is normally set up, so propose both from what the type is for rather than leaving them out:

  • description tells users what the type covers, in one sentence. fynk's "Rental Agreement" reads: "A contract between a landlord and tenant defining the terms under which property is rented, including duration, payment terms, and usage conditions."

  • prompt is what fynk's AI analyses read when deciding whether a document is of this type - without one, they rarely pick the type. Phrase it as a selection criterion, the way fynk's own types do. "Rental Agreement" reads: "Select this type if the document defines the terms under which a tenant rents property from a landlord, including rent amount, duration, deposit, and usage conditions."

relevant_metadata_uuids decides which metadata fields fynk's AI analyses look for in documents of this type, besides the fields already relevant for every document type, which apply to the new type automatically. Call list-account-metadata to find the candidates, and propose the fields that type's documents would carry, e.g. a "Net Rent" field for a lease type. The fields chosen here are made relevant for the new type alongside the types they already have, and list-account-metadata reports the result: each field there names the document types it is relevant for.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the document type, unique among the account's custom document types, in Title Case (max 255 characters), e.g. "Supplier Framework Agreement"
promptNoSelection criterion the AI analyses use to decide whether a document is of this type (max 1024 characters), phrased like "Select this type if the document ..."
descriptionNoOne sentence describing what the document type covers, shown to users (max 1024 characters)
relevant_metadata_uuidsNoUuids from list-account-metadata of the fields to make relevant for this document type, on top of the fields already relevant for every document type. Only the account's own fields and system_reference fields are accepted

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoName of the document type
uuidNoIdentifier for the document type. Do not show to the user unless they ask for it
promptNoThe selection criterion fynk's AI analyses use to decide whether a document is of this type. Absent when it has none, in which case the analyses rarely pick the type.
customisedNoPresent, and true, only for a system document type that this account has customised. The customisation can be dropped again with update-account-document-type and `reset_to_fynk_default`
descriptionNoWhat the document type covers, as shown to users configuring it. Absent when it has none.
_entity_typeNoOnly relevant for tooling. Do not show to the user
provided_by_fynkNoPresent, and true, only for one of fynk's built-in system document types. The account can customise or deactivate such a type but never delete it. Absent for a type the account created itself

TDQS

A4.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, so the safety profile is already known; the description adds real behavioral context beyond that, notably that relevant_metadata_uuids are made relevant for the new type *alongside* the types they already have (an account-wide side effect), and that system types already exist on every account. It stops short of describing reversibility or duplicate-name failure behavior.

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

Conciseness4/5

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

Front-loaded with the one-line purpose, then when-to-use, then the prerequisite, then per-parameter guidance — a good structure for a 4-parameter creation tool. It is verbose though, with illustrative quotes for both description and prompt, and the closing clause about list-account-metadata reporting relevance borders on extraneous.

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?

An output schema exists, so return values need no explanation. For a creation tool with rich free-text parameters, the description covers naming conventions, AI-selection semantics, cross-tool prereqs, and the downstream relevance effect — nothing an agent needs to invoke it correctly is missing.

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 already 100%, yet the description still adds substantial meaning: Title Case naming conventions with worked examples ('a type for supplier framework contracts' → 'Supplier Framework Agreement'), the selection-criterion phrasing expected for prompt, and the semantics and constraints of relevant_metadata_uuids (only account-owned and system_reference fields, sourced from list-account-metadata).

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

Purpose5/5

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

States a specific verb and resource ('Create a new custom document type for the account') and immediately separates itself from siblings by naming list-account-document-types and describing the pre-existing system types. An agent can distinguish this from update- or delete-account-document-type without opening any schema.

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

Usage Guidelines5/5

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

Provides explicit when-to-use bullets, names the prerequisite call ('Call list-account-document-types first'), and gives an exclusion rule ('Create a new type only when none of the existing ones fits'). It also routes to list-account-metadata for candidate metadata fields, which is unambiguous routing.

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

create-account-metadataCreate account metadataAInspect

Create a new account-level metadata field definition.

Use this tool when:

  • The user asks for a new metadata field to track some piece of information on their documents

  • You need a metadata field to exist before writing values to it with update-document-metadata-values

Call list-account-metadata first: the account may already have a field for what the user wants, and fynk provides a range of system metadata fields that cannot be re-created under the same name.

name is the programmatic identifier (lowercase letters, digits and underscores only) and display_name is what the user sees. Write display_name in Title Case, the way fynk's own fields are named ("Signing Date", "Contract Value"), rather than copying the user's phrasing verbatim - a request for "a product colour metadata" should still produce product_colour / "Product Colour".

select and multi_select fields require select_values (the allowed options); no other field type accepts them. These strings are literally what the user picks from in the UI, so write them as presentable labels, capitalised like display_name: "Red", "Green", "Blue", not the "red, green or blue" lifted out of the request.

name and value_type are fixed at creation and cannot be changed afterwards, and it is worth getting the rest right first time rather than leaving a correction to make later. So confirm any detail the user has not spelled out instead of guessing at it - in particular the exact select_values strings, since a request like "a colour field with red, green or blue" names the options without settling how they should read.

prompt and keywords decide whether fynk's AI analyses fill this field in - a prompt puts the field into them, keywords only assist it and do nothing on their own. This is how a new field is normally set up: fynk's own creation form turns AI analysis on by default and requires both. So propose a prompt and keywords drawn from what the field is for rather than silently leaving them out, and omit both only for a field the user wants to fill in by hand. Set a description as well - it is what tells a user configuring the field what it holds.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProgrammatic name of the field, unique within the account (lowercase letters, digits and underscores only, max 255 characters), e.g. "discount_rate". Cannot be changed after creation
promptNoWhat the AI analyses should extract for this field, and what puts the field into them (max 1024 characters). Define what the value is, then qualify it the way fynk's own fields do - what counts, what does not, and what to do when the document is not explicit - over several sentences where that helps. The "Net Rent" field reads: "The net rent for the property, which is the rent excluding any taxes or costs e.g. VAT. It must be explicitly stated in the contract as net rent per month. Derive the currency unit from the parties to the contract if it is not explicitly stated." A single vague line extracts poorly
keywordsNoComma-separated keywords that help the AI analyses locate the field in a document (max 1024 characters). List the terms as they would appear in a contract, including synonyms and the equivalents in other languages the account's documents are written in - the "Net Rent" field carries "net rent, netto miete, netto kaltmiete, kaltmiete, nettomiete pro monat". Send these alongside a `prompt`; they have no effect without one
value_typeYesControls the kinds of values the field accepts (e.g. "text", "number", "currency", "date", "select"). Cannot be changed after creation
descriptionNoWhat the field holds, shown to users configuring it (max 1024 characters)
display_nameYesHuman-readable name shown in the UI, in Title Case (max 255 characters), e.g. "Discount Rate"
select_valuesNoRequired for the "select" and "multi_select" value types, and rejected for every other type: the options a user picks from, written as presentable labels, e.g. ["Red", "Green", "Blue"]
is_contract_valueNoWhether the field counts towards a document's calculated contract value. Only allowed when value_type is "currency" or "currency_duration". Defaults to false
relevant_document_type_uuidsNoThe document types the field is meaningful for, as uuids from list-account-document-types. Omit to make the field relevant for every document type, which is the usual choice; send an empty list or null to make it relevant for none

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoInternal name of the metadata field
typeNoThe type of the metadata field, which defines where its value comes from. account: Custom metadata fields that are specific to your account system_reference: Pre-defined useful metadata fields provided by fynk system_autofilled: Fields that are automatically filled by the system in response to events, like "Signing completion date" system_computed: Fields that are calculated by the system based on other metadata values. e.g. "Signing duration" is the difference between "Signing date" and "Signed date" system: Other system-provided metadata fields
uuidNoDo not show to the user unless they ask for it
settingsNoExtra configuration for the field. Not present means there is nothing to restrict
value_typeNoControls the kinds of values that can be assigned to the metadata
_entity_typeNoOnly relevant for tooling. Do not show to the user
display_nameNoHuman-readable name of the metadata field
select_valuesNoWhen value_type is "select" or "multi_select", defines the allowed values. For these types of metadata, ONLY these values are possible. Absent for every other value type
is_contract_valueNoWhether this field counts towards a document's calculated contract value. Only meaningful when value_type is "currency" or "currency_duration"
overridden_fieldsNoOnly for a "system_reference" field the account has configured differently to how fynk provides it, and absent otherwise: the update-account-metadata arguments it has changed, e.g. ["display_name", "select_values"]. Send reset_to_fynk_default to that tool to put all of them back
relevant_document_typesNoNames of the document types this field is meaningful for. Empty together with relevant_for_all_document_types false means the field is not in use for any document type, so charting it will likely produce no data
relevant_for_all_document_typesNoWhen true, the field is meaningful for every document type and relevant_document_types is empty

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false/destructiveHint=false/openWorldHint=false, but the description adds substantial behavioural context: `name` and `value_type` are immutable after creation, system metadata fields cannot be re-created under the same name, and `keywords` have no effect without a `prompt`. It also explains that select_values are rejected for other types and that AI analysis is on by default.

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

Conciseness4/5

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

Front-loaded with purpose and trigger conditions, and each paragraph carries real guidance. However, it is long and repeats schema content almost verbatim (the select_values rule, the Title Case rule, the immutability of name/value_type), so not 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?

An output schema exists, so return values need not be explained. For a 9-parameter creation tool with AI-prompt semantics, the description covers creation constraints, naming conventions, sibling routing, select_values coupling, and prompt/keywords interaction — everything an agent needs to call it correctly.

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

Parameters4/5

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

Schema coverage is 100% so the schema already documents all nine parameters, but the description adds meaning beyond it: a worked naming example (a 'product colour' request should yield `product_colour` / "Product Colour"), the Title Case convention, and the instruction to confirm unspecified details rather than guess. Some of this (Title Case, select_values requirement) restates the schema, so it is not purely additive.

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?

Opens with a specific verb+resource: 'Create a new account-level metadata field definition.' This clearly distinguishes it from siblings like create-account-document-type, create-account-tag, and update-account-metadata. An agent can identify both the action and the target object without opening the schema.

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

Usage Guidelines5/5

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

Explicit 'Use this tool when' bullets cover the two real triggers, and it names two concrete alternatives/prerequisites: call list-account-metadata first to avoid duplicates and system fields, and use update-document-metadata-values afterwards to write values. Both when-to-use and when-not-to-use are covered.

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

create-account-tagCreate account tagAInspect

Create a new tag in the current account.

Use this tool when:

  • The user asks to create a new tag

  • You need a new tag to be available before attaching it to documents or templates

name (max 40 chars) and color (hex like "#FF0000") are required.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name for the new tag (max 40 characters)
colorYesHex color code for the tag (e.g. "#FF0000")

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoName of the tag
uuidNoIdentifier for the tag. Do not show to the user unless they ask for it
colorNoHex color code for the tag (e.g. "#FF0000")
_entity_typeNoOnly relevant for tooling. Do not show to the user

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already establish the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the description carries a lower burden. It adds a little scope context about where the tag lives and what it is later attached to, but says nothing about duplicate-name behavior, required permissions, or failure modes for a creation tool.

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

Conciseness4/5

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

The imperative action is front-loaded in sentence one, followed by a short scannable usage list and a brief parameter note. Nothing is padded, though the trailing parameter sentence is largely redundant with the schema.

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

Completeness4/5

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

An output schema exists, so return values need not be described, and annotations cover the mutation semantics for this simple two-parameter creation tool. The only real gap is the absence of guidance on uniqueness/duplicates, which is minor at this complexity level.

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

Parameters3/5

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

Schema coverage is 100% and both parameters are required and documented in the schema. The description merely restates the same constraints (max 40 chars, hex format), adding no syntax or semantics beyond what the schema already provides, so the baseline of 3 applies.

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

Purpose4/5

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

The first sentence states a specific verb and resource (create a tag) plus scope ('in the current account'). It implicitly contrasts with the update-account-tag and delete-account-tag siblings, but never names an alternative or explicitly clarifies which operation this is versus them.

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?

An explicit 'Use this tool when' list gives two concrete triggers, including the otherwise non-obvious prerequisite case of needing a tag to exist before attaching it to documents or templates. It lacks any when-not guidance (e.g., check list-account-tags first to avoid duplicates) or named alternatives.

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

create-account-teamCreate account teamAInspect

Create a new team in the current account.

Use this tool when:

  • The user asks to create a new team

  • You need a new team to be available before attaching it to documents or templates

The tool requires name. Do not ask the user about an icon — the team will use the default icon. Optionally pass account_user_uuids to add initial members. After creation, don't expose the UUID to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name for the new team
account_user_uuidsNoOptional list of account user UUIDs to add as initial members of the team

Output Schema

ParametersJSON Schema
NameRequiredDescription
iconNoIcon identifier for the team (e.g. "UserGroupIcon")
nameNoName of the team
uuidNoIdentifier for the team. Do not show to the user unless they ask for it
_entity_typeNoOnly relevant for tooling. Do not show to the user

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-destructive, closed-world mutation, so the safety profile is covered. The description adds behavior those annotations cannot convey: the team receives a default icon and the agent should not ask the user about it, and the created UUID should not be surfaced to the user. No mention of duplicate-name handling or error behavior, but the added context is genuinely useful.

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

Conciseness4/5

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

Front-loads the core action in one sentence, then uses a short bullet list for trigger conditions and two terse directives for edge behaviors. Slight redundancy between the lead sentence and the first bullet, but nothing is padding.

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?

With an output schema present, return values need not be explained, and the description covers the trigger conditions, the required parameter, and the two behavioral quirks an agent would otherwise guess wrong. It does not address failure modes such as duplicate team names, which is the only remaining gap for a simple two-parameter creation tool.

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

Parameters4/5

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

Schema coverage is 100%, so the schema baseline is 3. The description goes beyond it by stating that only `name` is required, pre-empting a question about an icon parameter that does not exist, and framing `account_user_uuids` as 'initial members' at creation time, which clarifies intent versus the separate attach-account-users-to-team tool.

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

Purpose5/5

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

States a specific verb and resource with scope: 'Create a new team in the current account.' The resource (team) is unambiguous against the many create-* siblings, so an agent can differentiate it from create-template-from-scratch or create-account-tag without reading further.

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

Usage Guidelines4/5

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

Explicit 'Use this tool when' bullets cover the trigger conditions, and one bullet supplies the sequencing rationale (a team must exist before being attached to documents or templates), which maps to sibling tools like update-document-teams. It stops short of naming a when-not case or an alternative tool, so it is clear context rather than full routing guidance.

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

create-document-from-pdf-uploadCreate document from PDF uploadAInspect

Create a new document from a PDF previously uploaded via create-document-pdf-upload-url.

Use this tool when:

  • The user wants to import an existing PDF into fynk as a draft document for further processing, OR

  • The user wants to record an already-signed PDF in fynk by setting initial_stage to "done"

Call create-document-pdf-upload-url first to obtain file_upload_uuid, then upload the PDF to the URL it returns with a multipart/form-data POST, as that tool describes, before calling this tool. initial_stage is required and must be either "draft" or "done"; ask the user which they want if it isn't clear from context. Depending on the account's settings, template_uuid may be required (it copies checkpoints, document type, metadata, parties, etc. from a template).

Only pass auto_apply_ai_analysis when the user has expressed whether AI analysis results should be applied to the document automatically; omit it to use the account's default setting.

The team_uuids, tag_uuids, and account_party_uuid arguments expect UUIDs, which can be discovered via list-account-teams, list-account-tags, and list-account-parties respectively.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_nameYesThe name of the file being uploaded
tag_uuidsNoUUIDs of the tags to apply to the document. UUIDs can be obtained from list-account-tags
team_uuidsNoUUIDs of the teams to assign the document to. May be required depending on the account's settings. UUIDs can be obtained from list-account-teams
document_nameNoThe name of the new document. If omitted, the file_name will be used. Ask the user if they would like to give their own name for the document
initial_stageYesThe new document will be created in this stage. Prompt the user for this if they don't supply it
template_uuidNoUUID of the template to copy Checkpoints, document type, metadata, parties, etc from. If present, must be one of the template UUIDs returned by list-templates. May be required depending on the account's settings.
file_upload_uuidYesUUID given by create-document-pdf-upload-url
account_party_uuidNoOptional UUID of the account party to add to the document as the internal party. UUID can be obtained from list-account-parties
auto_apply_ai_analysisNoIf true, results of the AI analysis of the document (metadata, parties, etc.) are applied to the document automatically instead of being left for manual review. If not sent, the account's auto_apply_ai_analysis_by_default setting from get-account-info is used.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
tagsNoThe tags on the document. Tags are the account's own classification labels (e.g. relationship type, commercial significance, region), so they show which categories this account uses and can be filtered on with filter_tags.
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
teamsNoThe teams the document is assigned to.
localeNoLocale code, e.g. en-GB, de-AT. Absent when the document has none set. Prefer describing the locale in natural language (e.g. 'British English') rather than showing the raw code.
originNoHow the document was created.
partiesNoThe contracting entities on the document.
conditionsNoThe document's conditions: rules over its dynamic fields deciding whether a passage of the document applies, and whether each currently holds. Use them to explain why a clause is or is not part of the document, and what would have to change to flip it.
created_atNoWhen the document was created.
updated_atNoWhen the document was last updated.
archived_atNoWhen the document was archived. Absent when the document is not archived.
signatoriesNoThe individual people who sign the document. Distinct from parties: a signatory often signs on behalf of a party (e.g. a business), so a person may be a signatory without appearing as a party.
_entity_typeNoOnly relevant for tooling. Do not show to the user
summary_textNoA summary of the document content. Absent when the document has no summary.
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned
dynamic_fieldsNoThe document's dynamic fields and their values.
signature_typeNoeIDAS assurance level used when signing the document. Absent when none has been chosen.
workflow_stateNoGives an indication of which stage transitions, etc are possible to perform on this document. This object is technical state, not display content: when relaying it to the user, always render it as natural-language prose and never echo raw field names or snake_case values (e.g. say 'signing cannot be started yet because not every signature block has been assigned to a signatory' instead of mentioning 'can_start_signing' or 'signature_block_signatory').
metadata_valuesNoThe document's metadata fields and their values.
signature_blocksNoThe places in the document that are signed. A block is bound either to a single signatory or to a party, in which case every signatory of that party signs it. Every signatory needs a block covering them before signing can be started.
sequential_signingNoWhen true, signatories sign one at a time, in ascending order of their signing_order.
source_template_uuidNoUUID of the template the document was created from. Absent when it was not created from a template.
external_signatory_invitation_messageNoText shown in the email inviting external signatories to sign. Absent when no message is set.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations establish this is a non-read, non-destructive create. The description adds real context beyond that: the two-step prerequisite workflow, that template_uuid may be required per account settings, that auto_apply_ai_analysis falls back to an account default from get-account-info, and that initial_stage must be prompted from the user. It stops short of describing side effects or the resulting document state.

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?

Purpose is front-loaded, followed by a bulleted when-to-use block and then the prerequisite/parameter guidance. The longer length is justified by the 9-parameter workflow, and each sentence carries actionable information.

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 9-parameter creation tool with an output schema (so returns need not be explained), the description covers purpose, when to use it, prerequisites, conditional requirements, and defaults. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so each parameter is already documented, and the description mostly restates that (UUID discovery via list-account-teams/tags/parties, initial_stage values, auto_apply_ai_analysis default). It adds the workflow framing around file_upload_uuid but little semantic detail the schema lacks, 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 states a specific verb (Create) and resource (a new document) and identifies the source as a PDF previously uploaded, immediately distinguishing it from create-document-from-scratch and create-document-from-template. The two usage bullets further sharpen what the tool is for.

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

Usage Guidelines5/5

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

It gives explicit when-to-use conditions (import an existing PDF as a draft, or record an already-signed PDF by setting initial_stage to "done") and names the prerequisite tool create-document-pdf-upload-url with the ordering and upload step required before this call. Conditional requirements for template_uuid and auto_apply_ai_analysis are also flagged.

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

create-document-from-scratchCreate document from scratchAInspect

Create a new, empty document from scratch (not based on a template), optionally assigning teams, tags, and an account party.

Use this tool when:

  • The user wants to start a new blank document that is not based on a template

The document is created in the draft stage with no content. To create a document based on a template instead, use create-document-from-template.

The team_uuids, tag_uuids, and account_party_uuid arguments expect UUIDs, which can be discovered via list-account-teams, list-account-tags, and list-account-parties respectively.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name of the new document
tag_uuidsNoOptional UUIDs of the tags to apply to the document. UUIDs can be obtained from list-account-tags
team_uuidsNoUUIDs of the teams to assign the document to. May be required if the account enforces team assignment. UUIDs can be obtained from list-account-teams
account_party_uuidNoOptional UUID of the account party to add to the document as the internal party. UUID can be obtained from list-account-parties

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
tagsNoThe tags on the document. Tags are the account's own classification labels (e.g. relationship type, commercial significance, region), so they show which categories this account uses and can be filtered on with filter_tags.
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
teamsNoThe teams the document is assigned to.
localeNoLocale code, e.g. en-GB, de-AT. Absent when the document has none set. Prefer describing the locale in natural language (e.g. 'British English') rather than showing the raw code.
originNoHow the document was created.
partiesNoThe contracting entities on the document.
conditionsNoThe document's conditions: rules over its dynamic fields deciding whether a passage of the document applies, and whether each currently holds. Use them to explain why a clause is or is not part of the document, and what would have to change to flip it.
created_atNoWhen the document was created.
updated_atNoWhen the document was last updated.
archived_atNoWhen the document was archived. Absent when the document is not archived.
signatoriesNoThe individual people who sign the document. Distinct from parties: a signatory often signs on behalf of a party (e.g. a business), so a person may be a signatory without appearing as a party.
_entity_typeNoOnly relevant for tooling. Do not show to the user
summary_textNoA summary of the document content. Absent when the document has no summary.
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned
dynamic_fieldsNoThe document's dynamic fields and their values.
signature_typeNoeIDAS assurance level used when signing the document. Absent when none has been chosen.
workflow_stateNoGives an indication of which stage transitions, etc are possible to perform on this document. This object is technical state, not display content: when relaying it to the user, always render it as natural-language prose and never echo raw field names or snake_case values (e.g. say 'signing cannot be started yet because not every signature block has been assigned to a signatory' instead of mentioning 'can_start_signing' or 'signature_block_signatory').
metadata_valuesNoThe document's metadata fields and their values.
signature_blocksNoThe places in the document that are signed. A block is bound either to a single signatory or to a party, in which case every signatory of that party signs it. Every signatory needs a block covering them before signing can be started.
sequential_signingNoWhen true, signatories sign one at a time, in ascending order of their signing_order.
source_template_uuidNoUUID of the template the document was created from. Absent when it was not created from a template.
external_signatory_invitation_messageNoText shown in the email inviting external signatories to sign. Absent when no message is set.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: the document is created in the draft stage with no content, and the optional arguments expect UUIDs. It does not describe permissions or side effects of team assignment, but it exceeds the annotation baseline.

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

Conciseness4/5

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

Front-loaded with the core action and well organized into condition, state, alternative, and parameter notes. Slightly verbose for a single-bullet 'Use this tool when' list, but every sentence carries information.

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

Completeness5/5

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

With an output schema present, return values need not be explained. The description covers the creation stage, the template alternative, and the discovery tools for the optional UUIDs, leaving nothing an agent needs to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters including their UUID sourcing. The description largely repeats the same discovery-tool mapping without adding format, constraint, or default details beyond the schema, so the 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?

States a specific verb and resource (create a new empty document) and explicitly distinguishes itself from create-document-from-template by contrasting blank vs. template-based creation. An agent can route between the two siblings without opening either schema.

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?

Contains an explicit 'Use this tool when' condition (user wants a blank document not based on a template) and names the alternative tool (create-document-from-template) with the condition that selects it. Nothing is left to inference.

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

create-document-from-templateCreate document from templateA
Destructive
Inspect

Create a new document from a template, optionally pre-filling parties, signatories, and dynamic fields, and optionally starting the signing process immediately.

Use this tool when:

  • The user wants to generate a document based on an existing template

It is usually helpful to call get-template-info with include=["parties", "signatories", "dynamic_fields"] first to discover the template's parties, signatories, and dynamic fields so that the parties, signatories, and dynamic_field_values arguments can be populated correctly.

When completing dynamic fields, take note of the field's type when constructing the value. These are the rules to use when constructing the value string:

  • number: the numeric value in a string, using '.' as the decimal separator -> "1234.56"

  • currency: concatenate the ISO currency code and the numeric value with a ';' -> "EUR;1000.10" (for one thousand Euro and ten cents)

  • currency_duration: same as currency, but append another ';' followed by either monthly or yearly -> "EUR;1000.10;monthly" / "USD;1000.10;yearly"

  • select: one of the options from the field's select_values list -> "red"

  • multi_select: an array of the selected values in the values field -> ["red", "blue"]

  • bool: either of the strings "true" (displayed to the user as "Yes") or "false" (displayed to the user as "No") -> "true" / "false"

  • duration: a PHP-compatible duration specification -> "P6D" (6 days), "P2W" (2 weeks), "PT12H" (12 hours)

  • date: the date in the format "YYYY-MM-DD" -> "2026-12-31"

  • email, text, textarea, or any type not listed above: a string -> "test@example.com"

Setting start_signing=true will move the new document straight into the signing stage and invite the signatories to sign it; this fails if any required information (party data, mandatory dynamic field values, signature blocks) is missing.

ParametersJSON Schema
NameRequiredDescriptionDefault
partiesNoSpecifics of the parties involved in the document, additional to any information from the template.
signatoriesNoThe specific people who will sign the document
document_nameNoThe name of the new document. If omitted, the name of the template will be used
start_signingNoWhether to immediately start the signing process and invite the signatories to sign the document. This may fail if not all party or signatory data is completed, or mandatory dynamic fields do not have values
template_uuidYesUUID of the template to create the document from. Must be one of the template UUIDs returned by list-templates
dynamic_field_valuesNoValues for the template's dynamic fields. Signing can only start when all mandatory dynamic fields from the template have values provided.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
tagsNoThe tags on the document. Tags are the account's own classification labels (e.g. relationship type, commercial significance, region), so they show which categories this account uses and can be filtered on with filter_tags.
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
teamsNoThe teams the document is assigned to.
localeNoLocale code, e.g. en-GB, de-AT. Absent when the document has none set. Prefer describing the locale in natural language (e.g. 'British English') rather than showing the raw code.
originNoHow the document was created.
partiesNoThe contracting entities on the document.
conditionsNoThe document's conditions: rules over its dynamic fields deciding whether a passage of the document applies, and whether each currently holds. Use them to explain why a clause is or is not part of the document, and what would have to change to flip it.
created_atNoWhen the document was created.
updated_atNoWhen the document was last updated.
archived_atNoWhen the document was archived. Absent when the document is not archived.
signatoriesNoThe individual people who sign the document. Distinct from parties: a signatory often signs on behalf of a party (e.g. a business), so a person may be a signatory without appearing as a party.
_entity_typeNoOnly relevant for tooling. Do not show to the user
summary_textNoA summary of the document content. Absent when the document has no summary.
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned
dynamic_fieldsNoThe document's dynamic fields and their values.
signature_typeNoeIDAS assurance level used when signing the document. Absent when none has been chosen.
workflow_stateNoGives an indication of which stage transitions, etc are possible to perform on this document. This object is technical state, not display content: when relaying it to the user, always render it as natural-language prose and never echo raw field names or snake_case values (e.g. say 'signing cannot be started yet because not every signature block has been assigned to a signatory' instead of mentioning 'can_start_signing' or 'signature_block_signatory').
metadata_valuesNoThe document's metadata fields and their values.
signature_blocksNoThe places in the document that are signed. A block is bound either to a single signatory or to a party, in which case every signatory of that party signs it. Every signatory needs a block covering them before signing can be started.
sequential_signingNoWhen true, signatories sign one at a time, in ascending order of their signing_order.
source_template_uuidNoUUID of the template the document was created from. Absent when it was not created from a template.
external_signatory_invitation_messageNoText shown in the email inviting external signatories to sign. Absent when no message is set.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and openWorldHint=true, but the description adds material context beyond them: start_signing=true moves the document into the signing stage and invites signatories, and the call 'fails if any required information (party data, mandatory dynamic field values, signature blocks) is missing.' This is exactly the kind of side-effect and failure-mode disclosure an agent needs before invoking.

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

Conciseness4/5

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

Front-loaded with the purpose, then usage, then the field-value rules, then the start_signing caveat - a sensible ordering with no filler sentences. The type-by-type rule list is long, but it is dense, referenceable content rather than padding, so only mild deduction for overall length.

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 6-parameter mutation tool with a nested-heavy schema, annotations, and an output schema present, the description covers purpose, usage, prerequisite discovery, value encoding, and failure conditions. Return values need not be explained because an output schema exists, and nothing an agent needs to call it correctly is missing.

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 already 100%, so the baseline would be 3, but the description goes well beyond the schema by prescribing the exact value-construction rules per dynamic field type (currency -> "EUR;1000.10", currency_duration -> "EUR;1000.10;monthly", bool -> "true"/"false", duration -> "P6D", multi_select -> values array). That is meaning the schema does not carry.

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

Purpose4/5

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

The opening sentence gives a specific verb and resource ('Create a new document from a template') plus the optional pre-fill scope, which implicitly separates it from create-document-from-scratch and create-document-from-pdf-upload. It never names those siblings explicitly, so differentiation is by inference rather than by explicit contrast.

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

Usage Guidelines5/5

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

Provides an explicit 'Use this tool when' condition ('The user wants to generate a document based on an existing template') and a concrete prerequisite workflow: call get-template-info with include=["parties", "signatories", "dynamic_fields"] before populating the arguments. Nothing about when to reach for this tool is left to inference.

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

create-document-partyCreate document partyCInspect

Adds a new party to a document.

Use this tool when:

  • You need to add a new party to a document

ParametersJSON Schema
NameRequiredDescriptionDefault
party_scopeNoWhen this is internal_and_external, collaborators from this party may change the party's information. Required when party_account_party_uuid is not sent
document_uuidYesUUID of the document to add the party to. If you don't already have the document's UUID, use the list-documents tool to find it.
party_addressNoParty's address. Cannot be sent alongside party_account_party_uuid
party_referenceYesGeneric reference for the party. e.g. "Counterparty", "Customer", "Employee", etc
party_entity_nameNoActual name of the party. Cannot be sent alongside party_account_party_uuid
party_account_party_uuidNoTo add a saved account party, the uuid of a party from the list-account-parties tool

Output Schema

ParametersJSON Schema
NameRequiredDescription
uuidNoIdentifier for the party - unique to the specific instance of the party. Do not show to the user unless they ask for it
addressNoThe party's address. Absent when not yet known
ref_uuidNoA static reference identifier, allowing parties in documents to be matched their corresponding party in the document's source template. Do not show to the user unless they ask for it
referenceNoA generic reference for the party. e.g. "Customer", "Employee", etc
entity_nameNoThe actual name of the party. Absent when not yet known
is_internalNoTrue if the party belongs to this account
_entity_typeNoOnly relevant for tooling. Do not show to the user

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds nothing beyond that - no mention of required permissions, whether an existing party is replaced, or side effects - so it provides minimal added 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.

Conciseness2/5

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

The first sentence is efficient, but the 'Use this tool when' bullet is pure tautological filler that consumes space without adding information. Under-specification dressed as structure rather than genuine conciseness.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and annotations cover the mutation safety profile. However, for a create operation with several close siblings, the description leaves the agent without guidance on prerequisites or alternative tools, so it is only minimally complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all six parameters including the enum and mutual-exclusion rules. The description adds no parameter meaning at all, making the baseline 3 correct.

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

Purpose4/5

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

The opening sentence gives a clear verb+resource ('Adds a new party to a document'), which an agent can act on. However, it does not differentiate from close siblings like create-template-party, update-document-party, or create-document-signatory, so it falls short of a 5.

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

Usage Guidelines2/5

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

The 'Use this tool when' section is circular: 'You need to add a new party to a document' simply restates the purpose. No alternative tool is named, no exclusions, and no condition that would route the agent between this and create-template-party or update-document-party.

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

create-document-pdf-upload-urlCreate document PDF upload URLAInspect

Create a signed URL that a single PDF can be POST-uploaded to, for later use with create-document-from-pdf-upload.

Use this tool when:

  • The user wants to create a document from an existing PDF file and you need somewhere to upload it to first

Returns a uuid (pass it to create-document-from-pdf-upload after the upload completes), a url (target of the POST request), a fields map to send as form fields in the POST body before the file itself, and an expires_at timestamp after which the URL stops working.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoPerform a multipart/form-data POST request to this URL to upload the PDF
uuidNoSend this UUID to create-document-from-pdf-upload AFTER uploading the file to the given URL
fieldsNoForm fields to send in the POST body, before a final "file" field holding the PDF contents
expires_atNoWhen the URL stops being usable

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the two-step upload workflow, the fact that the URL expires (expires_at), and the required POST mechanics (fields sent as form fields before the file itself). This is rich operational context the annotations do not provide.

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

Conciseness4/5

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

Front-loaded purpose, a clean usage bullet, and a returns paragraph. The returns detail partially duplicates the output schema, but it earns its place by explaining ordering and downstream usage. Minor redundancy keeps it from a 5.

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 an output schema already exists, the description need not explain returns, yet it does so usefully. Combined with the workflow tie-in to create-document-from-pdf-upload, nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description instead front-loads return-value semantics (uuid, url, fields, expires_at), which is extra but not param-focused.

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

Purpose5/5

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

States a specific verb and resource ('Create a signed URL that a single PDF can be POST-uploaded to') and explicitly ties it to the follow-up tool create-document-from-pdf-upload. An agent can immediately distinguish this from create-document-from-scratch or create-document-from-template.

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 an explicit 'Use this tool when' condition ('The user wants to create a document from an existing PDF file and you need somewhere to upload it to first') and names the downstream sibling. It lacks a 'when not to use' clause, but the routing context is clear.

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

create-document-signatoryCreate document signatoryA
Destructive
Inspect

Adds a signatory to a document.

Use this tool when:

  • You have a document with one or more parties configured and want to add a signatory for one of the parties.

When adding a signatory whose email corresponds to an existing user in the current fynk account, all of the optional arguments will be ignored and the signatory information will be populated from the existing user's profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_uuidYesUUID of the document to add the signatory to. If you don't already have the document's UUID, use the list-documents tool to find it.
signatory_emailYesSignatory's email address
signatory_titleNoOptional job title
signatory_last_nameNoSignatory's last name
signatory_first_nameNoSignatory's first name
signatory_mobile_phoneNoMobile phone number in E.164 format. Depending on the document's signature_type, may be required before signing can be started
signatory_party_identifierYesThe ref_uuid, reference, or entity_name of the party in the document to add the signatory to

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoName of the signatory
uuidNoDo not show to the user unless they ask for it
emailNoEmail of the signatory
party_uuidNoUUID of the party this signatory belongs to. Absent if the signatory has not been assigned to a party yet, which prevents signing from being started. Do not show to the user unless they ask for it
_entity_typeNoOnly relevant for tooling. Do not show to the user
internal_userNotrue if the signatory has a fynk user in this account
signing_orderNoThe order in which this signatory signs

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered. The description adds a genuinely useful, non-obvious behavior: when the email matches an existing account user, optional arguments are ignored and the profile populates the signatory data.

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

Conciseness4/5

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

Front-loads the verb+resource in the first sentence, then usage and the caveat. A single-bullet list is mildly awkward but every sentence carries information; nothing is wasted.

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?

With an output schema present, return values need not be explained, and all 7 parameters are documented. The description covers the usage context and the key behavioral caveat, leaving little an agent needs that is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining why the optional fields may be silently ignored (email matching an existing user), which helps an agent understand argument precedence.

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

Purpose4/5

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

States a specific verb and resource: 'Adds a signatory to a document.' This clearly distinguishes it from the delete/update signatory siblings in intent, though it does not explicitly name the alternatives to route against.

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 'Use this tool when' block gives a concrete precondition: a document with one or more parties configured, adding a signatory for one of the parties. Clear context, but no explicit when-not or pointer to update-document-signatory.

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

create-template-dynamic-fieldCreate template dynamic fieldAInspect

Create a new dynamic field on a template.

Use this tool when:

  • The user wants to add a variable / fill-in field (e.g. text, number, date, select) to a template

  • You are building up a template and need a placeholder whose value is filled in per document

IMPORTANT: this is only the first of two steps. Creating the field does NOT place it in the template content, so on its own the fill-in placeholder will not appear in the document text. To make it show up, reference the returned ref_uuid in the template body (via replace-template-content) as:

<span data-dynamic-field data-ref-uuid="<dynamic field ref_uuid>"></span>

Until it is referenced in the content the field exists but is rendered nowhere. The same two-step pattern applies to signature blocks (create-template-signature-block, then <div data-signatures><span data-signature-block data-ref-uuid="..."></span></div>).

Dynamic fields define the variable data filled in when a template is used to create a document. Each field has a type controlling what values it accepts, and a scope controlling who fills it in.

A party's name or address is never a dynamic field. Both live on the party record: add the party with create-template-party and render its details in the content with , taking data-format="address" for the address as a block and data-format="address:inline" for it on one line, as a preamble reads it. A document made from the template then follows its own parties.

select and multi_select fields require select_values (the allowed options).

The optional default value is set via value (for non-multi_select fields) or values (for multi_select fields). Construct the value string according to the field type:

  • number: the numeric value in a string, using '.' as the decimal separator -> "1234.56"

  • currency: concatenate the ISO currency code and the numeric value with a ';' -> "EUR;1000.10"

  • currency_duration: same as currency, but append another ';' followed by either monthly or yearly -> "EUR;1000.10;monthly"

  • select: one of the options from select_values -> "red"

  • multi_select: an array of the selected options in the values field -> ["red", "blue"]

  • bool: either of the strings "true" (shown as "Yes") or "false" (shown as "No")

  • duration: a PHP-compatible duration specification -> "P6D" (6 days)

  • date: the date in the format "YYYY-MM-DD" -> "2026-12-31"

  • email, text, textarea, or any type not listed above: a string -> "test@example.com"

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name of the field (max 255 characters)
typeYesControls the type of values the field accepts (e.g. "text", "number", "date", "select")
scopeNoWho fills in the field: "internal" (only your team) or "internal_and_external" (also counterparties). Defaults to "internal_and_external".
valueNoOptional default value for non-multi_select fields. Format depends on type (see tool description).
valuesNoOptional default value for multi_select fields: an array of options from select_values
questionNoOptional question or prompt shown to the user filling in this field
is_mandatoryNoWhether the field must be filled in before the document can be signed. Defaults to false.
select_valuesNoRequired for "select" and "multi_select" types: the allowed options for the field
template_uuidYesUUID of the template to add the dynamic field to

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoThe name of the field
typeNoControls the type of values that can be stored
uuidNoDo not show to the user unless they ask for it
scopeNoWho fills in the field: "internal" (only your team) or "internal_and_external" (also counterparties)
valueNoFor none-multi_select-type fields, the value of the field. Absent when the field has no value.
valuesNoFor multi_select-type fields, the value of the field. Absent when the field has no value.
questionNoThe question or prompt shown to the user for this field
ref_uuidNoA static reference identifier, allowing dynamic fields in documents to be matched their corresponding field in the document's source template. Do not show to the user unless they ask for it
currenciesNoFor currency or currency_duration fields, the allowed currency codes (e.g. ["EUR", "USD"]). Absent indicates no restriction
_entity_typeNoOnly relevant for tooling. Do not show to the user
is_mandatoryNoWhether this field must be filled in before the document can be signed
select_valuesNoWhen type is "select" or "multi_select", defines the allowed values for the field. For these types of field, ONLY these values are possible. Absent for every other type

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare the generic write profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description goes well beyond that by disclosing the critical non-obvious behavior: creating the field does not render it, and the returned ref_uuid must be referenced in the body before the placeholder appears. It also states the same two-step pattern applies to signature blocks.

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

Conciseness4/5

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

The description is long but well front-loaded (purpose first, then when-to-use, then the two-step warning, then type formatting). The signature-block and party-rendering asides are somewhat tangential to creating a dynamic field, but they do serve sibling routing, so they mostly earn their 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 9-parameter mutation tool with an output schema and full schema coverage, this description covers everything an agent needs: creation semantics, the rendering requirement, sibling boundaries, and per-type value formats. Return values are handled by the output schema and the reference to ref_uuid.

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 already 100%, but the description adds substantial semantics beyond the schema, notably the exact string construction for `value` per `type` (currency 'EUR;1000.10', currency_duration with monthly/yearly suffix, PHP duration 'P6D', date format), the `values` array for multi_select, and the fact that select/multi_select require select_values. This is meaning the schema alone does not convey.

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

Purpose5/5

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

The opening sentence names a specific verb and resource ('Create a new dynamic field on a template'), and the body explicitly differentiates the tool from siblings such as create-template-party, create-template-signature-block, and update-template-dynamic-field. An agent can tell exactly which entity this tool creates without opening the schema.

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

Usage Guidelines5/5

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

The description gives explicit 'Use this tool when' conditions (adding a variable/fill-in field while building a template) and explicitly routes agents away from it for party names/addresses, naming the correct alternatives instead. It also names replace-template-content as the required follow-up call, leaving no ambiguity about sequencing.

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

create-template-from-scratchCreate template from scratchAInspect

Create a new empty template with editable ProseMirror content.

Use this tool when:

  • The user wants to start building a new template from scratch (not from an existing PDF or template)

The new template is created empty and its content is authored in a later step. The body references parties, dynamic fields and signature blocks by ref_uuid, so those have to exist before the content can point at them. Build the template in this order:

  1. create-template-party for each contracting party.

  2. create-template-signature-block for each party that signs.

  3. create-template-dynamic-field for every value that varies per document - dates, amounts, notice periods, payment terms. A party's name or address is never one of them: both live on the party record and the content renders them from there.

  4. replace-template-content once, with a body that references all of them by their ref_uuids and wraps each clause in an ordered list node so fynk numbers it.

Authoring the content first and adding the parties, fields and signature blocks afterwards forces a second, destructive rewrite of the whole body to weave the references in, so plan them up front. This applies just as much when the content is derived from a source document such as a PDF: every filled-in blank in the source is a dynamic field unless it holds party identity, and its signature lines are signature blocks.

The locale defines the template's content language and default number formats. Never ask the user for it - a BCP 47 tag is not something they can be expected to know. Infer it from the conversation, e.g. the language the content is to be written in or a country or jurisdiction the user names, and otherwise omit it, which falls back to the account's locale.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name of the new template
localeNoBCP 47 locale tag defining the template content language and default number formats (e.g. "de-AT"). Never ask the user for this tag: infer it from the conversation, or omit it to use the account locale.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the template in fynk. Only present when your user has template editing permission
nameNoName of the template
tagsNoThe tags on the template. Tags are the account's own classification labels (e.g. relationship type, commercial significance, region), so they show which categories this account uses and can be filtered on with filter_tags. Only present when the 'tags' section is requested via the include parameter.
uuidNoUnique identifier for the template. Do not show to the user unless they ask for it
teamsNoThe teams the template is assigned to. Only present when the 'teams' section is requested via the include parameter.
localeNoLocale code, e.g. en-GB, de-AT. Prefer describing the locale in natural language (e.g. 'British English') rather than showing the raw code.
partiesNoThe contracting entities the template defines. Only present when the 'parties' section is requested via the include parameter.
publishedNoIndicates if the template is published (true) or a draft (false). Only published templates can be used by users without template management permission
conditionsNoThe template's conditions: rules over its dynamic fields deciding whether a passage of the template applies, and whether each currently holds. Use them to explain why a clause is or is not part of the template, and what would have to change to flip it. Only present when the 'conditions' section is requested via the include parameter.
created_atNoWhen the template was created. Only present when the 'timestamps' section is requested via the include parameter.
updated_atNoWhen the template was last updated. Only present when the 'timestamps' section is requested via the include parameter.
archived_atNoWhen the template was archived. Absent when the template is not archived. Only present when the 'timestamps' section is requested via the include parameter.
descriptionNoDescription of the template. Absent when the template has none. Only present when the 'details' section is requested via the include parameter.
signatoriesNoThe individual people who sign documents created from this template. Distinct from parties: a signatory often signs on behalf of a party (e.g. a business), so a person may be a signatory without appearing as a party. Only present when the 'signatories' section is requested via the include parameter.
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this template creates. Absent when the template has no type assigned
dynamic_fieldsNoThe template's dynamic fields and their values. Only present when the 'dynamic_fields' section is requested via the include parameter.
signature_typeNoThe eIDAS assurance level that will be used when signing documents created from this template. Absent when none has been chosen. Only present when the 'signing_settings' section is requested via the include parameter.
metadata_valuesNoThe template's metadata fields and their values. Only present when the 'metadata_values' section is requested via the include parameter.
signature_blocksNoThe places in the template that are signed. A block is bound either to a single signatory or to a party, in which case every signatory of that party signs it. Only present when the 'signature_blocks' section is requested via the include parameter.
sequential_signingNoWhether signatories must sign in a specific order. Only present when the 'signing_settings' section is requested via the include parameter.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only tell us this writes and is non-destructive. The description adds substantial behavioral context: the template is created empty with content authored later, ref_uuid references must pre-exist, and the key warning that authoring content first forces a destructive rewrite. This is exactly the extra context the annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the core purpose and trigger, then uses a numbered list for the workflow, so it is easy to scan. It is long for a two-parameter tool and the dynamic-field/party explanation borders on didactic, but nearly every sentence carries decision-relevant 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?

An output schema exists, so return values need no explanation. The description covers purpose, when-to-use, sibling sequencing, reference prerequisites, the destructive-rewrite pitfall, and locale inference/fallback—more than enough for an agent to call this correctly.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented, and the description's locale guidance largely restates the schema's own text. The ordering instructions don't map to any input parameter. Baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb and resource ("Create a new empty template with editable ProseMirror content") and immediately scopes it against siblings: "not from an existing PDF or template." An agent can distinguish it from create-document-from-scratch or duplicate-template without reading any schema.

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

Usage Guidelines5/5

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

Provides an explicit "Use this tool when" trigger plus a full when-not clause. It goes further and prescribes the correct sibling call order (party, signature block, dynamic field, then replace-template-content), which is actionable routing guidance.

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

create-template-partyCreate template partyAInspect

Add a party to a template.

Use this tool when:

  • The user wants to add a party (e.g. a counterparty, customer, or employer) to a template

  • You are building up a template and need parties before adding signatories or signature blocks

There are two ways to add a party:

  • Internal (saved) party: send account_party_uuid (from list-account-parties) together with reference. No other fields may be sent in this case.

  • External party: send reference and scope, and optionally entity_name and address.

The two names on a party say different things:

  • reference is the generic label for the party's role on the template (e.g. "Employer", "Customer"), and stays the same for every document made from it.

  • entity_name is the name of the legal entity itself: a company's name ("Acme GmbH") or, when the party is an individual rather than an organisation, that person's name. On a template it is usually only known for the account's own side; a counterparty's is filled in per document, so leave it out rather than inventing one.

To render the party's details inline in the template text, reference the returned ref_uuid in the body (via replace-template-content) as:

<span data-party data-ref-uuid="<party ref_uuid>" data-format="name"></span>

where data-format selects what is rendered: "name" (the party's entity/company name), "reference" (its reference label), "address", or "address:inline". A data-format is required.

Note: adding a party does not, by itself, give that party anywhere to sign. If the party is meant to sign documents created from the template, follow up with create-template-signature-block for the party — and remember that the signature block must in turn be placed in the template content (via replace-template-content) inside a signature container, <div data-signatures><span data-signature-block data-ref-uuid="..."></span></div>, before it will appear on any document.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoWhen internal_and_external, collaborators from this party may change the party's information. Required when account_party_uuid is not sent.
addressNoParty's address. Cannot be sent alongside account_party_uuid
referenceYesGeneric reference for the party's role on the template. e.g. "Counterparty", "Customer", "Employer"
entity_nameNoName of the legal entity that is party to the contract - a company's name, or a person's name when the party is an individual. Cannot be sent alongside account_party_uuid
template_uuidYesUUID of the template to add the party to
account_party_uuidNoTo add a saved account party, the uuid of a party from the list-account-parties tool. When provided, only reference may accompany it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
uuidNoIdentifier for the party - unique to the specific instance of the party. Do not show to the user unless they ask for it
addressNoThe party's address. Absent when not yet known
ref_uuidNoA static reference identifier, allowing parties in documents to be matched their corresponding party in the document's source template. Do not show to the user unless they ask for it
referenceNoA generic reference for the party. e.g. "Customer", "Employee", etc
entity_nameNoThe actual name of the party. Absent when not yet known
is_internalNoTrue if the party belongs to this account
_entity_typeNoOnly relevant for tooling. Do not show to the user

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only declare the safety profile (not read-only, not destructive, closed-world); the description adds materially more: the internal-vs-external field exclusivity rules, that adding a party grants no signing ability, and the downstream steps required before a document is affected. It does not cover permissions/auth requirements or what happens on duplicate references, so it falls short of a 5.

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

Conciseness4/5

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

Front-loaded with the action and the when-to-use list, then organized into clearly labeled subsections (two ways to add, the two names, rendering, follow-up note). It is long for a create tool and repeats some schema-level constraints, keeping it just short of a 5, but every section carries operational 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?

An output schema exists, so return values need not be described, and the description still supplies the missing workflow context: how to render the party inline via ref_uuid in replace-template-content, the valid data-format values, and the signature-block follow-up. For a 6-parameter, 2-mode mutation tool this is complete enough to call correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics the schema does not: the conceptual difference between reference (role label, stable across documents) and entity_name (legal entity, usually omitted for counterparties), plus the rule that entity_name/address 'cannot be sent' with account_party_uuid. That goes beyond a restatement of field docs.

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

Purpose5/5

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

States a specific verb+resource ('Add a party to a template') and immediately disambiguates from siblings like update-template-party, create-document-party and delete-template-party by scoping the operation to templates and to creation. An agent can identify what this does without opening the schema.

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

Usage Guidelines5/5

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

Explicit 'Use this tool when' bullets name the triggering user intent and the workflow position (parties must exist before signatories/signature blocks). It names list-account-parties as the source of account_party_uuid and create-template-signature-block as the required follow-up, so alternatives and sequencing are spelled out rather than implied.

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

create-template-signature-blockCreate template signature blockAInspect

Add a signature block to a template, bound either to one of its parties or to a single signatory.

Use this tool when:

  • The user wants a party to have a place to sign on documents created from the template

  • The user wants one specific signatory to have their own place to sign

  • You are building up a template and need to add signing slots

Pass exactly one of party_uuid or document_user_uuid. A party-bound block is signed by every signatory of that party, whoever they turn out to be on a document created from the template; a user-bound block is signed only by the signatory it names. Use get-template-info with include=["parties", "signatories"] to discover the available parties and signatories and their UUIDs.

A user-bound block requires a signatory that belongs to a party, because the block records that party alongside the signatory.

IMPORTANT: this is only the first of two steps. Creating the signature block does NOT place it in the template content, so on its own it will not appear on any document. To make it show up, reference the returned ref_uuid in the template body (via replace-template-content) from a signature container, which houses one or more blocks:

<div data-signatures data-align="left"><span data-signature-block data-ref-uuid="<signature block ref_uuid>"></span></div>

A block is always placed inside such a container, even when it is the only one.

Until it is referenced in the content the block exists but is rendered nowhere. The same two-step pattern applies to dynamic fields (create-template-dynamic-field, then <span data-dynamic-field data-ref-uuid="...">).

style (regular or minimal) and scale (50–150, percent) are optional and default to "regular" and 100.

ParametersJSON Schema
NameRequiredDescriptionDefault
scaleNoScale percentage of the signature block (50–150). Defaults to 100.
styleNoVisual style of the signature block. Defaults to "regular".
party_uuidNoUUID of the party this signature block belongs to, so that every signatory of that party signs it. Must be a party already on the template (use get-template-info to find it). Provide either this or document_user_uuid, not both.
template_uuidYesUUID of the template to add the signature block to
document_user_uuidNoUUID of the single signatory this signature block is bound to. Must be a signatory already on the template and belonging to a party (use get-template-info with include=["signatories"] to find it). Provide either this or party_uuid, not both.

Output Schema

ParametersJSON Schema
NameRequiredDescription
uuidNoDo not show to the user unless they ask for it
scaleNoScale percentage of the signature block (50–150)
styleNoVisual style of the signature block
ref_uuidNoA static reference identifier, allowing signature blocks in documents to be matched to their corresponding block in the source template. Do not show to the user unless they ask for it
party_uuidNoUUID of the party this signature block belongs to. Do not show to the user unless they ask for it
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_user_uuidNoUUID of the single signatory this signature block is bound to. Absent when the block is bound to its party instead, in which case every signatory of that party signs it. Do not show to the user unless they ask for it

TDQS

A4.6/5.0
Behavior4/5

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

Annotations declare a non-read-only, non-destructive, non-open-world mutation, and the description adds real context beyond that: the block is created but not rendered until referenced in template content, exactly one of party_uuid/document_user_uuid must be supplied, and a user-bound block requires a signatory that belongs to a party. It does not mention auth/permission requirements or idempotency, but the two-step lifecycle disclosure is unusually valuable.

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

Conciseness4/5

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

Front-loads the core action, then structures usage, constraints, and the two-step requirement clearly, with the HTML snippet earning its place. It is long and the dynamic-field analogy is arguably extra, but no sentence is filler and the ordering is logical.

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?

An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description still supplies everything an agent needs to call this correctly: prerequisites, parameter exclusivity, discovery path, and the mandatory follow-up step.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents each parameter; the baseline would be 3. The description adds meaning beyond it by contrasting party-bound (signed by every signatory of that party, whoever they turn out to be) with user-bound (signed only by the named signatory), plus the mutual-exclusion rule and the default values for style/scale.

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

Purpose5/5

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

States a specific verb and resource (add a signature block to a template) and immediately distinguishes the two binding modes, which is the key differentiator from siblings like create-template-party and create-template-dynamic-field. An agent can identify this tool without opening the schema.

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

Usage Guidelines5/5

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

Provides an explicit 'Use this tool when' list with three concrete scenarios, names the discovery alternative (get-template-info with include=["parties", "signatories"]), and points to replace-template-content as the required follow-up step. Both when-to-use and the downstream alternative are spelled out.

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

delete-account-document-typeDelete account document typeA
Destructive
Inspect

Remove a document type from the account, whether it is one of the account's own types or one of fynk's system document types.

Use this tool when:

  • The user explicitly asks to delete or remove a document type

document_type_uuid comes from list-account-document-types, and the user must have made clear which type they mean - either by naming it, or because it is the type this conversation has been about. Ask which one they mean when that is not clear, offering the candidates by name.

What removing a type does depends on what list-account-document-types reports for it. A type the account created itself, without provided_by_fynk, is deleted for good. One of fynk's own types, with provided_by_fynk, is deactivated instead: it disappears from the account but can be brought back as fynk provides it with update-account-document-type and reactivate: true. A customised type loses its customisation either way, so tell the user so before going ahead with one.

A type that documents or templates still use cannot be removed. The refusal says how many use it.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_type_uuidYesUuid of the document type to remove, from list-account-document-types

Output Schema

ParametersJSON Schema
NameRequiredDescription
deleted_document_typeNoThe account's own document type, as it was before it was deleted for good. Present only when one of the account's own types was removed
deactivated_document_typeNoOne of fynk's document types, now deactivated for this account. Present only when one of fynk's types was removed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say destructiveHint=true; the description goes far beyond by explaining that account-owned types are hard-deleted while fynk-provided types are merely deactivated and can be restored via update-account-document-type with reactivate:true. It also warns that customised types lose customisation and that in-use types are refused with a usage count.

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

Conciseness4/5

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

Front-loads the action and then organizes the rest into a usage trigger, parameter provenance, behavioral consequences, and a failure mode. Slightly long with an awkward single-item bullet list, but almost every sentence carries distinct information.

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?

An output schema exists, so return values need not be explained. The description covers prerequisites, the delete-vs-deactivate distinction, the customisation caveat, and the in-use refusal, which is everything an agent needs to call this correctly and set user expectations.

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 already documents the single uuid parameter's source, so the baseline is 3. The description adds value by tying the parameter to a required disambiguation step ('the user must have made clear which type they mean') and restating the provenance from list-account-document-types, which shapes how the agent must gather the value.

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

Purpose5/5

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

States a specific verb and resource ('Remove a document type from the account') and immediately scopes it to both account-owned types and fynk system types. An agent can distinguish this from update-account-document-type and list-account-document-types without opening any schema.

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?

Gives an explicit trigger ('The user explicitly asks to delete or remove a document type') and adds disambiguation rules: the user must have made clear which type, and if not, ask and offer candidates by name. This is real when-to-use and how-to-proceed guidance rather than vague context.

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

delete-account-metadataDelete account metadataA
Destructive
Inspect

Delete one of the account's own metadata field definitions.

Use this tool when:

  • The user explicitly asks to delete a metadata field

metadata_uuid comes from list-account-metadata, and the user must have made clear which field they mean - either by naming it, or because it is the field this conversation has been about. Ask which one they mean when that is not clear, offering the candidates by their display name.

Deleting a field also removes every value recorded for it, on every document and template in the account, and none of that can be brought back. So deleting a field the account has recorded values for is refused until the user has confirmed it: the refusal names the field and how many documents and templates hold a value for it - then repeat the call with confirmed_deleting_values_in_use: true once they have confirmed it. Send that only in answer to such a refusal, never as a matter of course.

Put the effect to the user in their own terms and ask before going ahead - "deleting Discount Rate would also remove the value 12 documents hold for it, shall I go ahead?" - rather than quoting the refusal back at them. Name the field you are about to delete either way, and never delete more than the user asked for.

Where the user wants a field to stop being filled in rather than to lose what it already holds, clear its prompt with update-account-metadata instead: that takes the field out of fynk's AI analyses and leaves the values on their documents alone.

Only the account's own fields can be deleted. fynk's system fields are provided to every account and cannot be removed, system_reference fields included - use update-account-metadata to change how one of those is configured for this account.

Deletion is refused while a bulk metadata operation is still running for the field.

ParametersJSON Schema
NameRequiredDescriptionDefault
metadata_uuidYesUUID of the metadata field to delete, as returned by list-account-metadata
confirmed_deleting_values_in_useNoOnly in answer to a refusal naming how many documents and templates hold a value for the field: true states that the user has been told what the deletion takes with it and has confirmed it. Leave it out otherwise

Output Schema

ParametersJSON Schema
NameRequiredDescription
removed_valuesNoWhat the deletion took with the field, to report back to the user
deleted_metadataNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the destructiveHint=true annotation, the description discloses the cascade (all values on every document and template are removed irreversibly), the confirmation-refusal protocol gating confirmed_deleting_values_in_use, and the refusal while a bulk metadata operation is running. This is exactly the extra behavioral context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the core action and organized with bullets/logical paragraphs that earn their place for a destructive tool, though the confirmation flow is restated across two paragraphs, adding some redundancy.

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

Completeness5/5

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

With an output schema present the description need not describe return values, and it covers the destructive, irreversible, and refusal semantics plus alternatives. Nothing an agent needs to call this correctly is missing.

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 both parameters are already documented; the description nonetheless adds protocol-level meaning for confirmed_deleting_values_in_use (send only in answer to a refusal, never as a matter of course) and clarifies provenance of metadata_uuid, exceeding the schema baseline.

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

Purpose5/5

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

The opening sentence states a precise verb+resource+scope: 'Delete one of the account's own metadata field definitions.' It immediately demarcates the boundary against siblings by noting system fields (including system_reference) cannot be deleted and routing those cases to update-account-metadata.

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

Usage Guidelines5/5

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

Explicit when-to-use ('user explicitly asks to delete a metadata field'), a required precondition (metadata_uuid comes from list-account-metadata and the field must be unambiguous), and a named alternative for the adjacent intent (clear 'prompt' via update-account-metadata to stop a field being filled without losing values).

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

delete-account-tagDelete account tagA
Destructive
Inspect

Delete an existing tag.

Use this tool when:

  • The user explicitly asks to delete a tag

The specified tag is deleted and detached from documents and templates automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
tag_uuidYesUUID of the tag to delete

Output Schema

ParametersJSON Schema
NameRequiredDescription
deleted_tagNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so safety profile is known. The description adds a useful behavioral detail beyond annotations: the tag is automatically detached from documents and templates when deleted, clarifying the side effect. It does not discuss irreversibility or permission requirements, but the added context is meaningful.

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?

Front-loaded with the purpose, then a short usage bullet, then the side effect. Three sentences with no wasted words, and the most important information is stated first.

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

Completeness4/5

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

Given the available output schema, annotations, and 100% schema description coverage, the description supplies purpose, trigger condition, and the key side effect of automatic detachment. It omits reversibility details and prerequisites, which are largely covered by destructiveHint=true, leaving only minor 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% and the single parameter tag_uuid is fully documented in the schema. The description does not add format, syntax, or lookup guidance for the UUID, so it meets the baseline of 3 when the schema carries parameter semantics.

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

Purpose5/5

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

States a specific verb and resource: 'Delete an existing tag.' This distinguishes it from sibling tools like create-account-tag, update-account-tag, list-account-tags, and delete-account-document-type by both action and resource. The side-effect sentence further confirms the account-level tag scope by mentioning detachment from documents and templates.

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 an explicit usage trigger: 'Use this tool when: - The user explicitly asks to delete a tag.' It lacks when-not guidance and does not name an alternative tool such as update-account-tag, but the context for use is clear.

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

delete-account-teamDelete account teamA
Destructive
Inspect

Delete an existing team.

Use this tool when:

  • The user explicitly asks to delete a team

The specified team is deleted and detached from documents and templates automatically. Deletion will fail if the team is assigned as an approver on any template.

ParametersJSON Schema
NameRequiredDescriptionDefault
team_uuidYesUUID of the team to delete

Output Schema

ParametersJSON Schema
NameRequiredDescription
deleted_teamNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new behavior: deletion auto-detaches the team from documents and templates, and it will fail if the team is an approver on any template — a meaningful precondition beyond the annotations.

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

Conciseness5/5

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

Front-loaded with the verb+resource, then a scannable trigger bullet, then the side-effect and failure caveats. No filler sentences; every clause carries information.

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?

An output schema exists, so return values need not be explained. For a destructive, single-parameter tool the description covers trigger, cascading side effects, and the failure precondition — an agent has everything needed to call it correctly.

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

Parameters3/5

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

Only one parameter (team_uuid) with 100% schema description coverage, so the schema fully documents the input. The description adds no format or syntax detail beyond what the schema provides, making 3 the correct baseline.

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

Purpose4/5

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

"Delete an existing team" states a specific verb and resource, and the delete verb clearly separates it from the create-account-team and update-account-team siblings. It stops short of explicitly naming an alternative, but an agent will not confuse this with any other sibling.

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

Usage Guidelines4/5

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

The "Use this tool when: the user explicitly asks to delete a team" bullet gives an explicit positive trigger condition, and the last sentence discloses a precondition (fails if team is an approver on a template). No explicit when-not or named alternative, but the context is clear.

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

delete-document-signatoryDelete document signatoryA
Destructive
Inspect

Remove a signatory from a document.

Use this tool when:

  • A signatory was added in error or should no longer sign and the document has not yet been signed by them

Identify the signatory to remove by document_uuid plus signatory_email. Removal may fail if the document's stage no longer permits signatory changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_uuidYesUUID of the document to remove the signatory from. If you don't already have the document's UUID, use the list-documents tool to find it.
signatory_emailYesEmail address of the signatory to remove

Output Schema

ParametersJSON Schema
NameRequiredDescription
removed_signatoryNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that by disclosing a failure mode: removal may fail if the document's stage no longer permits signatory changes. It does not say whether removal is reversible or how the failure surfaces, keeping it below a 5.

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?

One lead sentence for purpose, then a tightly scoped when-block and a one-line failure caveat. Zero filler, and the core action is front-loaded before any conditions.

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

Completeness5/5

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

With an output schema present, return values need not be explained, and annotations carry the safety profile. Purpose, triggering condition, identifiers, and the main failure mode are all covered for a simple two-parameter deletion tool.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are fully documented in the schema, including the pointer to list-documents for finding the UUID. The description only restates that identification uses document_uuid plus signatory_email, adding no syntax or format 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.

Purpose4/5

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

States a specific verb and resource: 'Remove a signatory from a document.' An agent can distinguish this from create-document-signatory and update-document-signatory by the verb alone. It stops short of explicitly contrasting with update-document-signatory, which handles the modify case, so it falls short of a 5.

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

Usage Guidelines4/5

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

The 'Use this tool when' block gives a concrete trigger (signatory added in error or should no longer sign) plus a hard precondition (they have not yet signed). This effectively encodes a when-not boundary. It never names an alternative tool or states what to do instead when the signatory has already signed.

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

delete-template-dynamic-fieldDelete template dynamic fieldA
Destructive
Inspect

Delete a dynamic field from a template.

Use this tool when:

  • The user explicitly asks to remove a dynamic field (a variable / fill-in field) from a template

A dynamic field cannot be deleted while it is referenced by a condition or a metadata value on the template; remove those references first. Use get-template-info with include=["dynamic_fields"] to discover the dynamic fields on a template and their UUIDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_uuidYesUUID of the template the dynamic field belongs to
dynamic_field_uuidYesUUID of the dynamic field to delete (use get-template-info with include=["dynamic_fields"] to find it)

Output Schema

ParametersJSON Schema
NameRequiredDescription
deleted_dynamic_fieldNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds important behavioral context: the deletion is blocked while the field is referenced by a condition or metadata value. This is exactly the kind of dependency constraint an agent needs before invoking a destructive delete.

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

Conciseness5/5

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

The description is front-loaded with the purpose, then a short when-to-use bullet, then the critical deletion constraint and discovery hint. 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 two-parameter destructive delete with an output schema and clear annotations, the description covers purpose, usage condition, prerequisite, and discovery path. Nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both UUID parameters are already documented in the schema. The description repeats the get-template-info hint for finding a dynamic field UUID but adds no new syntax or semantic detail beyond the schema.

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

Purpose5/5

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

The description states a specific verb and resource: delete a dynamic field from a template. It clearly distinguishes this operation from sibling create/update/delete tools for other template components.

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

Usage Guidelines5/5

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

It explicitly says when to use the tool (user asks to remove a dynamic field) and gives a key precondition: fields referenced by conditions or metadata values cannot be deleted until references are removed. It also points to get-template-info as the discovery step.

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

delete-template-partyDelete template partyA
Destructive
Inspect

Delete a party from a template.

Use this tool when:

  • The user explicitly asks to remove a party from a template

A party cannot be deleted while it still has signature blocks bound to it. Delete those signature blocks first with delete-template-signature-block. Use get-template-info to discover the parties on a template and their UUIDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
party_uuidYesUUID of the party to delete (use get-template-info to find it)
template_uuidYesUUID of the template the party belongs to

Output Schema

ParametersJSON Schema
NameRequiredDescription
deleted_partyNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation/safety profile is covered by structure. The description adds genuinely non-structured context: the referential dependency on signature blocks and the required deletion order. It does not say whether the deletion is permanent or recoverable, which keeps it short of a 5.

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

Conciseness4/5

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

The destructive action and its scope come first, followed by a structured 'Use this tool when' block. The bulleted list holds a single item and the newline-wrapped sentences are a bit verbose, but nothing is misleading or wasted enough to penalize further.

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 destructive delete tool with an output schema, the description covers everything an agent needs: the trigger, the discovery path (get-template-info), and the blocking dependency with its resolution tool. Return values are handled by the output schema, so nothing material is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both UUIDs are already documented in the schema; the description's pointer to get-template-info largely restates the party_uuid field description. This is the baseline 3 — adequate, but no meaning is added 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 opening sentence states a specific verb and resource ('Delete a party from a template'), scoping it to templates as opposed to documents. An agent can distinguish it from delete-template-signature-block and delete-document-signatory from the text alone.

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 enumerates the trigger condition ('The user explicitly asks to remove a party from a template') and a hard precondition: parties with bound signature blocks cannot be deleted and must be cleared first. It names the exact alternative (delete-template-signature-block) for that prerequisite.

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

delete-template-signature-blockDelete template signature blockA
Destructive
Inspect

Delete a signature block from a template.

Use this tool when:

  • The user explicitly asks to remove a signature block (a party's signing slot) from a template

The party the signature block belonged to remains on the template; only the signing slot is removed. Use get-template-info with include=["signature_blocks"] to discover the signature blocks on a template and their UUIDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_uuidYesUUID of the template the signature block belongs to
signature_block_uuidYesUUID of the signature block to delete (use get-template-info with include=["signature_blocks"] to find it)

Output Schema

ParametersJSON Schema
NameRequiredDescription
deleted_signature_blockNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior beyond that: the party survives the operation and only the signing slot is removed, which prevents an agent from assuming a cascading delete. It stops short of saying whether the deletion is reversible or needs confirmation.

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

Conciseness5/5

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

Four short lines, front-loaded with the action, then the condition, then the key semantic caveat. Nothing is padded, and the most decision-relevant facts appear first.

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?

An output schema exists, so return values need no explanation. With the action, trigger condition, side-effect scope, and UUID discovery path all present, an agent has everything needed to call this destructive tool correctly.

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

Parameters3/5

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

Schema coverage is 100% with both parameters described, including the discovery hint for signature_block_uuid, so the schema already carries the load. The description repeats the same discovery instruction rather than adding syntax, format, or scoping nuance, so 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?

The first sentence gives a specific verb+resource ('Delete a signature block from a template') and the follow-up clarifies it deletes a signing slot, not the party — which cleanly separates it from delete-template-party and update-template-signature-block in the sibling list.

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

Usage Guidelines4/5

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

It states an explicit triggering condition ('The user explicitly asks to remove a signature block') and routes the agent to get-template-info with include=["signature_blocks"] for discovery. It does not, however, name the closest alternative (delete-template-party / update-template-signature-block) as a when-not choice, so the exclusion side is implied rather than stated.

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

detach-account-users-from-teamDetach account users from teamA
Destructive
Inspect

Remove one or more account users from a team.

Use this tool when:

  • The user asks to remove people from a team

Only the account users listed in account_user_uuids are removed; other team members stay attached. Passing a user that is not on the team is a no-op.

ParametersJSON Schema
NameRequiredDescriptionDefault
team_uuidYesUUID of the team to remove members from
account_user_uuidsYesUUIDs of the account users to remove from the team

Output Schema

ParametersJSON Schema
NameRequiredDescription
iconNoIcon identifier for the team (e.g. "UserGroupIcon")
nameNoName of the team
uuidNoIdentifier for the team. Do not show to the user unless they ask for it
_entity_typeNoOnly relevant for tooling. Do not show to the user

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered structurally. The description adds real behavioral context beyond that: only the listed users are affected, other members remain attached, and a non-member UUID is a no-op (idempotency). It is silent on permission requirements and downstream effects, keeping it out of the top band.

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 short sentences, front-loaded with the action, followed by a trigger condition and the key scope caveat. Every sentence carries information; the single-item bullet is slightly formal but costs almost nothing.

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 destructive, two-parameter operation with full schema coverage, annotations, and an output schema, the description covers scope and no-op semantics well. It omits any note on required permissions or side effects of removing a member, which would be the remaining useful detail.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented, and the description merely restates that account_user_uuids holds the users to remove. No format, ordering, or batch-size semantics are added. Baseline 3 is correct when the schema carries the burden.

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

Purpose4/5

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

The description gives a specific verb and resource ("Remove one or more account users from a team") that is instantly distinguishable from the inverse sibling attach-account-users-to-team. It does not explicitly name a sibling or scope boundary, so it stops just short of the top band.

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?

"Use this tool when: The user asks to remove people from a team" gives a concrete trigger condition, which is more than most definitions offer. It stops at 4 because it names no exclusion conditions or alternatives (e.g., how this differs from deleting a team or updating a team).

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

duplicate-documentDuplicate documentAInspect

Create a new draft document as a copy of an existing document.

Use this tool when:

  • The user wants to duplicate or copy a document, e.g. to reuse a previous contract as the starting point for a new one with a different counterparty

  • A new agreement should start from an existing document rather than from a template

The copy takes over the source document's content, parties, signatories, dynamic field values, metadata values, attachments, teams, tags, document type and template link. The new document always starts in the draft stage, whatever stage the source document is in, and a source document that is in signing or done is copied with its content as it was before signing started.

Change what differs in the new document afterwards with the update-* tools, e.g. update-document-party for the counterparty or update-document-dynamic-fields for amounts and dates.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe name of the new document. If omitted, the source document's name followed by " (copy)" is used
document_uuidYesUUID of the document to duplicate. If you don't already have the document's UUID, use the list-documents tool to find it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
tagsNoThe tags on the document. Tags are the account's own classification labels (e.g. relationship type, commercial significance, region), so they show which categories this account uses and can be filtered on with filter_tags.
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
teamsNoThe teams the document is assigned to.
localeNoLocale code, e.g. en-GB, de-AT. Absent when the document has none set. Prefer describing the locale in natural language (e.g. 'British English') rather than showing the raw code.
originNoHow the document was created.
partiesNoThe contracting entities on the document.
conditionsNoThe document's conditions: rules over its dynamic fields deciding whether a passage of the document applies, and whether each currently holds. Use them to explain why a clause is or is not part of the document, and what would have to change to flip it.
created_atNoWhen the document was created.
updated_atNoWhen the document was last updated.
archived_atNoWhen the document was archived. Absent when the document is not archived.
signatoriesNoThe individual people who sign the document. Distinct from parties: a signatory often signs on behalf of a party (e.g. a business), so a person may be a signatory without appearing as a party.
_entity_typeNoOnly relevant for tooling. Do not show to the user
summary_textNoA summary of the document content. Absent when the document has no summary.
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned
dynamic_fieldsNoThe document's dynamic fields and their values.
signature_typeNoeIDAS assurance level used when signing the document. Absent when none has been chosen.
workflow_stateNoGives an indication of which stage transitions, etc are possible to perform on this document. This object is technical state, not display content: when relaying it to the user, always render it as natural-language prose and never echo raw field names or snake_case values (e.g. say 'signing cannot be started yet because not every signature block has been assigned to a signatory' instead of mentioning 'can_start_signing' or 'signature_block_signatory').
metadata_valuesNoThe document's metadata fields and their values.
signature_blocksNoThe places in the document that are signed. A block is bound either to a single signatory or to a party, in which case every signatory of that party signs it. Every signatory needs a block covering them before signing can be started.
sequential_signingNoWhen true, signatories sign one at a time, in ascending order of their signing_order.
source_template_uuidNoUUID of the template the document was created from. Absent when it was not created from a template.
external_signatory_invitation_messageNoText shown in the email inviting external signatories to sign. Absent when no message is set.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare the non-destructive, non-read-only, non-open-world profile. The description adds substantial context beyond that: it enumerates exactly what is inherited (content, parties, signatories, dynamic field values, metadata, attachments, teams, tags, document type, template link) and discloses the non-obvious stage behavior (always starts in draft; signing/done sources copy pre-signing content). This is the kind of behavioral detail an agent cannot infer from structured fields.

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

Conciseness5/5

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

The core action is front-loaded in the opening sentence, followed by usage triggers, then the inheritance/stage semantics, then remediation pointers. Every sentence earns its place with no redundancy or filler.

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

Completeness5/5

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

With an output schema present, return values need no explanation, and the description covers the remaining gaps: when to use it, what gets copied, and the resulting stage. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (including the name fallback to ' (copy)') are already documented in the schema. The description adds no parameter syntax or format information beyond what the schema provides, so the 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?

The first sentence states a specific verb ('Create') and resource ('a new draft document as a copy of an existing document'), and the intent is immediately distinguishable from sibling creation tools like create-document-from-scratch or create-document-from-template. An agent knows exactly what operation this performs without opening the schema.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use scenarios ('reuse a previous contract as the starting point', 'start from an existing document rather than from a template') and names the follow-up alternative tools (update-document-party, update-document-dynamic-fields). It even draws the boundary against template-based creation, which is the closest sibling ambiguity.

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

duplicate-templateDuplicate templateAInspect

Create a new template as a copy of an existing template.

Use this tool when:

  • The user wants to duplicate or copy a template, e.g. to build a variant of an existing contract for another jurisdiction or business line

  • A new template should start from an existing one rather than from scratch

The copy takes over the source template's content, parties, signatories, signature blocks, dynamic fields, conditions, metadata values, attachments, teams, tags, document type, locale and published state. Documents already created from the source template stay linked to the source.

Change what differs in the new template afterwards with the template tools, e.g. update-template-party, update-template-dynamic-field or replace-template-content. replace-template-content only writes a draft, so a copy of a published template has to be unpublished with set-template-published-state before its body can be rewritten.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe name of the new template. If omitted, the source template's name followed by " (copy)" is used
template_uuidYesUUID of the template to duplicate. Use list-templates to find it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the template in fynk. Only present when your user has template editing permission
nameNoName of the template
tagsNoThe tags on the template. Tags are the account's own classification labels (e.g. relationship type, commercial significance, region), so they show which categories this account uses and can be filtered on with filter_tags.
uuidNoUnique identifier for the template. Do not show to the user unless they ask for it
teamsNoThe teams the template is assigned to.
localeNoLocale code, e.g. en-GB, de-AT. Prefer describing the locale in natural language (e.g. 'British English') rather than showing the raw code.
partiesNoThe contracting entities the template defines.
publishedNoIndicates if the template is published (true) or a draft (false). Only published templates can be used by users without template management permission
conditionsNoThe template's conditions: rules over its dynamic fields deciding whether a passage of the template applies, and whether each currently holds. Use them to explain why a clause is or is not part of the template, and what would have to change to flip it.
created_atNoWhen the template was created.
updated_atNoWhen the template was last updated.
archived_atNoWhen the template was archived. Absent when the template is not archived.
descriptionNoDescription of the template. Absent when the template has none.
signatoriesNoThe individual people who sign documents created from this template. Distinct from parties: a signatory often signs on behalf of a party (e.g. a business), so a person may be a signatory without appearing as a party.
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this template creates. Absent when the template has no type assigned
dynamic_fieldsNoThe template's dynamic fields and their values.
signature_typeNoThe eIDAS assurance level that will be used when signing documents created from this template. Absent when none has been chosen.
metadata_valuesNoThe template's metadata fields and their values.
signature_blocksNoThe places in the template that are signed. A block is bound either to a single signatory or to a party, in which case every signatory of that party signs it.
sequential_signingNoWhether signatories must sign in a specific order.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false, destructiveHint=false, openWorldHint=false. The description adds substantial context beyond that: the full list of what is copied (content, parties, signatories, signature blocks, dynamic fields, conditions, metadata, attachments, teams, tags, document type, locale, published state), the important non-destructive fact that existing documents stay linked to the source, and the published-state constraint on replace-template-content.

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

Conciseness4/5

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

Front-loaded with the core action, then well-organized bullets and a compact paragraph on copy semantics followed by the post-duplication edit path. Dense but every sentence carries information; the last sentence on replace-template-content/unpublish is a slightly tangential prerequisite note but still actionable.

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 an output schema exists, return values need not be explained. With annotations plus a full parameter schema plus this description covering copy scope, non-destructive linkage behavior, and the follow-up workflow, an agent has everything needed to invoke and sequence the call correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (name, template_uuid) are already fully documented, including the ' (copy)' default for name and the list-templates pointer. The description adds no parameter-level detail beyond what the schema provides, so the 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?

States a specific verb and resource ('Create a new template as a copy of an existing template') and immediately scopes it against siblings like create-template-from-scratch ('rather than from scratch') and implicitly duplicate-document (templates vs documents). An agent can tell exactly what this produces.

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

Usage Guidelines5/5

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

Explicit 'Use this tool when' bullets give the trigger conditions (duplicating/copying a template, building a jurisdiction or business-line variant, starting from an existing template). It goes further and routes the agent onward to a named alternative workflow — update-template-party, update-template-dynamic-field, replace-template-content — and flags the prerequisite/unpublish step.

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

find-automationsFind automationsA
Read-only
Inspect

Search the account's automations by name.

Use this tool when:

  • You need an automation's UUID to filter list-documents by automation

  • You want to find automations matching a search term

Returns automations whose name matches the query, most recently created first. Results are capped, so narrow the query if you don't find what you're looking for.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of automations to return (default and max: 25)
queryYesSearch term matched against automation names (case-insensitive, min 3 characters)

Output Schema

ParametersJSON Schema
NameRequiredDescription
automationsNo

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, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior: case-insensitive matching, most-recently-created-first ordering, and a hard result cap with advice to narrow the query.

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?

Front-loaded purpose followed by scannable bullets and a returns note; every sentence carries distinct information with no repetition.

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?

An output schema exists so return shape need not be explained, and the description still covers ordering and the result cap. It is close to complete for a small filtered-search tool, with only explicit exclusion guidance missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the query and limit parameters are already documented with min/max and case-sensitivity. The description reinforces name matching and the cap but adds no syntax or format detail beyond the schema, making the baseline 3 correct.

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

Purpose5/5

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

The opening sentence names a specific verb (Search) and resource (the account's automations) with the match dimension (by name). An agent can distinguish this scanning tool from list-documents and the various create/update/delete 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?

Two explicit 'use this tool when' bullets give concrete triggers, including the downstream need for a UUID to filter list-documents. There is no explicit when-not guidance, but no sibling tool competes for the same purpose, so routing risk is low.

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

find-document-usersFind document usersA
Read-only
Inspect

Search the account's document users (individual people who have access to documents) by name or email.

Use this tool when:

  • You need a person's name to filter list-documents by document user

  • You want to find document users matching a search term

Searches first name, last name and email. A two-word query is matched as firstname + lastname. Results are capped and de-duplicated by name, so narrow the query if you don't find who you're looking for.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of document users to return (default and max: 25)
queryYesSearch term matched against document user first name, last name and email (case-insensitive, min 3 characters). A two-word query is matched as firstname + lastname

Output Schema

ParametersJSON Schema
NameRequiredDescription
document_usersNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: fields searched, the two-word firstname+lastname rule, and the important constraint that results are capped and de-duplicated by name with a recommendation to narrow the query. It stops short of describing pagination or ordering, so a 4 rather than a 5.

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

Conciseness4/5

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

Front-loads the purpose in one sentence, then uses a short bulleted usage block and a final paragraph on search semantics. Every sentence carries information, though the bullet list format is slightly more fragmented than a tight prose description would be.

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?

An output schema exists so return values need no explanation, and the description covers the remaining agent-relevant questions: what is searched, how multi-word queries are interpreted, why results may be missing (capping/de-duplication), and what to do about it. Complete for a read-only lookup tool with full schema coverage.

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% – both 'query' and 'limit' are fully documented in the schema, including the min-3-character rule, case-insensitivity and the 25 cap. The description restates much of the same matching semantics rather than adding new syntax or format guidance, so the 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?

States a specific verb and resource ('Search the account's document users') and immediately scopes it with a parenthetical definition that separates document users (people with access to documents) from the account users and external parties covered by sibling tools like list-account-users and find-external-parties.

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?

Has an explicit 'Use this tool when:' block naming two concrete triggers (needing a name to filter list-documents by document user, and searching for matching document users), which names the downstream tool the results feed into. Nothing about when to reach for this versus the other find/list siblings is left to inference.

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

find-external-partiesFind external partiesA
Read-only
Inspect

Search the account's external parties (people and businesses that appear on documents) by name.

External parties are the counterparties on documents — the entities on the OTHER side of an agreement, which do not belong to the account. They are distinct from account parties, which are the account's own entities (the company the user belongs to and its subsidiaries / group companies). Phrasing like "our", "we", "us", "my company" or "our subsidiary" refers to an account party, not an external party — in that case use list-account-parties instead.

Use this tool when:

  • You need a party's name to filter list-documents by external party

  • You want to find parties matching a search term

Matches the party's name (entity_name). Results are capped and de-duplicated by name, so narrow the query if you don't find who you're looking for. If you are looking for a named entity and it does not appear here, it may be an account party (the account's own side) instead — try list-account-parties before concluding it does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of external parties to return (default and max: 25)
queryYesSearch term matched against external party names (case-insensitive, min 3 characters)

Output Schema

ParametersJSON Schema
NameRequiredDescription
external_partiesNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds real value beyond them: results are capped and de-duplicated by name, and the agent is told to narrow the query or try list-account-parties if nothing is found. It does not discuss failure/empty-result semantics beyond that fallback, keeping it out of the top band.

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

Conciseness4/5

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

Front-loaded with the core action, then disambiguation, then usage bullets, then a fallback note — a logical ordering with no wasted framing. It runs somewhat long and restates the account-party contrast twice, which keeps it from a 5.

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 two-parameter read-only lookup with an output schema and full annotation coverage, the description supplies everything an agent needs: what it searches, what it excludes, the cap on results, and which sibling to try next. No behavioral or routing question is left open.

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% for both parameters (query and limit, including min/max lengths), so the schema already carries the detail. The description only adds that matching is against the underlying entity_name field, which is marginally useful but largely duplicative. 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?

States a specific verb and resource ('Search the account's external parties ... by name') and immediately contrasts it with the sibling list-account-parties. An agent can tell exactly what this returns and how it differs from the nearest alternative without opening any schema.

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

Usage Guidelines5/5

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

Provides an explicit 'Use this tool when' list (need a party name to filter list-documents; want to find matching parties) plus a when-not rule with a named alternative (phrasing like 'our'/'we' means an account party, use list-account-parties). It even prescribes a fallback order before concluding a party does not exist.

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

find-importsFind importsA
Read-only
Inspect

Search the account's imports by name.

Use this tool when:

  • You need an import's UUID to filter list-documents by import

  • You want to find imports matching a search term

Returns imports whose name matches the query, most recently created first. Results are capped, so narrow the query if you don't find what you're looking for.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of imports to return (default and max: 25)
queryYesSearch term matched against import names (case-insensitive, min 3 characters)

Output Schema

ParametersJSON Schema
NameRequiredDescription
importsNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the description is not the sole carrier of safety context. It adds genuine behavior beyond that: result ordering (most recently created first), a hard result cap, and the remediation advice to narrow the query. It stops short of describing auth requirements or pagination, which keeps it out of the top score.

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

Conciseness4/5

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

Front-loads the one-line purpose, then uses scannable bullets for usage and a short paragraph for return behavior. Slightly redundant between the opening line and the second bullet, but there is no filler or repetition of schema fields.

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

Completeness5/5

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

An output schema exists, so return-shape explanation is not required, yet the description still supplies the ordering and cap semantics that matter for interpreting results. For a two-parameter read-only search, nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, with both query (case-insensitive, min 3 chars, max 255) and limit (default/max 25) fully documented in the schema. The description only restates 'matched against import names' at a high level, adding no syntax or semantic detail beyond the schema – the baseline of 3 is correct.

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

Purpose5/5

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

States a specific verb (Search) and resource (account's imports) with the matching field (by name). It also distinguishes itself from list-documents by explaining the UUID hand-off, so an agent can tell the two apart without reading schemas.

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

Usage Guidelines5/5

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

Explicit 'use this tool when' bullets name the two concrete triggering scenarios, including the downstream chaining case (getting an import UUID to filter list-documents). When-to-use is unambiguous.

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

get-account-infoGet account infoA
Read-only
Inspect

Get information about the current fynk account.

Use this tool when:

  • You need details about the active account (e.g. default document locale, signature settings) before tailoring a response

  • You are tailoring guidance to the account's business, and need what it reported about itself when signing up (industry, company size, the department the person who signed up works in)

For information about the current user, use get-user-info

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
localeNoDefault account language, e.g. en-GB, de-AT. This language will be preselected for newly created documents/templates. fynk will generate AI summaries in this language. Prefer describing the locale in natural language (e.g. 'British English') rather than showing the raw code.
statusNoThe account's subscription status. May fence access to certain app features
created_atNoWhen the account was created
_entity_typeNoOnly relevant for tooling. Do not show to the user
sso_enforcedNoIf true, account users must authenticate via SSO rather than logging in with a password
trial_ends_atNoIf the account is in 'trial' status, when the trial ends and the account reverts to 'free'
onboarding_profileNoWhat the account told us about its company when signing up. Self-reported and unverified - use it to tailor guidance, not as authoritative facts about the company. Fields that are not set are omitted
default_comment_scopeNoControls the default visibility of comments and proposals in documents
default_signature_typeNoThe default eIDAS assurance level to use when signing documents. May be overridden on individual documents
finished_onboarding_atNoWhen the account completed the initial onboarding flow. Absent if onboarding has not yet been finished
require_team_assignmentNoWhen true, all documents, imports, and automations must have at least one team assigned
auto_apply_ai_analysis_by_defaultNoWhen true, AI analysis results will be automatically applied when importing documents
two_factor_authentication_enabledNoIf true, users in the account must enable 2FA and use it when logging in
require_template_for_document_creationNoWhen true, a template must be selected when creating a document from scratch or uploading a PDF to sign

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context by enumerating what kind of data the account reports (locale, signature settings, industry, company size, department). It does not mention authentication or rate limits, but for a low-risk read-only tool this is a minor gap.

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 first sentence front-loads the purpose, followed by a tightly scoped bullet list of use cases and a final routing note. Every sentence earns its place, with no redundant explanation.

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?

An output schema exists, so the description need not explain return values. Combined with the clear purpose, usage conditions, sibling distinction, and zero-parameter schema, the definition gives the agent everything needed to invoke it 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?

The tool takes zero parameters, so per the rubric the baseline is 4. The description correctly does not invent parameter semantics, and the empty schema is self-explanatory.

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

Purpose5/5

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

The description states a specific verb and resource: retrieving information about the current fynk account. It explicitly distinguishes itself from the sibling tool get-user-info, telling the agent exactly which resource each returns. An agent can select correctly without opening the schema.

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

Usage Guidelines5/5

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

It provides explicit when-to-use conditions: before tailoring a response with account defaults, or when tailoring guidance using the account's self-reported business details. It also names the alternative (get-user-info) and the condition that selects it, leaving no routing ambiguity.

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

get-document-infoGet document infoA
Read-only
Inspect

Gets information about a document.

Use this tool when:

  • You have a document's UUID and want to know more details about it. e.g. who is signing it, what values its dynamic fields or metadata have, etc

Called with no include parameter, returns the document's parties, teams, details, signatories, signing settings and workflow state. Use include to name the sections you want instead - among them dynamic_fields, conditions, metadata_values, signature_blocks, summary_text, tags and timestamps - and the response carries exactly those, so a question about one aspect of a document costs one section rather than the whole document.

This tool covers a single document. Whenever possible avoid calling it once per document to gather the same information about several documents: list-documents returns parties, teams, tags and timestamps for a whole list via its include parameter, and specific metadata values for a whole list via its include_metadata parameter. Pass the UUIDs you already have to its filter_document_uuids parameter to get exactly the documents you are interested in.

The default response lists both the document's parties (the contracting entities, frequently organizations) and its signatories (the individual people who sign). These are distinct: a person often signs on behalf of a party (e.g. a business) without appearing as a party, so consider the signatories — not just the parties — when answering whether a specific named person is involved in or signs a document.

The dynamic_field_visibility argument narrows the dynamic_fields section to the fields that appear in the document itself, or to the ones that do not. A field belonging to a document is not necessarily written into it: fields get added and then never placed in the text, or the passage that referred to one gets rewritten, leaving a value no reader ever sees. Not every not_visible field is idle, though. Some exist only to drive a condition deciding which clauses the document shows, so they shape the contract without appearing in it (you can use the "conditions" include option to see which fields drive which conditions). Others sit inside a passage that a currently inactive condition removes, so they would appear if that condition flipped. Use "visible" when the question is about what the contract currently says. dynamic_field_visibility has no effect unless dynamic_fields is among the returned sections.

The workflow_state object - in the response by default, and requestable via include alongside other sections - describes what can currently be done with the document: whether the signing process can be started at all, which stages the document can be moved on to and everything standing in the way of each of them (stage_transitions, whose blockers say why), whether the requesting user can start signing, and — when a checkpoint blocks progress — who still needs to approve. Use it to answer questions like "why can't I sign this yet?", "what is blocking this document?" or "who still has to sign?", answering with the full list rather than one problem at a time. It is technical state, not display content: relay it to the user as natural-language prose and never echo raw field names or snake_case values.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoThe sections the response carries, on top of the document's identity (uuid, name, stage, document type, url) which it always carries. Naming sections means exactly those: ask for one section and you pay for one, rather than for the whole document. If omitted, these are returned: parties, teams, details, signatories, signing_settings, workflow_state.
document_uuidYesUUID of the document to get information about. If you don't already have the document's UUID, use the list-documents tool to find it.
dynamic_field_visibilityNoNarrows the dynamic_fields section to the fields that appear in the document's content ("visible") or to the ones that do not ("not_visible"). Defaults to "all", which returns every field. Only has an effect when dynamic_fields is among the returned sections.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
tagsNoThe tags on the document. Tags are the account's own classification labels (e.g. relationship type, commercial significance, region), so they show which categories this account uses and can be filtered on with filter_tags. Only present when the 'tags' section is requested via the include parameter.
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
teamsNoThe teams the document is assigned to. Only present when the 'teams' section is requested via the include parameter.
localeNoLocale code, e.g. en-GB, de-AT. Absent when the document has none set. Prefer describing the locale in natural language (e.g. 'British English') rather than showing the raw code. Only present when the 'details' section is requested via the include parameter.
originNoHow the document was created. Only present when the 'details' section is requested via the include parameter.
partiesNoThe contracting entities on the document. Only present when the 'parties' section is requested via the include parameter.
conditionsNoThe document's conditions: rules over its dynamic fields deciding whether a passage of the document applies, and whether each currently holds. Use them to explain why a clause is or is not part of the document, and what would have to change to flip it. Only present when the 'conditions' section is requested via the include parameter.
created_atNoWhen the document was created. Only present when the 'timestamps' section is requested via the include parameter.
updated_atNoWhen the document was last updated. Only present when the 'timestamps' section is requested via the include parameter.
archived_atNoWhen the document was archived. Absent when the document is not archived. Only present when the 'timestamps' section is requested via the include parameter.
signatoriesNoThe individual people who sign the document. Distinct from parties: a signatory often signs on behalf of a party (e.g. a business), so a person may be a signatory without appearing as a party. Only present when the 'signatories' section is requested via the include parameter.
_entity_typeNoOnly relevant for tooling. Do not show to the user
summary_textNoA summary of the document content. Absent when the document has no summary. Only present when the 'summary_text' section is requested via the include parameter.
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned
dynamic_fieldsNoThe document's dynamic fields and their values. Only present when the 'dynamic_fields' section is requested via the include parameter.
signature_typeNoeIDAS assurance level used when signing the document. Absent when none has been chosen. Only present when the 'signing_settings' section is requested via the include parameter.
workflow_stateNoGives an indication of which stage transitions, etc are possible to perform on this document. This object is technical state, not display content: when relaying it to the user, always render it as natural-language prose and never echo raw field names or snake_case values (e.g. say 'signing cannot be started yet because not every signature block has been assigned to a signatory' instead of mentioning 'can_start_signing' or 'signature_block_signatory'). Only present when the 'workflow_state' section is requested via the include parameter.
metadata_valuesNoThe document's metadata fields and their values. Only present when the 'metadata_values' section is requested via the include parameter.
signature_blocksNoThe places in the document that are signed. A block is bound either to a single signatory or to a party, in which case every signatory of that party signs it. Every signatory needs a block covering them before signing can be started. Only present when the 'signature_blocks' section is requested via the include parameter.
sequential_signingNoWhen true, signatories sign one at a time, in ascending order of their signing_order. Only present when the 'signing_settings' section is requested via the include parameter.
source_template_uuidNoUUID of the template the document was created from. Absent when it was not created from a template. Only present when the 'details' section is requested via the include parameter.
external_signatory_invitation_messageNoText shown in the email inviting external signatories to sign. Absent when no message is set. Only present when the 'signing_settings' section is requested via the include parameter.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already establish read-only, non-destructive, closed-world behavior. The description adds substantial extra context: the default returned sections, workflow_state semantics and how to relay them, the parties-vs-signatories distinction, and the nuanced meaning of dynamic_field_visibility including inactive-condition fields.

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

Conciseness3/5

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

The purpose is front-loaded, but the description is very long and dense for a three-parameter tool. Several passages, especially the dynamic_field_visibility explanation, are expanded well beyond what is needed to select and invoke the tool.

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?

An output schema exists, so the description need not explain return values. It nevertheless provides the cross-tool routing, default-section behavior, and interpretation guidance needed to use this complex single-document tool correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description still adds meaning by framing include as a cost-control mechanism, listing the default sections, and clarifying that dynamic_field_visibility has no effect unless dynamic_fields is among the returned sections.

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

Purpose5/5

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

States a specific verb and resource ('Gets information about a document') and immediately distinguishes the single-document scope from the list-documents sibling for multi-document needs. An agent can identify the tool's role without opening the schema.

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?

Gives explicit when-to-use conditions (you have a document UUID and need more details) and when-not/alternative guidance (avoid calling once per document; use list-documents with filter_document_uuids and include_metadata for several documents). It also explains how include and dynamic_field_visibility should be applied.

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

get-latest-document-pdfGet latest document PDF download URLA
Read-only
Inspect

Get a download URL for the latest revision of a document as a PDF.

Use this tool when:

  • The user wants to download the current state of a document as a PDF

  • You need a PDF link to share with the user for review

Returns the URL as plain text. The URL is short-lived; fetch a new one if it expires before download.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_uuidYesUUID of the document to fetch the PDF for. If you don't already have the document's UUID, use the list-documents tool to find it.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/destructiveHint=false/openWorldHint=false, and the description adds genuinely non-obvious behavior: the return is a plain-text URL and the URL is short-lived, with the instruction to re-fetch on expiry. That expiry/refresh semantics is real added value not present in structured fields.

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

Conciseness4/5

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

Front-loaded with the core action, then a short bulleted usage block, then return-format and expiry notes. Tight overall; the two bullets partially restate the opening sentence, costing a little density.

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

Completeness5/5

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

For a single-parameter read tool with no output schema, the description covers what it returns (plain-text URL), the key operational caveat (short-lived, re-fetch), and when to reach for it. Nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the single document_uuid parameter is fully documented in the schema (including the pointer to list-documents for discovery). The description adds no further parameter meaning, which is the expected baseline when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb and resource ('Get a download URL for the latest revision of a document as a PDF'), and the 'latest revision'/'as a PDF' scoping distinguishes it implicitly from read tools like get-document-info and upload tools like create-document-pdf-upload-url. It never names a sibling explicitly, so it just misses the top band.

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?

A dedicated 'Use this tool when' block gives two concrete triggers (user wants to download the current state as PDF; need a shareable PDF link for review). Clear positive guidance, but there are no exclusions and no named alternatives for adjacent cases such as wanting document metadata.

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

get-template-htmlGet template HTMLA
Read-only
Inspect

Returns the content of a template serialised as HTML.

Use this tool when:

  • You want to read or navigate the content of a template

  • You want to understand the structure of a template before editing it

The HTML uses semantic data-* attributes to represent fynk-specific nodes such as dynamic fields, party references, and signature blocks. Addressable nodes (paragraphs, headings, etc.) carry a data-uuid attribute that can be used to target individual nodes in subsequent operations.

Clause numbering is dynamic. Numbered clauses are ordered list nodes — <div data-list data-kind="ordered"> — that contain the clause text and, when nested, sub-clauses. Their computed number is shown read-only via a data-number attribute (e.g. data-number="1.1."). Numbers are never part of the text; do not treat them as editable content.

A cross-reference to a clause appears as <span data-section-ref data-uuid="...">, where data-uuid is the data-uuid of the list node it points at. It is empty: what it renders is that clause's computed number, so it follows the clause rather than stating a number of its own.

Dynamic fields (fill-in placeholders) appear inline as <span data-dynamic-field data-ref-uuid="...">, where data-ref-uuid is the field's ref_uuid (see get-template-info include=["dynamic_fields"]). Signature blocks are grouped in a signature container — <div data-signatures data-align="..."><span data-signature-block data-ref-uuid="..."></span></div> — where each <span data-signature-block> points at one block by its ref_uuid (see get-template-info include=["signature_blocks"]). Legacy content may still show a block outside any container, as <div data-signature-block data-ref-uuid="...">; writing it back turns it into a container holding that one block. Party references appear as <span data-party data-ref-uuid="..." data-format="name|reference|address|address:inline">, where data-format selects what is rendered (name = the party's entity_name, reference = its reference name).

Images (<img data-image>), dynamic tables (<div data-dynamic-table>) and signing vote blocks (<span data-signing-vote-block>) appear as empty reference tags. Their contents are held outside the HTML and cannot be created or edited through it, so copy these tags over unchanged when rewriting the template; dropping one removes the image or table from the template.

Text formatting - bold, colour, font, size, highlight - is stated inline, as the style of the tag carrying it. A block's layout is not: the margins, indent and line height a paragraph or heading is laid out with stay on the block itself, so the HTML says nothing about them.

A block's alignment is stated, as data-text-align on the paragraph, heading or list node carrying it - left, center, right or justify - with a matching text-align style alongside it. A block carrying neither is aligned left.

Only available for templates with a prosemirror_data content type. Returns an error for PDF templates.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_uuidYesUUID of the template to render as HTML

Output Schema

ParametersJSON Schema
NameRequiredDescription
htmlNoThe template content serialised as HTML. Fynk-specific nodes use data-* attributes (e.g. data-dynamic-field, data-party, data-signatures). Addressable nodes carry a data-uuid attribute.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare it as a safe, read-only, closed-world operation, and the description adds substantial context beyond them: the data-* attribute vocabulary, read-only clause numbering, empty reference tags (images, dynamic tables, vote blocks) whose contents live outside the HTML and are lost if dropped, legacy signature-block normalization on write-back, and the PDF-template failure mode.

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

Conciseness4/5

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

Purpose and when-to-use are front-loaded, then the node-encoding details follow in a logical order. It is long, but nearly every sentence describes a parsing or write-back rule the agent needs; only the per-node examples edge toward redundancy.

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

Completeness5/5

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

An output schema exists, yet the description still supplies the interpretive rules an agent needs to manipulate the returned HTML safely (which attributes target nodes, which tags must be copied verbatim, alignment defaults). Nothing required to call it correctly or use its result is missing.

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% for the single template_uuid parameter, so the baseline is 3. The description adds meaningful qualifying semantics for that parameter — the template must have a prosemirror_data content type or the call errors — which the schema does not express.

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

Purpose5/5

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

States a specific verb and resource: returns a template's content serialised as HTML. It is clearly distinguishable from sibling get-template-info (metadata) and replace-template-content (write), and even cross-references get-template-info for ref_uuid lookups, so an agent can route without opening other schemas.

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 an explicit 'use this tool when' list (read/navigate content, understand structure before editing) plus a hard eligibility rule: only prosemirror_data templates, errors for PDF templates. It lacks an explicit 'do not use this when...' exclusion list and does not name replace-template-content as the write counterpart, but the context is clear.

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

get-template-infoGet template infoA
Read-only
Inspect

Gets information about a template.

Use this tool when:

  • You have a template's UUID and want to know more details about it.

  • e.g. when you want to create a document from the template and need to know which parties, dynamic fields, etc are available in the template.

Called with no include parameter, returns the template's identity, its parties, its teams, its description and its signing settings. Use include to name the sections you want instead - among them signatories, signature_blocks, dynamic_fields, conditions, metadata_values, tags and timestamps - and the response carries exactly those, so a question about one aspect of a template costs one section rather than the whole template.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoThe sections the response carries, on top of the template's identity (uuid, name, locale, document type, published, url), which it always carries. Naming sections means exactly those: ask for one section and you pay for one, rather than for the whole template. If omitted, these are returned: parties, teams, details, signing_settings.
template_uuidYesUUID of the template to get information about

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the template in fynk. Only present when your user has template editing permission
nameNoName of the template
tagsNoThe tags on the template. Tags are the account's own classification labels (e.g. relationship type, commercial significance, region), so they show which categories this account uses and can be filtered on with filter_tags. Only present when the 'tags' section is requested via the include parameter.
uuidNoUnique identifier for the template. Do not show to the user unless they ask for it
teamsNoThe teams the template is assigned to. Only present when the 'teams' section is requested via the include parameter.
localeNoLocale code, e.g. en-GB, de-AT. Prefer describing the locale in natural language (e.g. 'British English') rather than showing the raw code.
partiesNoThe contracting entities the template defines. Only present when the 'parties' section is requested via the include parameter.
publishedNoIndicates if the template is published (true) or a draft (false). Only published templates can be used by users without template management permission
conditionsNoThe template's conditions: rules over its dynamic fields deciding whether a passage of the template applies, and whether each currently holds. Use them to explain why a clause is or is not part of the template, and what would have to change to flip it. Only present when the 'conditions' section is requested via the include parameter.
created_atNoWhen the template was created. Only present when the 'timestamps' section is requested via the include parameter.
updated_atNoWhen the template was last updated. Only present when the 'timestamps' section is requested via the include parameter.
archived_atNoWhen the template was archived. Absent when the template is not archived. Only present when the 'timestamps' section is requested via the include parameter.
descriptionNoDescription of the template. Absent when the template has none. Only present when the 'details' section is requested via the include parameter.
signatoriesNoThe individual people who sign documents created from this template. Distinct from parties: a signatory often signs on behalf of a party (e.g. a business), so a person may be a signatory without appearing as a party. Only present when the 'signatories' section is requested via the include parameter.
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this template creates. Absent when the template has no type assigned
dynamic_fieldsNoThe template's dynamic fields and their values. Only present when the 'dynamic_fields' section is requested via the include parameter.
signature_typeNoThe eIDAS assurance level that will be used when signing documents created from this template. Absent when none has been chosen. Only present when the 'signing_settings' section is requested via the include parameter.
metadata_valuesNoThe template's metadata fields and their values. Only present when the 'metadata_values' section is requested via the include parameter.
signature_blocksNoThe places in the template that are signed. A block is bound either to a single signatory or to a party, in which case every signatory of that party signs it. Only present when the 'signature_blocks' section is requested via the include parameter.
sequential_signingNoWhether signatories must sign in a specific order. Only present when the 'signing_settings' section is requested via the include parameter.

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, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral detail beyond that: the default set of sections returned when include is omitted, and the selective-fetch cost model that avoids pulling the whole template. This is meaningful beyond structured fields.

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

Conciseness4/5

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

Front-loaded with the core action, then structured 'Use this tool when' bullets and a sentence on include behavior. Slightly verbose, with the include/defaults idea repeated across two paragraphs, but every sentence remains useful and there is no filler.

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

Completeness5/5

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

An output schema exists, so return-value enumeration is not required in the description. Within that, the description fully covers default vs. selective section retrieval and the identity fields always returned, leaving nothing an agent needs before calling the tool.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented, and the schema itself explains that include selects exact sections and lists the defaults. The description largely reiterates the schema's include semantics rather than adding new meaning, so the 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?

States a specific verb (gets information) and resource (a template), and elaborates that the response covers identity, parties, teams, description and signing settings. This sufficiently distinguishes it from siblings like get-template-html (content) and list-templates (enumerate). An agent can identify its role without opening the schema.

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

Usage Guidelines4/5

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

Provides explicit when-to-use guidance with a concrete example ('when you want to create a document from the template and need to know which parties, dynamic fields... are available'), which is genuinely helpful context. It lacks explicit exclusions or alternatives (e.g. vs get-template-html), so it falls short of a 5.

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

get-user-infoGet user infoA
Read-only
Inspect

Get information about the current user.

Use this tool when:

  • You need to know who the current user is (email, locale, roles) before tailoring a response

For information about the current fynk account, use get-account-info

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
emailNo
rolesNoThe roles the user has in the current account
localeNoCode for the user's selected locale, e.g. en-GB, de-AT. Prefer describing the locale in natural language (e.g. \'British English\') rather than showing the raw code.
_entity_typeNoOnly relevant for tooling. Do not show to the user
current_accountNoThe fynk account that the user is currently logged in to
current_account_userNoDetails about the user that are specific to the fynk account they are currently logged in to

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, and an output schema exists, so the safety and return-shape burden is largely carried by structured data. The description adds only that the result carries identity fields, with no notes on auth requirements or caching. Adequate but thin given how little it adds beyond the annotations.

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

Conciseness4/5

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

Short and front-loaded: the verb+resource leads, then the when-to-use bullet, then the sibling redirect. The 'who the current user is' bullet mildly restates the opening sentence, a small redundancy that keeps it from a 5.

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, read-only lookup with full annotation coverage and an output schema, nothing material is missing: the agent knows what it returns, when to call it, and which sibling to prefer instead.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter semantics to explain; per the rubric this earns the baseline of 4. The description correctly implies a no-argument call by describing identity context rather than inputs.

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

Purpose5/5

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

States a specific verb and resource ('Get information about the current user') and enumerates the returned fields (email, locale, roles), which makes the scope concrete. It explicitly distinguishes itself from the sibling get-account-info, so an agent can route between the two without opening either schema.

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

Usage Guidelines5/5

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

Provides an explicit 'Use this tool when' trigger (needing to know who the current user is before tailoring a response) and names the alternative (get-account-info) with the condition that selects it. Both when-to-use and when-to-use-something-else are covered.

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

join-documentJoin documentA
Destructive
Inspect

Joins a document as a collaborator.

Use this tool when:

  • You need to make changes to a document, but do not have a 'document user' in the document yet.

  • You need to make changes to a document, but your existing 'document user' does not yet have permission to change it.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_uuidYesUUID of the document to join. If you don't already have the document's UUID, use the list-documents tool to find it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoName of the document user
emailNoEmail of the document user
party_uuidNoUUID of the party this user belongs to. Absent when they belong to none. Do not show to the user (as the raw UUID) unless they ask for it
_entity_typeNoOnly relevant for tooling. Do not show to the user
internal_userNotrue if the user has a fynk user in this account

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true. The description adds permission-precondition context, which is useful, but it never explains why a join is flagged destructive or what state change/permissions result from joining. With annotations covering the safety profile, a 3 fits.

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

Conciseness4/5

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

Purpose is front-loaded in one sentence, followed by two scannable bullets. Minor redundancy in the repeated 'You need to make changes to a document, but...' phrasing, but no real waste.

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?

An output schema exists, so return values need no explanation. The when-to-use preconditions are covered; the only remaining gap is the unexplained destructiveHint flag, which is a minor omission for a single-parameter tool.

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

Parameters3/5

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

Schema description coverage is 100% and the schema itself routes the agent to list-documents for obtaining the UUID. The description adds no parameter semantics beyond that, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb + resource ('Joins a document as a collaborator'), which is clearer than a bare tautology. It does not explicitly distinguish itself from siblings like update-document or create-document-party, but the 'as a collaborator' framing clarifies the effect.

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 an explicit "Use this tool when" block with two concrete preconditions (no 'document user' yet, or existing 'document user' lacks change permission). It gives clear triggering context but never names an alternative tool or a when-not-to-use case.

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

list-account-document-typesList account document typesA
Read-only
Inspect

Get a list of the document types available in the account (fynk's system-provided types plus any custom types defined for the account).

Use this tool when:

  • You need a document type's UUID to filter list-documents by document type

  • You want to know which document types exist before referring to them by name in a response

  • You need to know what a document type covers, or how fynk's AI analyses recognise it (include=["details"])

Each document type is returned as its uuid and name by default. Request include=["details"] for its description and the prompt the AI analyses use to recognise it. Which metadata fields a document type has is reported from the other side, by list-account-metadata: each field there names the document types it is relevant for.

By default, only the types the account currently offers are returned. Removing one of fynk's system types deactivates it rather than deleting it: set filter_state to "deactivated" to list those types (e.g. when the user wants to reactivate one) or to "all" to list them alongside the rest.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNoOptional sections to include for each document type, on top of its uuid and name. Allowed values: details (the description, and the prompt fynk's AI analyses use to recognise documents of the type). Only request it when you need it
filter_stateNoWhich document types to return. "active" (the default) returns the types in use for the account; "deactivated" returns only fynk's types that are deactivated for it; "all" returns both, with deactivated ones flagged

Output Schema

ParametersJSON Schema
NameRequiredDescription
document_typesNo

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already cover readOnly/openWorld/destructive. The description adds real behavioral context beyond them: default returns only active types, and removing a system type deactivates rather than deletes it, with filter_state to surface those. It does not mention auth or rate-limit behavior, so it stops short of a 5.

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?

Front-loaded with the core purpose, then structured into a bulleted when-to-use block and a return-format/state note. Dense but every sentence carries information; nothing is redundant.

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?

Although an output schema exists, the description still clarifies the default return shape (uuid and name) and cross-references list-account-metadata for the inverse relationship. An agent has everything needed to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description goes further by explaining what include=["details"] actually yields (description + recognition prompt) and tying filter_state to real scenarios like reactivation, adding meaning beyond the schema enum text.

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

Purpose5/5

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

States a specific verb and resource ('Get a list of the document types available in the account') and immediately scopes it ('fynk's system-provided types plus any custom types'). This clearly distinguishes it from siblings like create-account-document-type, delete-account-document-type, and list-account-metadata.

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

Usage Guidelines5/5

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

Provides an explicit 'Use this tool when' list with three concrete triggers, including the alternative workflow (needing a UUID to filter list-documents). It also explains the filter_state cases (reactivating a deactivated type), leaving little to inference.

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

list-account-metadataList account metadataA
Read-only
Inspect

Get a list of the metadata fields available in the account to be associated with documents & templates.

Use this tool when:

  • You need to know which metadata names exist before referencing them in get-document-info / list-documents

  • You want to know the type, allowed values, or other configuration of an account's metadata fields

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
metadataNo

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, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds conceptual context about what the fields represent but does not disclose operational traits such as pagination, rate limits, or whether inactive fields are included.

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 brief, front-loaded with the core action, and uses a clear bulleted 'Use this tool when' structure. Every sentence adds value without repetition or filler.

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

Completeness5/5

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

For a zero-parameter, read-only list tool with rich annotations and an output schema, the description supplies everything needed: purpose, usage conditions, and the relationship to downstream tools. No critical information is missing, and return values are appropriately left to the output schema.

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

Parameters4/5

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

The tool takes no parameters, so the baseline is 4 per the rubric. The description adds no parameter-specific information, which is appropriate since there are no parameters to describe.

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

Purpose5/5

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

States a specific verb ('Get a list') and resource ('metadata fields available in the account'), and distinguishes its role from get-document-info and list-documents. An agent can tell this tool apart from sibling list tools like list-account-tags or list-account-document-types without opening the schema.

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 an explicit 'Use this tool when:' section with two concrete scenarios, including the need to know metadata names before referencing them in other tools. However, it does not state when not to use this tool or name an alternative to call instead.

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

list-account-partiesList account partiesA
Read-only
Inspect

Get a list of the account parties saved on your account.

Account parties are the account's OWN entities — the company the user belongs to and its subsidiaries, group or parent companies. Phrasing like "our", "we", "us", "my company" or "our subsidiary" refers to an account party. These are the internal side of an agreement, as opposed to external parties (the counterparties on the other side), which you find with find-external-parties.

Use this tool when:

  • You need to know which pre-defined parties are available for use in documents or templates

  • You need to provide an account_party_uuid (use a uuid from this tool's response)

  • You need an account party's UUID to filter list-documents by account party (filter_account_parties) — e.g. to find documents involving "our" company or one of its subsidiaries

If you are looking for a named entity and it does not appear here, it may be an external party (counterparty) instead — try find-external-parties before concluding it does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
account_partiesNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuine semantics about the account's internal entities and a fallback path when a name is absent, though it omits anything about result size or pagination for an open-world list.

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

Conciseness4/5

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

Front-loaded with the action, then a definitional paragraph, then a scannable bullet list and a fallback note. Slightly verbose in the party-definition paragraph, but every block carries information the agent needs.

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

Completeness5/5

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

With an output schema present, return values need not be explained, and the annotations carry the safety profile. The description fills the remaining gaps: what an account party is, what the tool is for, and where to go when it returns nothing.

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

Parameters4/5

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

The tool takes zero input parameters, so the baseline is 4. The description's mention of account_party_uuid (as a value taken from this tool's response) is useful orientation but not an input parameter concern.

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

Purpose5/5

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

States a specific verb+resource ('Get a list of the account parties') and immediately defines what an account party is, cleanly separating it from external parties. An agent can distinguish this from find-external-parties without opening either schema.

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

Usage Guidelines5/5

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

Provides an explicit three-bullet 'Use this tool when' list covering party availability, UUID provisioning, and filtering list-documents, plus a clear exclusion rule routing named entities to find-external-parties. Nothing is left to inference.

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

list-account-playbooksList account playbooksA
Read-only
Inspect

Get a list of the playbooks defined in the account.

Use this tool when:

  • You need a playbook's UUID to refer to it

  • You want to know which playbooks exist before referring to them by name in a response

Playbooks allow automating the review of documents based on predefined criteria.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
playbooksNo

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, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds useful domain context (playbooks automate document review against predefined criteria) and the UUID-retrieval purpose, but discloses nothing about ordering, pagination, or result size.

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

Conciseness4/5

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

Purpose is front-loaded in the first sentence, followed by a scannable 'Use this tool when' list and a short domain gloss. Every sentence earns its place, though the closing definition sentence is informational rather than actionable.

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?

With an output schema present, return values need not be explained, and with zero parameters and full annotation coverage there are few gaps to fill. The description supplies the domain framing and usage conditions an agent needs to route here correctly, leaving only minor operational details unstated.

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

Parameters4/5

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

The tool takes no parameters, so there is nothing to document and the baseline is 4. Schema description coverage is 100%, and the description correctly does not fabricate parameter guidance.

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

Purpose4/5

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

States a specific verb (Get a list) and resource (playbooks defined in the account), so the agent immediately knows what it returns. It does not explicitly differentiate itself from the many sibling list-* tools (list-templates, list-account-tags, etc.), but the resource noun 'playbooks' is distinct enough to separate it.

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 an explicit 'Use this tool when' section with two concrete conditions: needing a playbook's UUID, and wanting to know which playbooks exist before referring to them by name. It gives clear context but names no alternatives or exclusions (e.g., what to use instead when you already have the UUID).

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

list-account-tagsList account tagsA
Read-only
Inspect

Get a list of the tags available in the account to be associated with documents & templates.

Use this tool when:

  • You need a tag's UUID to filter list-documents / list-templates by tag

  • You want to know which tags exist before referring to them by name in a response

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
tagsNo

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds the useful behavioral context that tags are account-scoped and are consumed as UUIDs by other tools, though it says nothing about ordering or volume of returned tags.

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?

One lead sentence stating purpose followed by two tight bullets covering the trigger conditions. No filler, and the primary purpose is front-loaded before the usage detail.

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?

An output schema exists so return values need not be described, annotations cover the read-only safety profile, and there are no parameters to document. The description supplies everything an agent needs to select and call 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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-param tool applies. The schema confirms an empty object, matching the description's account-wide scope.

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 names a specific verb and resource ('Get a list of the tags available in the account') and immediately scopes what tags are for ('to be associated with documents & templates'). It is clearly distinguishable from the write-oriented siblings create-account-tag, update-account-tag, and delete-account-tag.

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?

Two explicit when-to-use conditions are given: needing a tag's UUID to filter list-documents / list-templates, and needing to know which tags exist before referring to them by name. This routes the agent to the correct sibling tools for the downstream filtering step.

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

list-account-team-membersList account team membersA
Read-only
Inspect

List the members (account users) of a given team.

Use this tool when:

  • You need the account-user uuids of a team's members in order to add them to another team

  • The user asks who is in a team

  • You are merging or restructuring teams and need to know the current membership

Returns each member's uuid, first_name, last_name, and email. Pass the uuids to attach-account-users-to-team to add the same people to another team. Suspended users are not included.

ParametersJSON Schema
NameRequiredDescriptionDefault
team_uuidYesUUID of the team whose members should be listed

Output Schema

ParametersJSON Schema
NameRequiredDescription
membersNoThe account users that are members of the team

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description still adds meaningful behavior beyond them: suspended users are excluded from results, and the returned fields and their intended downstream use are disclosed.

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

Conciseness4/5

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

Front-loaded with the one-line purpose, then a short scenario list and a returns/next-step sentence. Tight overall, though two of the three bullets (getting uuids to add to another team, merging/restructuring teams) overlap somewhat.

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?

An output schema exists so return values need no expansion, yet the description still names the key fields and the recommended follow-up call. Everything needed to select and invoke this single-parameter read tool is present.

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?

One parameter with 100% schema description coverage, so the schema already carries the syntax burden. The description adds only the implicit notion that team_uuid identifies the team whose membership is returned, which is baseline-level value.

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

Purpose5/5

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

States a specific verb+resource ('List the members (account users) of a given team') and scopes it to team membership, which cleanly separates it from siblings like list-account-users, list-account-teams, and the detach/attach counterparts.

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?

An explicit 'Use this tool when' block lists three concrete scenarios, and it names the downstream alternative (attach-account-users-to-team) for the follow-up action. When-to-use and the routing decision are both spelled out.

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

list-account-teamsList account teamsA
Read-only
Inspect

Get a list of the teams available in the account.

Use this tool when:

  • You need a team's UUID to filter list-documents by team

  • You want to know which teams exist before referring to them by name in a response

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
teamsNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered without description help. The description adds the scope ('teams available in the account') but says nothing about ordering, pagination, or result shape beyond what the output schema supplies. Adequate but thin against an already-covered annotation set.

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 purpose is front-loaded in one sentence, followed by two tight bullets that each carry a distinct use case. No filler or repeated information.

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?

An output schema exists to describe the returned teams and annotations cover the read-only safety profile, so the description only needs to establish purpose and usage — both of which it does. Nothing an agent needs to call this zero-parameter listing tool correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; the 4 baseline applies. Nothing in the text contradicts or muddies the empty schema.

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

Purpose4/5

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

States a specific verb and resource: 'Get a list of the teams available in the account.' This clearly separates it from list-account-team-members, create-account-team, and delete-account-team by the resource it returns. It stops short of naming a sibling it could be confused with, so it lands just below the top band.

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

Usage Guidelines4/5

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

Provides explicit when-to-use conditions as bullets, including the concrete downstream use case of obtaining a team UUID to filter list-documents by team. It routes the agent well but offers no when-not guidance or direct alternative comparison.

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

list-account-usersList account usersA
Read-only
Inspect

Get a list of the account users (the people who can log in to this fynk account).

Use this tool when:

  • You need an account user's uuid, e.g. to add them to a team via attach-account-users-to-team

  • The user refers to a colleague by name and you need to match them to an account user

  • The user asks who is part of the account

Returns each account user's uuid, first_name, last_name, and email. Only the account users the current user is allowed to see are returned: most users see everyone in the account, but 'limited manager's only see themselves and the members of their own teams. So this list is not necessarily the full set of people in the account - avoid presenting it as complete.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
account_usersNoThe account users visible to the current user

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, yet the description adds substantive behaviour the annotations do not: results are permission-filtered, most users see everyone but 'limited managers' see only themselves and their own team members, and the list must not be presented as the complete account roster. That is exactly the kind of hidden-behaviour disclosure that prevents a downstream agent from making a false claim.

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?

Front-loaded with the one-line purpose, then a scannable bulleted trigger list, then a short caveat paragraph. Every sentence carries information an agent needs (identity of the resource, triggers, permission scoping) with no filler.

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

Completeness5/5

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

An output schema exists so return values need no re-explanation, but the description still surfaces the key non-obvious fields and the critical completeness caveat about permission-scoped visibility. For a zero-parameter, read-only listing tool, nothing an agent needs to call or interpret it is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly avoids inventing non-existent filter parameters such as name or email.

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

Purpose5/5

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

The description states a specific verb and resource ('Get a list of the account users') and immediately disambiguates the term by defining account users as 'the people who can log in to this fynk account'. This separates it from near neighbours such as list-account-team-members, find-document-users and get-user-info.

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

Usage Guidelines4/5

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

It gives three concrete triggers under 'Use this tool when', including a downstream use case that names a sibling (attach-account-users-to-team), so the agent knows when this tool is the right call. It does not, however, state when *not* to use it or contrast it directly with the other user/team-listing tools, so it falls short of full alternative routing.

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

list-documentsList documentsA
Read-only
Inspect

Get a paginated list of the documents available to the current user.

Use this tool when:

  • You need to find a document_uuid to use as input for another tool

  • You need to know which documents the current user has access to

  • You want to search for a specific document

By default, returns all active (non-archived) documents that the user has access to, with the most recently updated documents first. sort_by and sort_direction arguments can be used to control the sorting. Archived documents are included or targeted using the filter_archived_state parameter.

To keep responses small, each document is returned as a compact summary by default. Use the include parameter to request additional sections (parties, teams, tags, details, signing_settings, timestamps) when the user's question needs them, and prefer get-document-info when you need full information about a single document.

When you need particular metadata values for several documents, name those fields in include_metadata and they are returned for every document in the response. Do not call get-document-info once per document to collect the same fields — one list-documents call with include_metadata answers the whole question. When you already have the UUIDs of the documents you care about, pass them as filter_document_uuids and combine that with include or include_metadata to gather information about exactly those documents in a single call.

Each account has its own vocabulary — discover it before filtering

Accounts classify their documents using structures they define themselves: tags, document types, metadata fields (and their select options), teams and parties. The words a user puts in a question are usually the words their own account already uses as labels. "our customers", "suppliers", "key accounts", "renewals", "EMEA" and "high value" all sound like descriptions of content, but each is far more likely to be a tag, a document type, or a metadata field or option in this account.

Tags in particular are the account's own free-form classification labels, commonly covering relationship type (customer, supplier, partner, reseller), commercial significance (key account, strategic), lifecycle or region. A plain category noun in a question very often corresponds to a tag rather than to anything in the document text — so check list-account-tags whenever a question groups documents into a category that isn't available as a document type.

These lookups are cheap and return small, complete lists, so look rather than guess:

  • list-account-tags: the account's classification labels

  • list-account-document-types: e.g. NDA, MSA, Customer Agreement, DPA

  • list-account-metadata: field names, value types and select option values

  • list-account-teams / list-account-parties / find-external-parties: teams and contracting entities

Decompose the request, then map every part to a filter

A question usually contains several independent conditions. Handle each one separately:

  1. Split the request into its conditions. "what logo usage rights do we have for our largest customers?" is three: "logo usage rights", "largest", "customers".

  2. For each condition, ask what kind of structured thing it could be: a tag, a document type, a metadata field or option, a party (account or external), a document user, a team, a template, an automation, an import, a stage, or an origin.

  3. Look up the candidates with the companion tools above, then filter with the matching filter_ parameter.

  4. Only leave a condition to filter_query once you have confirmed that no structured filter covers it.

Finding a structured filter for one condition does NOT mean you are done — work through every condition before answering. In the example above, "largest" is a currency metadata field such as contract value (filter_metadata range, or sort_by that field), "customers" is very likely a tag or a document type, and "logo usage rights" may also be available from a metadata. Answering with just one of the three silently answers a different question than the user asked.

filter_query is a last resort

filter_query is only a fuzzy full-text search, so it gives inaccurate results for any specific structured attribute. This holds even when the request is phrased loosely or topically ("documents about product variant Alpha", "anything to do with Acme") — topical phrasing does NOT mean the term is free-text rather than a structured field or value. Prefer filter_query only for genuinely free-text conditions, or when the user is clearly searching by document name.

If filter_query returns no results, do not conclude that no matching documents exist before checking whether the search term corresponds to a tag, a document type, a metadata field or value, or a party. If it does, retry with the matching filter_ parameter instead.

Filters that take looked-up identifiers

The various 'filter_' parameters can be used to limit the list of returned documents. Several filters take identifiers or names you can look up with companion tools:

  • filter_account_parties: list-account-parties

  • filter_external_parties: find-external-parties

  • filter_automations: find-automations

  • filter_document_types: list-account-document-types

  • filter_document_users: find-document-users

  • filter_imports: find-imports

  • filter_metadata (field names, types and option values): list-account-metadata

  • filter_tags / filter_excluded_tags: list-account-tags

  • filter_teams: list-account-teams

  • filter_templates: list-templates

Parties vs. people, and account vs. external parties

Note that a document's parties (the contracting entities, frequently organizations) are distinct from its signatories and other document users (the individual people on the document). A named person commonly signs or is involved on behalf of a party without being a party themselves — so to find documents involving a specific person, use filter_document_users rather than a party filter.

Parties also come in two kinds. Account parties are the account's OWN entities — the company the user belongs to and its subsidiaries, group or parent companies; phrasing like "our", "we", "us", "my company" or "our subsidiary" points to an account party (look them up with list-account-parties and filter with filter_account_parties). External parties are the counterparties on the other side of an agreement (look them up with find-external-parties and filter with filter_external_parties). When it is not clear which kind a named entity is, or when one lookup returns nothing, check the other kind before concluding that no matching party or documents exist.

Active vs. archived documents

Only active — i.e. not archived — documents are returned by default, so a default call silently leaves archived documents out of the answer. Archiving is not deletion: an archived document still exists, and for questions about past, completed or superseded contracts it may be the document being asked about.

  • Set filter_archived_state=all whenever the answer is meant to cover a complete set or a count — "all our NDAs", "how many contracts do we have with Acme", "which suppliers have we signed with", "what is our total contract value". A default call answers such a question with a number that is too low, and nothing in the response reveals that.

  • Set filter_archived_state=archived only when the user asks specifically about archived documents.

  • If a call returns no results, retry with filter_archived_state=all before concluding that no matching documents exist — alongside the other checks above, i.e. whether a term you passed to filter_query is really a tag, document type, metadata field or party, and whether a named entity is the other kind of party.

When an answer draws on results that include archived documents, say which ones are archived. Request include=["timestamps"] to see this: archived_at is set on archived documents and null on active ones.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoWhich page of results to fetch
includeNoOptional sections to include for each document, on top of the default compact summary. Allowed values: parties (the contracting entities, in compact form), teams (the teams the document is assigned to), tags (the account classification labels on the document — useful for seeing which categories the account actually uses), details (origin, locale and source template), signing_settings (signature type, sequential signing and the external signatory invitation message), timestamps (created_at, updated_at and archived_at — the last of these tells an archived document from an active one). Only request the sections you actually need; use get-document-info for full information about a single document.
sort_byNoSort results by this field. The default is: updated_at. Allowed values are any of the static sort fields (name, stage, created_at, updated_at, archived_at, relevance) or any metadata field `name` from list-account-metadata
per_pageNoHow many results to return on each page. Defaults to 10, or - when filter_document_uuids is used - to the number of UUIDs given, so that one response covers them all
filter_tagsNoA list of tag UUIDs (find them with list-account-tags). Tags are the account's own classification labels, commonly covering relationship type (customer, supplier, partner), commercial significance (key account, strategic), lifecycle or region. When a user groups documents by a category — "our customers", "vendor contracts", "strategic accounts" — that category is often a tag, so check list-account-tags before treating it as free text. The default behavior is to match documents that have ANY of the given tags
filter_queryNoA fuzzy full-text relevance search across document name, plaintext content and other indexed fields (metadata, parties, etc). Because it is fuzzy, it is NOT a reliable way to filter by a specific structured attribute such as a metadata value, party, document user or document type — for those, use the matching filter_ parameter instead. Prefer filter_query only for genuine free-text searches or when searching by document name. If sort_by is not provided, results will be returned most relevant first
filter_teamsNoA list of team UUIDs (find them with list-account-teams). Matches documents assigned to any of the given teams
filter_stagesNoA list of document stages. Matches documents that are in ANY of the given stages
filter_expiredNoIf true, finds documents with an expiration date in the past. If false, excludes documents with an expiration date in the past (documents without an expiration date count as not expired). Omit to apply no expiry filtering
filter_importsNoA list of import UUIDs (find them with find-imports). Matches documents that came from any of the given imports
filter_localesNoA list of either document language locale codes (e.g. "en-US", "de-DE") or the special value "has_no_value". Matches documents whose language is any of the given locales. "has_no_value" finds documents with no language set
filter_originsNoA list of document origins. Matches documents with ANY of the given origins
filter_tag_andNoIf true, changes filter_tags behavior to only match documents that have ALL of the given tags. Sending false or omitting this filter has no effect
sort_directionNoThe default is: desc
filter_metadataNoFilter by metadata field values. Discover field names, value_type and select_values with list-account-metadata. Each entry in filter_metadata must name one field and provide exactly one matcher appropriate to that field type
filter_templatesNoA list of template UUIDs (find them with list-templates). Matches documents created from any of the given templates
include_metadataNoMetadata field `name`s (from list-account-metadata) to return a value for on every document in the response, up to 10 fields. Use this whenever you need the same metadata for several documents — it answers the whole question in one call, instead of calling get-document-info once per document. Each requested field is returned for every document, with a null value where that document has no value for it. Only request the fields you actually need: values are returned per document, so the response grows with per_page × the number of fields
filter_automationsNoA list of automation UUIDs (find them with find-automations). Matches documents created by any of the given automations
filter_discussionsNo`has_any` will find documents that have at least one discussion (regardless of current status). `has_open` will find only documents that have at least one open discussion
filter_excluded_tagsNoA list of tag UUIDs (find them with list-account-tags). Documents with ANY of these tags will be excluded from the result
filter_archived_stateNoWhich documents to return, by archived state. "active" (the default) returns only active, non-archived documents; "archived" returns only archived documents; "all" returns both. Use "all" whenever the answer is meant to cover a complete set or a count of documents ("all our NDAs", "how many contracts with Acme"): archiving is not deletion, so an archived document is still a real agreement and leaving it out under-reports the answer. Use "archived" only when the user asks specifically about archived documents. With "all" the response does not say which results are archived unless you also request include=["timestamps"]: archived_at is set on an archived document and null on an active oneactive
filter_document_typesNoA list of document type UUIDs (find them with list-account-document-types). Matches documents of any of the given types
filter_document_usersNoA list of document users (find them with find-document-users). Matches documents that any of the given people are on. Use this when looking for documents involving a specific named individual (such as a signatory or contact): that person is distinct from a party, and may sign or act on behalf of a party (e.g. a business) without being a party themselves. Provide first_name and last_name as returned by find-document-users
filter_document_uuidsNoA list of document UUIDs, up to 50. Restricts the results to those documents. Use this when you already know which documents you are interested in — for example to fetch include_metadata values, parties or tags for a set of documents whose UUIDs you have from earlier in the conversation — instead of calling get-document-info once per document. Unless you set per_page yourself, the page is sized to the list so a single response covers every UUID you sent. UUIDs that do not exist, or that the current user cannot access, simply do not appear in the results, so do not assume every UUID you send is returned
filter_account_partiesNoA list of account party UUIDs (find them with list-account-parties). Account parties are the account's OWN entities — the company the user belongs to and its subsidiaries/group companies ("our" company, "our subsidiary"), as opposed to external parties (filter_external_parties), which are the counterparties on the other side. Matches documents that involve any of the given account parties. A party is a contracting entity (often a business/organization) and is distinct from the individual people on a document — to find documents involving a specific named person, use filter_document_users instead
filter_team_unassignedNoIf true, finds documents, that are not assigned to any team. May be combined with the filter_teams filter to find documents that are in the given filter_teams OR are unassigned. Sending false or omitting this filter has no effect
filter_external_partiesNoA list of external party names (the entity_name returned by find-external-parties). External parties are the counterparties on the other side of an agreement (entities that do NOT belong to the account), as opposed to account parties (filter_account_parties), which are the account's own entities ("our" company and its subsidiaries). Matches documents that involve any of the given external parties. A party is a contracting entity (often a business/organization) and is distinct from the individual people on a document — to find documents involving a specific named person, use filter_document_users instead

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNoHow many documents are available across all pages
max_pageNoHow many pages of results are available
documentsNo
in_app_urlNoA URL that opens the fynk app's documents list with the same filters, sorting and pagination applied. Give this to the user when they may want to view or work with this filtered document list in the fynk app
current_pageNoWhich page of results this is

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only cover the safety posture (readOnly/openWorld/destructive), but the description adds substantial behavioral context: default sort by updated_at, default active-only filtering that silently omits archived documents, per-page sizing behavior, and the warning that a default call under-reports counts. These are non-obvious traits an agent could not derive from annotations.

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

Conciseness3/5

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

Front-loaded with the core purpose and organized under clear headers, so structure is strong. However it is very long and duplicates much of the schema prose (the filter_archived_state, filter_tags, filter_query and include_metadata explanations appear almost verbatim in the schema), so several sentences do not earn their 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 27-parameter tool with an output schema, the description covers everything an agent needs: defaults, silent exclusions, the archive trap, how to avoid per-document calls, and how to resolve filter identifiers. Return values are appropriately left to the output schema.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3 and the schema already documents each parameter's syntax. The description adds genuine cross-parameter meaning on top: mapping request conditions to the right filter_, pairing filter_document_uuids with include/include_metadata, and knowing which companion tool resolves each filter's identifier. That exceeds the schema-only baseline without repeating raw types.

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

Purpose5/5

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

States a specific verb and resource ('Get a paginated list of the documents available to the current user') and explicitly names the alternative (get-document-info) for the single-document case. An agent can distinguish it from every sibling without opening a schema.

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?

Three explicit when-to-use bullets, an explicit routing rule to get-document-info, and a full section of when-NOT-to-use-filter_query plus fallback behavior. It even explains how to decompose a multi-condition request into filters, which is genuinely decision-guiding rather than decorative.

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
Inspect

Get a paginated list of the templates available to the current user.

Use this tool when:

  • You need to know which templates are available for creating documents from

  • You need to know which templates the user may edit in fynk. These will have a "url" field pointing to the edit page. No "url" means no permission to edit

By default, returns all active (non-archived) templates that the user has access to, with the most recently updated templates first. sort_by and sort_direction arguments can be used to control the sorting.

To keep responses small, each template is returned as a compact summary by default. Use the include parameter to request additional sections (parties, teams, tags, details, signing_settings, timestamps) when the user's question needs them, and prefer get-template-info when you need full information about a single template.

The various 'filter_' arguments can be used to limit the list of returned templates.

Active vs. archived templates

Only active — i.e. not archived — templates are returned by default. Archiving is not deletion: an archived template still exists and its past documents still reference it. Set filter_archived_state=all when the answer is meant to cover every template the account has, and retry with it if a call returns no results, before concluding that no matching template exists. Set filter_archived_state=archived only when the user asks specifically about archived templates. When picking a template to create a new document from, keep the default: an archived template is one the account has retired from use. A response only reveals which templates are archived if you request include=["timestamps"], which carries archived_at.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoWhich page of results to fetch
includeNoOptional sections to include for each template, on top of the default compact summary. Allowed values: parties (the contracting entities the template defines, in compact form), teams (the teams the template is assigned to), tags (the account's own classification labels on the template), details (the template's description), signing_settings (signature type and sequential signing), timestamps (created_at, updated_at and archived_at — the last of these tells an archived template from an active one). Only request the sections you actually need; use get-template-info for full information about a single template.
sort_byNoSort results by this field. The default is: updated_at
per_pageNoHow many results to return on each page
filter_tagsNoA list of tag UUIDs. The default behavior is to match templates that have ANY of the given tags
filter_queryNoSearches against the template's name
filter_teamsNoA list of team UUIDs. Matches templates that belong to any of the given teams
filter_localeNoLocale code to filter by, e.g. "de" or "de-AT". Matches templates whose locale starts with the given value
filter_statusNoSet to "published" to return only published templates, or "draft" to return only drafts
filter_tag_andNoIf true, changes filter_tags behavior to only match templates that have ALL of the given tags. Sending false or omitting this filter has no effect
sort_directionNoThe default is: desc
filter_excluded_tagsNoA list of tag UUIDs. Templates with ANY of these tags will be excluded from the result
filter_archived_stateNoWhich templates to return, by archived state. "active" (the default) returns only active, non-archived templates; "archived" returns only archived templates; "all" returns both. Use "all" when the answer is meant to cover every template the account has; use "archived" only when the user asks specifically about archived templates. With "all" the response does not say which results are archived unless you also request include=["timestamps"]: archived_at is set on an archived template and null on an active one. Requires permission to manage templates — other users may only request "active"active
filter_team_unassignedNoIf true, finds templates that are not assigned to any team. May be combined with filter_teams to find templates that are in the given filter_teams OR are unassigned. Sending false or omitting this filter has no effect

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNoHow many templates are available across all pages
max_pageNoHow many pages of results are available
templatesNo
in_app_urlNoA URL that opens the fynk app's templates list with the same filters, sorting and pagination applied. Give this to the user when they may want to view or work with this filtered template list in the fynk app
current_pageNoWhich page of results this is

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already establish a safe read (readOnlyHint=true, destructiveHint=false), and the description adds substantial context on top: the default filter is active-only, archiving is not deletion, a permission requirement gates non-active archived states ('other users may only request active'), and the response only reveals archived state when include=["timestamps"] is requested. These are non-obvious behavioral facts no other structured field carries.

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

Conciseness4/5

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

Front-loaded with purpose and use-when bullets, then defaults, then a clearly headed archived-state section, so it scans well. It is nonetheless long, and the archived vs. active guidance duplicates text already present in the filter_archived_state schema description, costing some economy.

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

Completeness5/5

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

With an output schema present (return shape need not be explained), full annotation coverage, and a 14-parameter schema, the description supplies everything else an agent needs: defaults, sorting, compact-summary-by-default behavior, include expansion, and the active/archived policy. Nothing material is missing.

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

Parameters3/5

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

Schema description coverage is 100% across 14 parameters, so the schema already documents every argument in detail, including the archived-state permission note and filter_tag_and semantics. The description's parameter discussion (sort_by, sort_direction, include, filter_) largely restates what the schema says, so a 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?

States a specific verb and resource ('Get a paginated list of the templates available to the current user') and explicitly distinguishes itself from the nearest sibling by naming get-template-info for single-template detail. An agent can route between them without opening either schema.

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 'Use this tool when' block gives two concrete triggers (discovering templates to create documents from; finding templates the user may edit, signalled by the presence of a url field). It also names the alternative for full single-template information and prescribes a retry strategy (filter_archived_state=all) before concluding no match exists.

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

move-document-to-done-stageMove document to done stageA
Destructive
Inspect

Moves a document to the done stage.

Use this tool when:

  • The document's current stage is one of: draft, approved_draft, review, approved_review

  • The document will NOT be signed through fynk (documents signed through fynk automatically move to done when fully signed)

This stage transition may be blocked by checkpoints on the document, or by unresolved preconditions (unresolved proposals, mandatory dynamic fields without values, active editor sessions or working copies, active signing phases, etc.). A refusal here reports just the first problem it runs into; call get-document-info first and read workflow_state.stage_transitions.done.blockers to see everything that is in the way at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_uuidYesUUID of the document to move to the done stage. If you don't already have the document's UUID, use the list-documents tool to find it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned
workflow_stateNoGives an indication of which stage transitions, etc are possible to perform on this document. This object is technical state, not display content: when relaying it to the user, always render it as natural-language prose and never echo raw field names or snake_case values (e.g. say 'signing cannot be started yet because not every signature block has been assigned to a signatory' instead of mentioning 'can_start_signing' or 'signature_block_signatory').

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false, destructiveHint=true and openWorldHint=true. The description goes well beyond that by naming the classes of blockers (checkpoints, unresolved proposals, mandatory dynamic fields, active editor sessions/working copies, active signing phases) and disclosing that a refusal reports only the first problem encountered, plus the workaround of reading workflow_state.stage_transitions.done.blockers via get-document-info. That is exactly the behavioral detail annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the action, then a scannable bulleted condition list, then the failure-mode paragraph. Slightly long, but nearly every sentence carries operational value; the blocker detail justifies the length rather than padding it.

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?

An output schema exists, so return values need not be explained. Given a state-mutating tool with a single documented parameter, the description covers preconditions, failure behavior, the recommended diagnostic call, and the automatic-transition exclusion — nothing an agent needs in order to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% for the single document_uuid parameter, and the schema already tells the agent to use list-documents if the UUID is unknown. The description adds no additional parameter meaning, so the 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?

States a specific verb (moves), resource (document), and target state (done stage) in the first sentence. It is immediately distinguishable from the sibling stage-transition tools move-document-to-review-stage and move-document-to-signing-stage without opening any schema.

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?

An explicit 'Use this tool when' block gives the qualifying source stages (draft, approved_draft, review, approved_review) and an exclusion: documents that will be signed through fynk move to done automatically and should not be routed here. Both the when and the when-not are stated.

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

move-document-to-review-stageMove document to review stageA
Destructive
Inspect

Moves a document to the review stage.

Use this tool when:

  • The document's current stage is one of: draft, approved_draft, approved_review, signing or done

  • You want to share the document for review before moving to a later stage

This stage transition may be blocked by checkpoints on the document, or - when reverting a document that was not created from a template - by an account that only allows signing to start from a template. A refusal here reports just the first problem it runs into; call get-document-info first and read workflow_state.stage_transitions.review.blockers to see everything that is in the way at once.

If the document is in the process of being signed, or has been signed already, moving back to review will cancel the current signing process and invalidate any existing signatures.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_uuidYesUUID of the document to move to review. If you don't already have the document's UUID, use the list-documents tool to find it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned
workflow_stateNoGives an indication of which stage transitions, etc are possible to perform on this document. This object is technical state, not display content: when relaying it to the user, always render it as natural-language prose and never echo raw field names or snake_case values (e.g. say 'signing cannot be started yet because not every signature block has been assigned to a signatory' instead of mentioning 'can_start_signing' or 'signature_block_signatory').

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that transitions can be blocked by checkpoints or account restrictions, that a refusal only reports the first problem, and critically that moving a signing/signed document cancels the signing process and invalidates existing signatures. This meaningfully elaborates the destructiveHint=true annotation rather than 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.

Conciseness4/5

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

Front-loads the core action in the first sentence and organizes conditions into bullets, with the destructive consequence last. It is somewhat long, but nearly every sentence carries actionable information, so size is justified by the complexity of the transition.

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 single-parameter mutation tool with an output schema (so return values needn't be explained), the description covers the valid preconditions, the blocker-discovery alternative, and the destructive side effects. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the single document_uuid parameter is already fully documented. The description adds only a pointer to list-documents for locating the UUID, which is marginal beyond the schema; baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb ('moves') and resource ('document') plus the exact target state ('review stage'). Combined with sibling names like move-document-to-done-stage and move-document-to-signing-stage, an agent can tell which transition this performs without opening the schema.

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

Usage Guidelines5/5

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

Provides an explicit 'Use this tool when' list naming the valid current stages (draft, approved_draft, approved_review, signing, done) and the intent (share for review before a later stage). It also names the alternative get-document-info to pre-read blockers, so the routing decision is fully prescribed.

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

move-document-to-signing-stageMove document to signing stageA
Destructive
Inspect

Moves a document to the signing stage and invites signatories to sign.

Use this tool when:

  • The document's current stage is one of: draft, approved_draft, review, approved_review

  • You want to start the signing process

This stage transition may be blocked by checkpoints on the document, or by unresolved preconditions (missing signature blocks, unresolved proposals, mandatory dynamic fields without values, active editor sessions or working copies, etc.). A refusal here reports just the first problem it runs into; call get-document-info first and read workflow_state.stage_transitions.signing.blockers to see everything that is in the way at once.

If the document has a signature_type set, the signature_type argument - if provided - must match it; otherwise the document's signature_type will be used. If the document has no signature_type, the one provided here (or the account default) will be used.

A qes or aes_eid signature_type requires sequential_signing=true. aes_eid is only available when the account has enabled AES (eID) in its settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageNoCustom message included in the signatory invitation email. If not sent, falls back to the document's external_signatory_invitation_message.
document_uuidYesUUID of the document to move to signing. If you don't already have the document's UUID, use the list-documents tool to find it.
signature_typeNoSignature security level to use. If not sent, either the document's assigned signature_type or the account default will be used.
sequential_signingNoIf true, signatories sign in the order defined by their signing_order. Cannot be false when signature_type is qes or aes_eid. If not sent, the document's current setting is used.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned
workflow_stateNoGives an indication of which stage transitions, etc are possible to perform on this document. This object is technical state, not display content: when relaying it to the user, always render it as natural-language prose and never echo raw field names or snake_case values (e.g. say 'signing cannot be started yet because not every signature block has been assigned to a signatory' instead of mentioning 'can_start_signing' or 'signature_block_signatory').

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say destructiveHint=true and openWorldHint=true; the description goes well beyond by disclosing the signatory-invitation side effect, the checkpoint/precondition blockers that can refuse the move, and the fact that a refusal reports only the first problem while get-document-info surfaces all of them. That is exactly the kind of behavioral context an agent needs before invoking a mutating, irreversible action.

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

Conciseness4/5

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

Front-loads the action, then a scannable bulleted when-to-use block, then blocker and parameter logic. It is dense and slightly long, but every sentence (blockers, refusal behavior, precedence, sequential_signing constraint) carries actionable information rather than filler.

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

Completeness5/5

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

For a multi-step, blockage-prone mutation, the description covers preconditions, failure behavior, the diagnostic alternative, and cross-parameter constraints. An output schema exists, so return values need not be described, and nothing an agent needs to call this correctly is missing.

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, but the description adds real meaning beyond it: the precedence rule that a provided signature_type must match the document's existing one, and the requirement that qes/aes_eid force sequential_signing=true with aes_eid gated on account settings. The message and document_uuid semantics are left entirely to 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?

States a specific verb ('Moves') + resource ('a document') + target stage ('signing stage') and the immediate side effect ('invites signatories to sign'). This clearly separates it from move-document-to-review-stage and move-document-to-done-stage without needing to open any schema.

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

Usage Guidelines5/5

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

Provides an explicit 'Use this tool when' block with the exact set of valid current stages (draft, approved_draft, review, approved_review) plus the intent condition. It also routes the agent to the alternative get-document-info when a transition is blocked, so both when-to-use and a diagnostic fallback are spelled out.

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

replace-template-contentReplace template contentA
Destructive
Inspect

Replaces the ENTIRE content of a draft template from an HTML string in a single destructive write.

Use this tool ONLY when:

  • You are authoring the initial content of an empty, freshly created template (e.g. after create-template-from-scratch), or

  • The user has explicitly asked to discard the current content and rewrite the whole template.

This is the right tool for laying down a large body of content at once (e.g. a whole NDA). It writes the whole template body in one go; there is no way to edit an individual node.

Do NOT use this tool to edit a template that already has content. Overwriting throws the existing content away. If the template already has content, this tool refuses to run unless you pass replace_existing_content=true to confirm the destructive overwrite. Read the current content with get-template-html first, so anything worth keeping can be carried over into the new HTML.

Overwriting an existing body cannot be undone, so ask the user to confirm it before passing replace_existing_content=true.

Only allowed on unpublished (draft) templates. Once a template is published its content can no longer be changed with this tool.

Use the same data-* attribute conventions as get-template-html. UUIDs present on nodes (e.g. data-uuid on a paragraph or heading) are preserved; nodes without a UUID are assigned one automatically. The returned HTML reflects the stored result, with every addressable node carrying a data-uuid you can use in subsequent operations.

Each data-uuid identifies exactly one node, so no two nodes may carry the same one. When you copy an existing node to build a similar one, drop its data-uuid (a fresh one is assigned on write) - reusing it is rejected and nothing is written at all. A cross-reference is the one exception: it carries the uuid of the clause it points at rather than one of its own, so that uuid appears twice by design.

Numbering follows the source. A block the source numbers becomes an ordered list node; a block it does not keeps the tag it had - an stays an , prose stays a . A source that numbers nothing gets no list node at all: a contract written entirely as headings and paragraphs is a correct result.

Headings go three levels deep, to . An or deeper is rejected and nothing is written, so carry a hierarchy past three levels with nested list nodes rather than with a deeper heading.

The numbers themselves are ALWAYS computed by fynk, never typed into the text. HTML whose text starts with a clause marker ("1. Confidentiality", "2)", "(a)", "iv.", "§ 5") is rejected and nothing is written. Where the source numbers a clause, wrap it in an ordered list node instead:

<div data-list data-kind="ordered" data-numbering-type="continue"><p>Confidentiality.</p></div>
<div data-list data-kind="ordered" data-numbering-type="continue"><p>Term.</p></div>

Nest another such <div data-list> inside a clause to create sub-clauses (1.1, 1.2). fynk computes the numbers (1., 2., 1.1., …) automatically and returns them as read-only data-number attributes, which are ignored on input.

To cross-reference a clause, give that clause a data-uuid of your own - any uuid you generate, as long as it appears on exactly one node - and point the reference at it:

<div data-list data-kind="ordered" data-uuid="11111111-1111-4111-8111-111111111111">
    <p>Confidentiality.</p></div>
…
<p>As set out in <span data-section-ref data-uuid="11111111-1111-4111-8111-111111111111"></span>,
notices are written.</p>

which renders the clause's computed number ("1.") in place of the reference, following it wherever the clause moves rather than hardcoding it. Both go in the same call: there is no need to write the body first and read the uuids back. A cross-reference carrying no data-uuid points at nothing and is rejected, so drop the reference where you have no clause to name.

A list node decides how its own number is rendered, so any scheme a source document uses is computed rather than typed:

  • data-numbering-style: decimal (default), upper-roman, lower-roman, upper-alpha, lower-alpha.

  • data-delimiter-style: dot (default, "1."), parenthesis ("1)"), double-parenthesis ("(1)"), section-mark ("§ 1").

  • data-numbering-type: continue (default) carries on from the preceding list node, restart begins a new count at 1.

  • data-show-nested-order-representation: true (default) prefixes a nested clause with its parent's number ("10.1."), false numbers it on its own ("1.", "(a)"). Leave it on where the clause continues the parent's count (1.1., 1.2.), turn it off where the clause has a style of its own that reads wrong with the parent in front of it ("X.1.", "1.(a)").

A heading never carries a number, so a section the source numbers is a list node holding its clauses as nested list nodes - not an followed by clauses. One list node is one number: its own text is its first paragraph, so every clause of its own beside that paragraph needs its own nested :

<div data-list data-kind="ordered" data-numbering-style="upper-roman" data-numbering-type="restart">
    <p>Subject of the lease</p>
    <div data-list data-kind="ordered" data-numbering-type="restart" data-show-nested-order-representation="false"><p>The lessor lets the premises.</p></div>
    <div data-list data-kind="ordered" data-numbering-type="continue" data-show-nested-order-representation="false"><p>The premises comprise.</p></div>
</div>

which fynk numbers I., 1., 2., with the next such section continuing at II. Writing those two clauses as plain inside the section instead numbers the section I. and leaves both clauses with no number at all.

Where the source's section titles carry no number, the section stays an with its prose as plain beneath it. A list node placed beside such a heading numbers the prose rather than the section, so every section reads "1." and its title ends up written twice.

The opposite mistake numbers prose that has no number of its own. Text belonging to a clause stays a plain beside the list node's own first paragraph:

<div data-list data-kind="ordered" data-numbering-type="continue">
    <p>Purpose</p>
    <p>The parties wish to explore a potential business relationship. Each may disclose confidential
    information to the other in the course of it.</p>
</div>

which fynk numbers 1., with the prose under it unnumbered. Nesting that paragraph in a of its own numbers it as well, leaving the section with a clause that is only its own body text.

To insert a dynamic field (a fill-in placeholder), reference it inline by its ref_uuid:

<span data-dynamic-field data-ref-uuid="<dynamic field ref_uuid>"></span>

Discover the available fields and their ref_uuids with get-template-info (include=["dynamic_fields"]), or create a new one with create-template-dynamic-field (which returns its ref_uuid). Referencing a ref_uuid that does not belong to the template is rejected.

Signatures are always placed as a signature container holding one or more signature blocks - even a single block needs one:

<div data-signatures data-align="left"><span data-signature-block data-ref-uuid="<signature block ref_uuid>"></span><span data-signature-block data-ref-uuid="<another ref_uuid>"></span></div>

Each inside the container points at one signature block by its ref_uuid; data-align is optional on the container (left, center, right, or justify; default left). A block placed outside a container, as , is legacy: it is still accepted so existing content can be written back unchanged, but it is stored as a container holding that one block.

Discover signature blocks and their ref_uuids with get-template-info (include=["signature_blocks"]), or create one with create-template-signature-block (which returns its ref_uuid). Referencing a ref_uuid that does not belong to the template (in either form) is rejected.

To reference a contracting party, point at it by ref_uuid and choose what is rendered with data-format:

<span data-party data-ref-uuid="<party ref_uuid>" data-format="name"></span>       (the party's entity/company name)
<span data-party data-ref-uuid="<party ref_uuid>" data-format="reference"></span>  (the party's reference name)

Other formats are "address" and "address:inline". A data-format is required and must be one of name/reference/address/address:inline. Discover parties and their ref_uuids with get-template-info, or create one with create-template-party. A ref_uuid not on the template, or a missing/invalid data-format, is rejected.

Images (<img data-image>), dynamic tables (<div data-dynamic-table>) and signing vote blocks (<span data-signing-vote-block>) cannot be created here — there is no way to author one through this tool. They can only be preserved: copy the tag exactly as get-template-html returned it, including its data-uuid / data-ref-uuid / data-table-uuid, and the underlying image or table is kept. Omitting the tag removes it from the template.

A block's layout cannot be authored here either. The margins, indent and line height a block is laid out with are kept per block and matched by data-uuid on a block of the same kind, so a block you copy over with the data-uuid it came with keeps the spacing it had. A block you write fresh is laid out the way the editor lays out a new block, and so is one you rewrite as a different kind of block - a paragraph turned heading. A style stating a margin, an indent or a line height is ignored; the text formatting inside the block - bold, colour, font, size, highlight - is not.

A block's alignment is authored here, as data-text-align on the paragraph, heading or list node carrying it - left, center, right or justify:

<h1 data-text-align="center">Mutual Non-Disclosure Agreement</h1>

A text-align style is not read, and any other value of the attribute counts as stating no alignment: a block you write fresh is then aligned left, and one you copy over with the data-uuid it came with keeps the alignment it already had - state data-text-align="left" to align such a block left again.

When you are laying down content derived from a source document (e.g. a PDF), create the parties, dynamic fields and signature blocks first, so this single write can reference them. Weaving them in afterwards costs a second, destructive rewrite of the whole body.

The response carries a warnings list alongside the stored HTML: advisory notes on what the template is still missing to behave as a template rather than as a flat copy of its source text - dynamic fields or signature blocks that exist but are placed nowhere, a body naming its parties as fixed text. The write succeeded either way, but act on them before reporting the template as finished.

Only available for templates with a prosemirror_data content type.

ParametersJSON Schema
NameRequiredDescriptionDefault
htmlYesFull HTML of the template content. Use the same data-* attribute conventions as get-template-html. Replaces the entire document
template_uuidYesUUID of the unpublished template whose content should be replaced
replace_existing_contentNoRequired confirmation (true) to overwrite a template that already has content. Omit (or false) for empty templates. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
htmlNoThe stored template content serialised back to HTML. Addressable nodes carry a data-uuid attribute usable in subsequent operations.
warningsNoAdvisory notes on what the stored template is still missing to work as a template: dynamic fields or signature blocks that exist but are placed nowhere, a body naming its parties as fixed text. The write succeeded; act on these before reporting the template as finished.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare destructiveHint=true and readOnlyHint=false; the description adds far more — refusal unless replace_existing_content=true, draft-only (unpublished) restriction, non-undoable overwrite requiring user confirmation, UUID preservation/rejection rules, automatic number computation, rejected-input conditions, and the warnings list in the response.

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

Conciseness4/5

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

Front-loads the destructive warning and the when-to-use rules before any format detail, and uses bullets, code samples and short paragraphs rather than a wall of prose. It is nevertheless extremely long (roughly 1,500 words) with section-level formatting rules that border on product documentation, so it is not maximally economical.

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 destructive, complex HTML-authoring mutation, nothing an agent needs is missing: prerequisites (draft + prosemirror_data content type), confirmation flow, reference-resolution rules, unsupported elements (images, dynamic tables, vote blocks must be copied verbatim), and the advisory warnings returned alongside the HTML. The output schema covers return structure, so the description need not explain it further.

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 the baseline is 3. The description goes well beyond the schema's one-line html description by spelling out the full data-* convention contract, the semantics of data-uuid reuse, and the confirm-to-overwrite behaviour of replace_existing_content. It is diffuse (spread through an authoring guide rather than focused per parameter), which keeps it from a 5.

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

Purpose5/5

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

States a specific verb and resource — replaces the ENTIRE content of a draft template from an HTML string in a single destructive write — and explicitly distinguishes itself from node-level editing ('there is no way to edit an individual node'). An agent can tell this apart from get-template-html, create-template-from-scratch and the create/update-*-party field tools without opening a schema.

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?

Gives an explicit 'Use this tool ONLY when' with two bullets, a matching 'Do NOT use this tool to edit a template that already has content', and names the alternative workflow (read with get-template-html first). It also routes creation of dependent entities to create-template-party / create-template-dynamic-field / create-template-signature-block and warns to do so before this write.

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

restore-documentRestore documentA
Destructive
Inspect

Restores an archived document, making it show up in the account's default document lists again.

Use this tool when:

  • An archived document should become actively used again

  • The user asks to restore or unarchive a document

The document must currently be archived. Archived documents do not appear in list-documents results by default: pass filter_archived_state: "archived" to the list-documents tool to find them.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_uuidYesUUID of the archived document to restore. If you don't already have the document's UUID, use the list-documents tool with filter_archived_state set to "archived" to find it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
created_atNoWhen the document was created.
updated_atNoWhen the document was last updated.
archived_atNoWhen the document was archived. Absent when the document is not archived.
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation profile is covered structurally. The description adds a genuine precondition (document must be archived) and states the resulting state change, though it does not spell out reversibility or that archiving is the inverse operation.

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

Conciseness5/5

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

Front-loads the effect in the first sentence, then uses tight bullets for the when-to-use conditions. Every sentence contributes; there is no filler or restated title.

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?

An output schema exists so return values need not be explained, the single parameter is fully described, and the prerequisite plus discovery path are covered. Nothing an agent needs to invoke this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single document_uuid parameter is fully documented in the schema, including the fallback to list-documents. The description restates the same guidance rather than adding new syntax or format detail, so the baseline of 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?

States a specific verb and resource ("Restores an archived document") plus the concrete observable effect (it reappears in default document lists). The inverse relationship to the archive-document sibling is made explicit through "restore or unarchive," so an agent can distinguish the pair without opening either schema.

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

Usage Guidelines5/5

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

Provides explicit when-to-use bullets and a hard precondition ("The document must currently be archived"). It goes further by telling the agent how to locate archived documents via the list-documents tool with filter_archived_state, closing the loop on the alternative path.

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

set-template-published-statePublish or unpublish templateA
Destructive
Inspect

Publishes a template, making it available to the whole account, or unpublishes it back to a draft.

Use this tool when:

  • A template is finished, the user has read it over and asks to publish it, release it or hand it to their colleagues

  • Documents are to be created from a template that is still a draft

  • The user asks to take a published template out of circulation

  • A published template's content has to be rewritten, which replace-template-content refuses until the template is a draft again

Publishing is what puts a template into service. list-templates shows a draft only to the users who manage templates, so until it is published nobody else can find it to create a document from. It also settles the body, which replace-template-content only writes while the template is a draft.

A template that was just authored is therefore left as a draft rather than published on the spot. Tell the user what was written, let them read it over, and publish once they say it is right. Confirm either direction with them: publishing offers the template to their colleagues, unpublishing takes it away from them.

Unpublishing changes nothing about the documents already created from the template. They keep the content they were created with; the template is simply no longer offered for new ones.

ParametersJSON Schema
NameRequiredDescriptionDefault
publishedYestrue publishes the template, making it available to the whole account. false returns it to a draft, which only users who manage templates see and which replace-template-content can rewrite.
template_uuidYesUUID of the template to publish or unpublish. Use list-templates to find it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the template in fynk. Only present when your user has template editing permission
nameNoName of the template
uuidNoUnique identifier for the template. Do not show to the user unless they ask for it
localeNoLocale code, e.g. en-GB, de-AT. Prefer describing the locale in natural language (e.g. 'British English') rather than showing the raw code.
publishedNoIndicates if the template is published (true) or a draft (false). Only published templates can be used by users without template management permission
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this template creates. Absent when the template has no type assigned

TDQS

A4.8/5.0
Behavior5/5

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

Annotations flag destructiveHint=true and readOnlyHint=false, and the description goes well beyond that by disclosing the visibility model (drafts are visible only to template managers), the coupling with replace-template-content, and the important side-effect boundary that unpublishing leaves already-created documents untouched. It also sets an interaction expectation by instructing the agent to confirm before flipping state.

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

Conciseness4/5

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

The opening sentence is front-loaded and the bullet list is scannable and action-oriented. It runs long for a two-parameter boolean toggle, and a few sentences restate the same point ('publishing is what puts a template into service' echoes the opening), so it is efficient but not maximally tight.

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 low-complexity, two-parameter state toggle with an output schema (so return values need no explanation) and full annotation coverage, the description supplies everything an agent needs: direction semantics, prerequisites, visibility consequences, and the sibling it interacts with. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns extra credit by spelling out the practical consequences of each boolean value (account-wide availability vs. draft visibility and rewritability) and by noting that unpublishing has no retroactive effect on existing documents. It does not add UUID format or sourcing detail beyond what the schema already says.

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

Purpose5/5

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

The description states a precise verb pair (publish/unpublish) plus the resource (template) and the resulting state change ('available to the whole account' vs 'back to a draft'). It is clearly distinguishable from siblings such as create-template-from-scratch and replace-template-content, which it explicitly contrasts.

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

Usage Guidelines5/5

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

It enumerates concrete when-to-use triggers (template finished, documents needed from a draft, taking a template out of circulation, content rewrite blocked by replace-template-content) and names the sibling that fails without this call. It also gives the when-not/workflow rule: leave newly authored templates as drafts and confirm either direction with the user.

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

update-account-document-typeUpdate account document typeA
Destructive
Inspect

Change a document type the account can see, whether it is one of the account's own types or one of fynk's system document types.

Use this tool when:

  • The user asks to rename a document type, or to change what it covers

  • AI analyses keep picking the wrong document type, or miss one, and its prompt needs sharpening

  • The user asks to change which metadata fields are relevant for documents of a type

  • The user asks to put one of fynk's document types back to how fynk provides it

  • The user asks to bring back one of fynk's document types that was removed from the account

document_type_uuid comes from list-account-document-types; request include=["details"] there to see a type's current description and prompt. Send only the arguments that should change; everything left out keeps its current value. Sending null for description or prompt clears it.

list-account-document-types marks fynk's own document types with provided_by_fynk, and those this account has customised with customised as well. A change to one of fynk's types applies to this account alone. The first change to one that is not customised yet replaces it, for this account, with a customised copy that has a uuid of its own, and moves the account's documents and templates onto it; use the uuid this tool returns from then on. That first change must include name, because the copy carries its name as written here in every language the account's users read fynk in, instead of fynk's translations. So send the name the user knows the type by, e.g. "Non-Disclosure Agreement", rather than a respelling of the listed name.

Send reset_to_fynk_default: true on its own for a customised type to drop the customisation, putting fynk's own name, description and prompt back and moving the documents and templates back onto it. The type's uuid changes back to fynk's, which this tool returns.

A type that list-account-document-types reports as deactivated (with filter_state "deactivated" or "all") is one of fynk's that was removed from the account. Send reactivate: true on its own to bring it back as fynk provides it; customise it afterwards with a further call.

prompt is what fynk's AI analyses read when deciding whether a document is of this type. Phrase it as a selection criterion, the way fynk's own types do: "Select this type if the document defines the terms under which a tenant rents property from a landlord, including rent amount, duration, deposit, and usage conditions."

relevant_metadata_uuids replaces the metadata fields specifically relevant for the type, which decides the fields fynk's AI analyses look for in documents of this type. Send every field that should remain: one left out is no longer extracted from the type's documents, though values already recorded stay. Fields relevant for every document type apply regardless and are unaffected. list-account-metadata reports the current state: each field there names the document types it is relevant for.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name of the document type, unique among the account's document types, in Title Case (max 255 characters), e.g. "Supplier Framework Agreement". Required on the first change to one of fynk's document types
promptNoSelection criterion the AI analyses use to decide whether a document is of this type (max 1024 characters), phrased like "Select this type if the document ...". null clears it, after which the analyses rarely pick the type
reactivateNoOnly true, sent on its own: brings back one of fynk's document types that is deactivated for this account, with its default settings
descriptionNoOne sentence describing what the document type covers, shown to users (max 1024 characters). null clears it
document_type_uuidYesUuid of the document type to change, from list-account-document-types
reset_to_fynk_defaultNoOnly true, sent on its own: drops the account's customisation of one of fynk's document types, returning it to fynk's own configuration and uuid
relevant_metadata_uuidsNoReplaces the fields specifically relevant for this document type: uuids from list-account-metadata, of the account's own fields and system_reference fields. Send every field that should remain; an empty list or null leaves only the fields relevant for every document type

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoName of the document type
uuidNoIdentifier for the document type. Do not show to the user unless they ask for it
promptNoThe selection criterion fynk's AI analyses use to decide whether a document is of this type. Absent when it has none, in which case the analyses rarely pick the type.
customisedNoPresent, and true, only for a system document type that this account has customised. The customisation can be dropped again with update-account-document-type and `reset_to_fynk_default`
descriptionNoWhat the document type covers, as shown to users configuring it. Absent when it has none.
_entity_typeNoOnly relevant for tooling. Do not show to the user
provided_by_fynkNoPresent, and true, only for one of fynk's built-in system document types. The account can customise or deactivate such a type but never delete it. Absent for a type the account created itself

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only flag destructiveHint=true; the description goes far beyond that, disclosing that the first change to a non-customised fynk type replaces it with a customised copy with a new uuid, moves documents/templates onto it, and changes uuid again on reset. It also warns that omitting relevant_metadata_uuids stops future extraction (existing values persist) and that nulling prompt makes analyses rarely pick the type.

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

Conciseness4/5

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

Front-loaded with purpose and a scannable 'Use this tool when' list, then dense but necessary paragraphs on the customisation/uuid lifecycle. It is long and occasionally repetitive (the naming instruction is restated), but for a seven-parameter mutation tool with this many edge cases nearly every sentence carries required information.

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

Completeness5/5

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

With an output schema present, return values need not be explained, and the description still covers the uuid-changes-on-return behavior. Given the complexity of customisation, reactivation, and metadata replacement, the coverage is complete enough for an agent to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds real cross-parameter semantics: 'Send only the arguments that should change', null clears description/prompt, reset_to_fynk_default and reactivate must be sent on their own, and name is mandatory on the first change to a fynk type. It also gives phrasing guidance for prompt.

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?

Opens with a specific verb+resource+scope: 'Change a document type the account can see, whether it is one of the account's own types or one of fynk's system document types.' This distinguishes it cleanly from create-account-document-type, delete-account-document-type, and list-account-document-types, which are all named siblings.

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?

An explicit 'Use this tool when:' bullet list enumerates five concrete triggers (rename, sharpening a prompt, changing metadata relevance, resetting to fynk default, reactivating a removed type). It also routes the agent to list-account-document-types as the source of document_type_uuid and names the special single-argument cases, leaving little to inference.

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

update-account-metadataUpdate account metadataA
Destructive
Inspect

Change the definition of a metadata field the account can see, whether it is one of the account's own fields or a system_reference field provided by fynk.

Use this tool when:

  • The user asks to rename a metadata field, or to change what it holds

  • The user asks to start or stop having fynk's AI analyses fill a field in

  • The user asks to change which document types a field applies to

  • The user asks to put one of fynk's fields back to how fynk provides it

metadata_uuid comes from list-account-metadata. Send only the arguments that should change; everything left out keeps its current value. Sending null for description, prompt or keywords clears it.

A field's name and value_type are fixed at creation and this tool cannot change either. To rename a field for the people using it, change display_name - in Title Case, the way fynk's own fields are named ("Signing Date", "Contract Value").

fynk's own system_reference fields can be reconfigured per account: the change applies to this account alone and leaves the field as fynk defines it everywhere else, and putting an argument back to fynk's own value stops overriding it. fynk's other system field types (system, system_autofilled, system_computed) are maintained entirely by fynk and cannot be changed at all.

One of fynk's fields that an account has reconfigured reports the arguments it overrides as overridden_fields, from this tool and from list-account-metadata alike. Send reset_to_fynk_default: true on its own to drop all of them at once, leaving the account reading the field exactly as fynk provides it; there is no per-argument reset, so re-send whichever of them are still wanted afterwards.

select_values replaces the whole list of options, which are literally what a user picks from, so write them as presentable labels: "Net 30", not "net 30". They govern what can be chosen from now on and leave values already recorded on documents as they are, so prefer adding an option to renaming or removing one. Since the list is replaced wholesale, send every option that should remain: one left out is one taken away.

Taking away an option that documents already hold is refused until the user has confirmed it. Such a value stays on its document but can no longer be filtered for. The refusal names the options and how many documents and templates still use each - then repeat the call with confirmed_removing_options_in_use: true. Send that only in answer to such a refusal, never as a matter of course. reset_to_fynk_default is covered the same way, since putting fynk's own options back takes away any the account added to them.

Put the effect to the user in their own terms and ask before going ahead - "removing Net 90 would affect 3 documents that still use it, shall I go ahead?" - rather than quoting the refusal back at them.

prompt and keywords decide whether fynk's AI analyses fill this field in - a prompt puts the field into them, keywords only assist it and do nothing on their own. So set both together to have a field extracted, and clear prompt to take a field back out of the analyses and leave it to only be filled in by hand.

ParametersJSON Schema
NameRequiredDescriptionDefault
promptNoWhat the AI analyses should extract for this field, and what puts the field into them (max 1024 characters). Define what the value is, then qualify it the way fynk's own fields do - what counts, what does not, and what to do when the document is not explicit - over several sentences where that helps. The "Net Rent" field reads: "The net rent for the property, which is the rent excluding any taxes or costs e.g. VAT. It must be explicitly stated in the contract as net rent per month. Derive the currency unit from the parties to the contract if it is not explicitly stated." A single vague line extracts poorly. null takes the field back out of the analyses
keywordsNoComma-separated keywords that help the AI analyses locate the field in a document (max 1024 characters). List the terms as they would appear in a contract, including synonyms and the equivalents in other languages the account's documents are written in - the "Net Rent" field carries "net rent, netto miete, netto kaltmiete, kaltmiete, nettomiete pro monat". These have no effect without a `prompt`. null clears them
descriptionNoWhat the field holds, shown to users configuring it (max 1024 characters). null clears it
display_nameNoNew human-readable name shown in the UI, in Title Case (max 255 characters), e.g. "Discount Rate". The field's programmatic name cannot be changed
metadata_uuidYesUUID of the metadata field to update, as reported by list-account-metadata
select_valuesNoReplaces the whole list of options a user picks from, written as presentable labels, e.g. ["Net 30", "Net 60"]. Only for "select" and "multi_select" fields
is_contract_valueNoWhether the field counts towards a document's calculated contract value. Only allowed when the field's value_type is "currency" or "currency_duration"
reset_to_fynk_defaultNoSend true to drop everything this account has configured on one of fynk's "system_reference" fields, so that it reads the field exactly as fynk provides it. Only true is accepted, only for a field whose overridden_fields are not empty, and only on its own - no other argument may accompany it
relevant_document_type_uuidsNoReplaces the document types the field is meaningful for, as uuids from list-account-document-types. Send null or an empty list to make it meaningful for none; send relevant_for_all_document_types instead to make it meaningful for every one
relevant_for_all_document_typesNoSend true to make the field meaningful for every document type, including any added later. Only true is accepted, and not together with relevant_document_type_uuids
confirmed_removing_options_in_useNoSend true only once the user has confirmed - in answer to the refusal that named them - that select options this account's documents already hold should be taken away. A change that takes no such option away refuses it, so never send it as a matter of course

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoInternal name of the metadata field
typeNoThe type of the metadata field, which defines where its value comes from. account: Custom metadata fields that are specific to your account system_reference: Pre-defined useful metadata fields provided by fynk system_autofilled: Fields that are automatically filled by the system in response to events, like "Signing completion date" system_computed: Fields that are calculated by the system based on other metadata values. e.g. "Signing duration" is the difference between "Signing date" and "Signed date" system: Other system-provided metadata fields
uuidNoDo not show to the user unless they ask for it
settingsNoExtra configuration for the field. Not present means there is nothing to restrict
value_typeNoControls the kinds of values that can be assigned to the metadata
_entity_typeNoOnly relevant for tooling. Do not show to the user
display_nameNoHuman-readable name of the metadata field
select_valuesNoWhen value_type is "select" or "multi_select", defines the allowed values. For these types of metadata, ONLY these values are possible. Absent for every other value type
is_contract_valueNoWhether this field counts towards a document's calculated contract value. Only meaningful when value_type is "currency" or "currency_duration"
overridden_fieldsNoOnly for a "system_reference" field the account has configured differently to how fynk provides it, and absent otherwise: the update-account-metadata arguments it has changed, e.g. ["display_name", "select_values"]. Send reset_to_fynk_default to that tool to put all of them back
relevant_document_typesNoNames of the document types this field is meaningful for. Empty together with relevant_for_all_document_types false means the field is not in use for any document type, so charting it will likely produce no data
relevant_for_all_document_typesNoWhen true, the field is meaningful for every document type and relevant_document_types is empty

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, and the description adds substantial context beyond them: null-clearing semantics, wholesale replacement of `select_values`, refusal behavior when in-use options are removed (including the refusal naming affected documents), the reset-only-on-its-own constraint, and the fact that `system`, `system_autofilled`, and `system_computed` fields cannot be changed at all. It also explains the `overridden_fields` reporting and that reset has no per-argument counterpart.

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

Conciseness4/5

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

The description is long but front-loads purpose and a scannable when-to-use list before descending into edge cases. For an 11-parameter destructive mutation with a two-step confirmation flow, most sentences earn their place, though a few points (e.g. the AI-extraction explanation) could be tightened without losing meaning.

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?

An output schema exists, so return-value explanation is unnecessary, and the description covers everything else an agent needs: source of `metadata_uuid`, mutation semantics, immutable fields, confirmation escalation, reset behavior, and the phrasing to use when confirming with a user. No material gap is left for this complex destructive 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 description coverage is 100%, so the baseline is 3, but the description adds cross-parameter rules the schema does not state as clearly: only changed arguments should be sent, `reset_to_fynk_default` must travel alone, `confirmed_removing_options_in_use` is only valid in answer to a refusal, and `prompt`/`keywords` must be set together. These interaction constraints materially improve correct invocation.

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 first sentence states a specific verb and resource ('Change the definition of a metadata field the account can see') and draws the scope boundary between the account's own fields and fynk's `system_reference` fields. The bulleted use cases (rename, AI fill, document-type applicability, reset) make it immediately distinguishable from create-account-metadata and delete-account-metadata.

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

Usage Guidelines5/5

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

Explicit when-to-use bullets cover all four use cases, and the text routes the agent to `list-account-metadata` for `metadata_uuid`, to `display_name` for renames (versus the immutable `name`), and to `reset_to_fynk_default` versus per-argument re-sends. The confirmation flow for destructive option removal is spelled out as a conditional ('Send that only in answer to such a refusal, never as a matter of course').

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

update-account-tagUpdate account tagA
Destructive
Inspect

Update an existing tag's name and/or color.

Use this tool when:

  • The user asks to rename a tag

  • The user asks to change a tag's color

tag_uuid is required. Send only the fields that should change.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew display name for the tag (max 40 characters)
colorNoNew hex color code (e.g. "#FF0000")
tag_uuidYesUUID of the tag to update

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoName of the tag
uuidNoIdentifier for the tag. Do not show to the user unless they ask for it
colorNoHex color code for the tag (e.g. "#FF0000")
_entity_typeNoOnly relevant for tooling. Do not show to the user

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered. The description adds genuine behavioral context with 'Send only the fields that should change', clarifying this is a partial/merge update rather than a full replacement. It does not, however, say what happens to omitted fields, whether names must be unique, or why the operation is flagged destructive.

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

Conciseness4/5

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

The purpose sentence is front-loaded and the bulleted trigger list is easy to scan. It is slightly longer than strictly necessary for such a simple operation, but no sentence is wasted.

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?

An output schema exists, so return values need not be explained, and the tool is a simple 3-parameter partial update. The description is nearly complete for that scope; only edge cases like name-collision or uniqueness behavior are absent.

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% and all three parameters are documented in the schema (including the 40-character limit and hex format), so the schema carries the parameter detail. The description adds marginal value by flagging tag_uuid as required and reinforcing partial-update semantics, which is consistent with the baseline 3 when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb (update) and resource (an existing tag) plus the two mutable fields (name, color). An agent can distinguish this from create-account-tag, delete-account-tag and list-account-tags by name alone, though the description never explicitly names those 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?

The 'Use this tool when' block gives two explicit triggering intents (rename a tag, change a tag's color), which is clear positive guidance. It stops short of stating when NOT to use it or pointing to create-account-tag / delete-account-tag as the alternatives for other tag operations.

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

update-account-teamUpdate account teamA
Destructive
Inspect

Update an existing team's name and/or icon.

Use this tool when:

  • The user asks to rename a team

  • The user asks to change a team's icon

team_uuid is required. Send only the fields that should change.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoNew icon identifier
nameNoNew display name for the team
team_uuidYesUUID of the team to update

Output Schema

ParametersJSON Schema
NameRequiredDescription
iconNoIcon identifier for the team (e.g. "UserGroupIcon")
nameNoName of the team
uuidNoIdentifier for the team. Do not show to the user unless they ask for it
_entity_typeNoOnly relevant for tooling. Do not show to the user

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered structurally. The description adds a genuine behavioral trait the annotations cannot express: partial-update semantics ('Send only the fields that should change'), which tells the agent omitted fields are preserved rather than cleared. It does not address permissions, error behavior, or how this squares with the destructive hint, so it is not a 5.

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?

Front-loaded one-line statement of what the tool does, followed by a tight trigger list, then the two operational rules. No filler, no restatement of the title, and the required-parameter note is brief enough not to be waste.

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?

An output schema exists, so return values need no explanation, and annotations carry the safety profile; what remains for the description is usage routing and edit semantics, both of which are present. It lacks any note on what happens if team_uuid is invalid or an icon value is rejected, a minor gap for a simple 3-parameter update.

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

Parameters4/5

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

Schema coverage is 100%, so the three parameters are already documented and the baseline is 3. The description adds meaning the schema cannot convey: that name and icon are individually optional and only supplied fields are modified, plus reinforcement that team_uuid is mandatory. This is a modest but real value-add over the schema.

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

Purpose4/5

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

The description names a specific verb ('Update') and resource ('an existing team') and scopes exactly which fields are affected (name and/or icon), which is more precise than the title 'Update account team'. It does not explicitly contrast itself with neighbors like create-account-team or delete-account-team, but the operation is unambiguous without a schema 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?

It gives two concrete trigger conditions ('user asks to rename a team', 'user asks to change a team's icon'), which is real when-to-use guidance. It stops short of any exclusion or alternative-tool routing, so an agent gets no explicit 'do not use this for X' signal.

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

update-documentUpdate documentA
Destructive
Inspect

Updates a document's name, locale, document type, signing settings and/or external signatory invitation message.

Use this tool when:

  • A document should be renamed

  • The document's content language (locale) or document type should change

  • The signature type or sequential signing setting should change before signing starts

  • The message included in the email inviting external signatories should be set or changed

All arguments except document_uuid are optional and only need to be sent if their value should change. signature_type and sequential_signing cannot be changed once signing has started, and signature_type cannot be changed if it was specified by the document's template. Use the list-account-document-types tool to discover valid document type UUIDs. This tool cannot change the document's stage (use the move-document-to-*-stage tools for that).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name for the document
localeNoNew locale code for the document content, e.g. en-GB, de-AT
document_uuidYesUUID of the document to update. If you don't already have the document's UUID, use the list-documents tool to find it.
signature_typeNoeIDAS assurance level to use when signing the document. aes_eid is only accepted when the account has enabled AES (eID). Cannot be changed once signing has started or if the value was specified by the template
document_type_uuidNoUUID of the document type to assign. Pass null to remove the current document type. Use the list-account-document-types tool to find valid UUIDs
sequential_signingNoWhen true, signatories will sign one at a time, in ascending order of their signing_order. Cannot be changed once signing has started
external_signatory_invitation_messageNoText to display in the email notification sent to external signatories when the document is ready for signing

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
localeNoLocale code, e.g. en-GB, de-AT. Absent when the document has none set. Prefer describing the locale in natural language (e.g. 'British English') rather than showing the raw code.
originNoHow the document was created.
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned
signature_typeNoeIDAS assurance level used when signing the document. Absent when none has been chosen.
sequential_signingNoWhen true, signatories sign one at a time, in ascending order of their signing_order.
source_template_uuidNoUUID of the template the document was created from. Absent when it was not created from a template.
external_signatory_invitation_messageNoText shown in the email inviting external signatories to sign. Absent when no message is set.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations declare destructiveHint=true, and the description adds real behavioral context beyond them: conditional mutation limits, template-derived immutability, and that all non-UUID args are optional. It doesn't explain what makes the operation 'destructive' (e.g. passing null to remove the document type), which is the one gap.

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

Conciseness4/5

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

Front-loaded summary sentence followed by scannable bullets and a constraints paragraph; well organized. Slightly verbose, but nearly every sentence carries distinct operational information.

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?

Output schema exists, so return values need not be described. For a 7-param mutation tool the description covers scope, optionality, constraints, and the relevant sibling alternatives, leaving no critical gap for correct invocation.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds meaningful semantics: every argument except document_uuid is optional and only sent when changing a value, plus constraints on signature_type/sequential_signing and the discovery tool for document_type_uuid.

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

Purpose5/5

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

States a specific verb (Updates) and resource (a document) and enumerates exactly which fields can change: name, locale, document type, signing settings, external invitation message. It explicitly routes stage changes to the `move-document-to-*-stage` tools, distinguishing it 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 Guidelines5/5

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

Provides explicit when-to-use bullets and names the alternative tool for stage changes. It also states the preconditions (signature_type and sequential_signing cannot change once signing started, signature_type cannot change if set by template), leaving nothing to inference.

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

update-document-dynamic-fieldsUpdate document dynamic fieldsA
Destructive
Inspect

Update the value of one or more of a document's dynamic fields.

Use this tool when:

  • You want to fill in (or change) values for fields like text inputs, dates, numbers, or selects on a document

  • A user asks to set values that signing requires before it can begin (mandatory dynamic fields)

Each entry in dynamic_field_values identifies the field by its ref_uuid or name (use get-document-info with include=["dynamic_fields"] to discover them) — sending the wrong key will fail validation.

Take note of the field's type when constructing the value. These are the rules to use when constructing the value string:

  • number: the numeric value in a string, using '.' as the decimal separator -> "1234.56"

  • currency: concatenate the ISO currency code and the numeric value with a ';' -> "EUR;1000.10" (for one thousand Euro and ten cents)

  • currency_duration: same as currency, but append another ';' followed by either monthly or yearly -> "EUR;1000.10;monthly" / "USD;1000.10;yearly"

  • select: one of the options from the field's select_values list -> "red"

  • multi_select: an array of the selected values in the values field -> ["red", "blue"]

  • bool: either of the strings "true" (displayed to the user as "Yes") or "false" (displayed to the user as "No") -> "true" / "false"

  • duration: a PHP-compatible duration specification -> "P6D" (6 days), "P2W" (2 weeks), "PT12H" (12 hours)

  • date: the date in the format "YYYY-MM-DD" -> "2026-12-31"

  • email, text, textarea, or any type not listed above: a string -> "test@example.com"

To unset a dynamic field, send a null value.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_uuidYesUUID of the document whose dynamic fields are to be updated. If you don't already have the document's UUID, use the list-documents tool to find it.
dynamic_field_valuesNoNew values to apply (at most 10 per request). Signing can only start when all mandatory dynamic fields have values provided.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dynamic_fieldsNoThe fields that were updated

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag this as a destructive, non-read-only, closed-world mutation, and the description adds substantial behavioral context beyond that: wrong identifiers fail validation, null unsets a field, at most 10 entries apply per request, and mandatory fields gate signing. It also explains value-construction rules by field type, which materially reduces invocation errors.

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 long but front-loads purpose and usage before the necessary value-format rules. Every section earns its place because the dynamic field types have non-obvious string encodings that would otherwise cause validation failures. The bulleted formatting makes it scannable despite the length.

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 a destructive mutation tool with annotations, an output schema, and 100% schema description coverage, the description supplies everything else an agent needs: when to use it, how to discover identifiers, how to encode each field type, how to unset values, the 10-item limit, and the signing prerequisite. No important behavioral or parameter gap remains.

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 already 100%, but the description goes far beyond the schema by explaining how to construct values for each dynamic field type, including number, currency, currency_duration, select, multi_select, bool, duration, date, email/text/textarea, and the null-unset convention. It also clarifies that each entry identifies the field by ref_uuid or name. This is rich semantic guidance that the schema alone does not provide.

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 names a specific verb and resource: update the value of one or more of a document's dynamic fields. It clearly distinguishes this from document-level updates and template-field updates by scoping to a document's dynamic field values. An agent can identify the tool from the description alone.

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

Usage Guidelines4/5

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

The description gives explicit usage contexts: filling or changing text/date/number/select values, and satisfying mandatory dynamic fields required before signing. It also points to get-document-info for discovering field identifiers. However, it does not explicitly state when not to use this tool or name sibling alternatives such as update-template-dynamic-field.

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

update-document-metadata-valuesUpdate document metadata valuesA
Destructive
Inspect

Set or unset the value of one or more of a document's metadata.

Use this tool when:

  • You want to fill in (or change) a document's metadata values

  • You want to remove a value the document currently has for a metadata

Each entry in metadata_value_changes identifies the metadata by its metadata_uuid or name (use list-account-metadata, or get-document-info with include=["metadata_values"], to discover them) — sending an identifier that does not match any of the account's metadata will fail validation.

Each entry also has an operation:

  • set: create the metadata value (if the document does not have one yet) or update the existing value

  • unset: remove the document's value for the metadata (no value is required)

For a set, take note of the metadata's value_type when constructing the value. These are the rules to use when constructing the value string:

  • number: the numeric value in a string, using '.' as the decimal separator -> "1234.56"

  • currency: concatenate the ISO currency code and the numeric value with a ';' -> "EUR;1000.10" (for one thousand Euro and ten cents)

  • currency_duration: same as currency, but append another ';' followed by either monthly or yearly -> "EUR;1000.10;monthly" / "USD;1000.10;yearly"

  • select: one of the options from the metadata's select_values list -> "red"

  • multi_select: an array of the selected values in the values field -> ["red", "blue"]

  • bool: either of the strings "true" (displayed to the user as "Yes") or "false" (displayed to the user as "No") -> "true" / "false"

  • duration: a PHP-compatible duration specification -> "P6D" (6 days), "P2W" (2 weeks), "PT12H" (12 hours)

  • date: the date in the format "YYYY-MM-DD" -> "2026-12-31"

  • email, text, textarea, or any type not listed above: a string -> "test@example.com"

Some metadata cannot be changed this way (e.g. computed metadata, or metadata whose value is driven by a dynamic field) — attempting to do so will fail validation.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_uuidYesUUID of the document whose metadata values are to be updated. If you don't already have the document's UUID, use the list-documents tool to find it.
metadata_value_changesNoThe metadata value changes to apply (at most 10 per request)

Output Schema

ParametersJSON Schema
NameRequiredDescription
unset_metadataNoThe metadata whose values were removed by `unset` changes (an `unset` of a metadata that had no value is omitted)
set_metadata_valuesNoThe metadata values that were created or updated by `set` changes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation risk is covered structurally. The description adds real behavioral context on top: identifier mismatches fail validation, unsupported metadata types fail validation, and per-value_type construction rules. It stops short of saying whether an unset is recoverable or what happens on partial failure of a multi-entry batch, which keeps it from a 5.

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

Conciseness4/5

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

The when-to-use block and per-type value rules are front-loaded and each bullet carries necessary information an agent would otherwise have to guess. It is long, but the length is largely earned; the only marginal cost is the exhaustive type enumeration, which could be slightly tighter.

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 destructive, nested-array mutation tool, the description covers the operation semantics, the identifier resolution path, the max-10 batch constraint, value serialization per type, and the failure conditions. An output schema exists, so return values need no explanation here. Nothing an agent needs to call this correctly is missing.

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% (baseline 3), and the description goes well beyond it. It explains that identifier accepts either metadata_uuid or name, that operation set creates-or-updates while unset removes, and it supplies exact value formats for number, currency, currency_duration, select, multi_select, bool, duration, date, and text types — meaning an agent can construct valid input without guessing.

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

Purpose5/5

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

The description states a precise verb and resource: set or unset the value of one or more of a document's metadata. It is trivially distinguishable from neighbors such as update-document-tags, update-document-dynamic-fields, or update-document itself, since it names the exact object being mutated and the exact operations available.

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

Usage Guidelines5/5

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

It has an explicit 'Use this tool when' block covering both the set and unset intents, and it names the discovery alternatives (list-account-metadata, get-document-info with include=["metadata_values"]) that must be consulted first. It also states a when-not: computed metadata or metadata driven by a dynamic field cannot be changed and will fail validation.

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

update-document-partyUpdate document partyA
Destructive
Inspect

Edit the details of a party on a document.

Use this tool when:

  • A party's reference, entity type, entity name, address, or scope needs to change on an existing document

document_uuid and party_identifier (a ref_uuid, reference, or entity_name of a party on the document) are required to identify the party. All other arguments are optional and only need to be sent if their value should change. For parties linked to an account party, only party_reference can be changed — attempting to update other fields will fail.

ParametersJSON Schema
NameRequiredDescriptionDefault
party_scopeNoNew scope. Cannot be set when the party's is_internal is true
document_uuidYesUUID of the document containing the party to update. If you don't already have the document's UUID, use the list-documents tool to find it.
party_addressNoNew address. Cannot be set when the party's is_internal is true
party_referenceNoNew generic reference for the party
party_identifierYesref_uuid, reference, or entity_name identifying the party to update on the document
party_entity_nameNoNew entity name. Cannot be set when the party's is_internal is true

Output Schema

ParametersJSON Schema
NameRequiredDescription
uuidNoIdentifier for the party - unique to the specific instance of the party. Do not show to the user unless they ask for it
addressNoThe party's address. Absent when not yet known
ref_uuidNoA static reference identifier, allowing parties in documents to be matched their corresponding party in the document's source template. Do not show to the user unless they ask for it
referenceNoA generic reference for the party. e.g. "Customer", "Employee", etc
entity_nameNoThe actual name of the party. Absent when not yet known
is_internalNoTrue if the party belongs to this account
_entity_typeNoOnly relevant for tooling. Do not show to the user

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, openWorldHint=false. The description goes beyond them by disclosing a non-obvious failure mode — for account-linked parties only party_reference is mutable and other field updates will fail — plus the partial-update semantics ('only need to be sent if their value should change').

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?

Front-loads the one-line purpose, then the when-to-use condition, then required vs optional parameters, then the key constraint. Every sentence carries information and there is no filler.

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

Completeness5/5

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

An output schema exists so return values need no explanation, and annotations cover the safety profile. Combined with 100% schema coverage and the explicit account-party constraint, an agent has everything needed to call it correctly.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3. The description adds real value on top: it defines party_identifier as a ref_uuid, reference, or entity_name, and clarifies that non-required fields are conditional partial updates. The enum and is_internal constraints live in the schema, so this is additive rather than duplicated.

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

Purpose5/5

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

States a specific verb (edit/update) and resource (a party on a document), and the field-enumeration ('reference, entity type, entity name, address, or scope') makes it unambiguous. It is clearly distinguishable from siblings like update-document, create-document-party, and update-template-party.

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 explicit 'Use this tool when' clause gives a clear triggering condition (a party field on an existing document needs to change). It stops short of naming sibling alternatives such as create-document-party for adding a new party, so the agent must infer the add-vs-edit boundary.

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

update-document-signatoryUpdate document signatoryA
Destructive
Inspect

Edit the details of a document signatory.

Use this tool when:

  • A signatory's name, title, mobile phone, or party assignment needs to change before signing starts

  • You need to move an existing signatory to a different party on the document

document_uuid and signatory_email are required to identify the signatory. All other arguments are optional and only need to be sent if their value should change. For internal signatories (linked to an account user), signatory_first_name, signatory_last_name, and signatory_title cannot be changed — they come from the user's profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_uuidYesUUID of the document where the signatory is being updated. If you don't already have the document's UUID, use the list-documents tool to find it.
signatory_emailYesEmail address of the signatory to update.
signatory_titleNoNew job title. Cannot be changed if internal_user is true
signatory_last_nameNoSignatory's new last name. Cannot be changed if internal_user is true
signatory_first_nameNoSignatory's new first name. Cannot be changed if internal_user is true
signatory_mobile_phoneNoNew mobile phone number in E.164 format. Depending on the document's signature_type, may be required before signing can be started
signatory_party_identifierNoIf given, moves the signatory to this party. Must be a ref_uuid, reference, or entity_name of an existing party in the document

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoName of the signatory
uuidNoDo not show to the user unless they ask for it
emailNoEmail of the signatory
party_uuidNoUUID of the party this signatory belongs to. Absent if the signatory has not been assigned to a party yet, which prevents signing from being started. Do not show to the user unless they ask for it
_entity_typeNoOnly relevant for tooling. Do not show to the user
internal_userNotrue if the signatory has a fynk user in this account
signing_orderNoThe order in which this signatory signs

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=false, so the safety profile is largely covered. The description adds real context beyond that: the partial-update contract (only send arguments whose value should change) and the immutability of name/title fields for internal signatories. It doesn't spell out reversibility or the effect of a party move, keeping it at a 4.

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?

Front-loaded with the core action, then bulleted conditions, then the identification/optionality rule. Every sentence carries information an agent needs and there is no padding.

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 a destructive write tool with 7 parameters, 100% schema coverage and an existing output schema, the description supplies the missing pieces: identification requirements, partial-update behavior, and the internal-signatory constraint. Nothing an agent needs in order to call this correctly is absent.

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 a baseline of 3 applies. The description earns above that by stating which two parameters identify the signatory, that every other argument is optional and only needed when its value should change, and by restating the internal-signatory restriction on name/title fields — semantics the schema's null-typed properties do not convey.

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

Purpose4/5

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

The description opens with a specific verb+resource pair ('Edit the details of a document signatory') and enumerates the exact editable fields (name, title, mobile phone, party assignment). It implicitly separates itself from create/delete signatory siblings but never names an alternative tool, so it stops short of full sibling differentiation.

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

Usage Guidelines4/5

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

An explicit 'Use this tool when' block gives two concrete triggering conditions (field changes before signing starts, moving a signatory between parties), which is clear context. However, there is no explicit 'when not to use' clause and no named alternative (e.g. update-document-party), so it falls short of a 5.

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

update-document-tagsUpdate document tagsA
Destructive
Inspect

Adds tags to and/or removes tags from a document.

Use this tool when:

  • One or more tags should be added to a document

  • A tag should be removed from a document

  • A document's tag should be replaced with another (one remove and one add action)

Actions are applied on top of the document's current tags: tags not mentioned in tag_actions stay attached. Each tag may appear in at most one action per call. Adding an already-attached tag or removing a tag that is not attached has no effect. Use the list-account-tags tool to discover valid tag UUIDs, and the create-account-tag tool to create a new tag first if no suitable one exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
tag_actionsYesChanges to apply to the document's tags. Tags not mentioned stay attached
document_uuidYesUUID of the document whose tags to update. If you don't already have the document's UUID, use the list-documents tool to find it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
tagsNoThe tags on the document. Tags are the account's own classification labels (e.g. relationship type, commercial significance, region), so they show which categories this account uses and can be filtered on with filter_tags.
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=false, so the safety profile is known. The description adds genuinely useful behavior the annotations cannot convey: actions are applied on top of existing tags, unmentioned tags stay attached, each tag may appear in at most one action per call, and no-op cases (adding an attached tag, removing an unattached one) are harmless. It does not, however, address permissions or failure modes.

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

Conciseness4/5

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

Front-loaded with the core action, then well-organized bullets, then merge/idempotency rules. Slightly long, but every sentence carries information an agent needs to call the tool correctly.

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

Completeness5/5

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

With an output schema present and annotations covering the safety profile, the description supplies the remaining pieces: valid actions, merge semantics, idempotency behavior, and the discovery/creation tools needed to obtain tag UUIDs. An agent has everything required to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds a constraint not present in the schema: each tag may appear in at most one action per call, and tags not mentioned stay attached. This clarifies merge semantics for the tag_actions array beyond the property descriptions.

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

Purpose5/5

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

The first sentence names a specific verb (adds/removes) and resource (tags on a document), and the usage bullets clarify the three concrete operations including tag replacement. It is clearly distinguishable from siblings like update-account-tag, list-account-tags, and update-document.

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

Usage Guidelines5/5

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

Explicit 'use this tool when' bullets cover add, remove, and replace scenarios, and it names the prerequisites/alternatives: list-account-tags to discover UUIDs and create-account-tag to create a missing tag. Nothing is left to inference.

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

update-document-teamsUpdate document teamsA
Destructive
Inspect

Adds teams to and/or removes teams from a document.

Use this tool when:

  • A document should be assigned to one or more teams

  • A team assignment should be removed from a document

  • A document should be moved from one team to another (one remove and one add action)

Actions are applied on top of the document's current team assignments: teams not mentioned in team_actions keep their assignment. Each team may appear in at most one action per call. Adding an already-assigned team or removing a team that is not assigned has no effect. Use the list-account-teams tool to discover valid team UUIDs. Some accounts enforce team assignment, in which case the last remaining team cannot be removed.

ParametersJSON Schema
NameRequiredDescriptionDefault
team_actionsYesChanges to apply to the document's team assignments. Teams not mentioned keep their current assignment
document_uuidYesUUID of the document whose teams to update. If you don't already have the document's UUID, use the list-documents tool to find it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNoURL to open the document in fynk
nameNoName of the document
uuidNoUnique identifier for the document. Do not show to the user unless they ask for it
stageNoWhat stage the document is in currently
teamsNoThe teams the document is assigned to.
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_typeNoIf present, indicates what kind of document this is. Absent when the document has no type assigned

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the destructiveHint annotation: it discloses additive semantics (teams not mentioned keep their assignment), idempotency behavior (adding/removing a no-op has no effect), a per-call constraint (each team at most one action), and an account-level constraint (last remaining team cannot be removed).

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?

Front-loads the core action, then uses a scoped bullet list for scenarios followed by tightly packed behavioral notes. Every sentence carries distinct information; no redundancy with the schema.

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 annotations covering safety and an output schema handling the return, the description supplies everything else an agent needs: dependency tools, edge-case semantics, and account constraints. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds a cross-field constraint not present in the schema (each team may appear in at most one action per call) plus the additive override rule. Useful semantics beyond the structured 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?

States a specific verb (adds/removes) on a specific resource (teams on a document), clearly differentiating it from siblings like update-document-tags or update-document-party. An agent can tell exactly what this tool mutates.

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 enumerates the three scenarios (assign, remove, move) and names the dependency tool list-account-teams for discovering valid UUIDs. When-to-use is stated, not inferred.

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

update-template-dynamic-fieldUpdate template dynamic fieldA
Destructive
Inspect

Update an existing dynamic field on a template.

Use this tool when:

  • The user wants to change a dynamic field's name, scope, options, default value, or other properties

Only send the fields you want to change. A field's type cannot be changed after creation; to change the type, delete the field and create a new one.

select and multi_select fields still require non-empty select_values.

The default value is set via value (for non-multi_select fields) or values (for multi_select fields), formatted according to the field's type (see create-template-dynamic-field for the per-type format). Setting a default value clears any autofill configured on the field. Use get-template-info with include=["dynamic_fields"] to discover the dynamic fields on a template and their UUIDs and types.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDisplay name of the field (max 255 characters)
scopeNoWho fills in the field: "internal" (only your team) or "internal_and_external" (also counterparties)
valueNoDefault value for non-multi_select fields. Format depends on type (see create-template-dynamic-field). Clears any autofill on the field.
valuesNoDefault value for multi_select fields: an array of options from select_values
questionNoOptional question or prompt shown to the user filling in this field
is_mandatoryNoWhether the field must be filled in before the document can be signed
select_valuesNoFor "select" and "multi_select" types: the allowed options for the field
template_uuidYesUUID of the template the dynamic field belongs to
dynamic_field_uuidYesUUID of the dynamic field to update (use get-template-info with include=["dynamic_fields"] to find it)

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoThe name of the field
typeNoControls the type of values that can be stored
uuidNoDo not show to the user unless they ask for it
scopeNoWho fills in the field: "internal" (only your team) or "internal_and_external" (also counterparties)
valueNoFor none-multi_select-type fields, the value of the field. Absent when the field has no value.
valuesNoFor multi_select-type fields, the value of the field. Absent when the field has no value.
questionNoThe question or prompt shown to the user for this field
ref_uuidNoA static reference identifier, allowing dynamic fields in documents to be matched their corresponding field in the document's source template. Do not show to the user unless they ask for it
currenciesNoFor currency or currency_duration fields, the allowed currency codes (e.g. ["EUR", "USD"]). Absent indicates no restriction
_entity_typeNoOnly relevant for tooling. Do not show to the user
is_mandatoryNoWhether this field must be filled in before the document can be signed
select_valuesNoWhen type is "select" or "multi_select", defines the allowed values for the field. For these types of field, ONLY these values are possible. Absent for every other type

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already mark this as a non-read-only, destructive mutation, but the description adds real behavioral context beyond them: type immutability after creation, the requirement that select/multi_select keep non-empty select_values, and the non-obvious side effect that setting a default value clears any autofill on the field. It does not warn about what happens to documents that already consume changed select_values, which is the main remaining gap for a destructive update.

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

Conciseness4/5

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

The purpose is front-loaded in the first line and the constraints are grouped into a short list plus one focused paragraph. Every sentence earns its place, though the single-item bullet block and a stray double line break make the layout slightly heavier than the content requires.

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 9-parameter update tool with a published output schema, this covers the load-bearing items: how to discover valid UUIDs (get-template-info with include=["dynamic_fields"]), what can and cannot be modified, partial-update semantics, and value formatting delegation. Return-value explanation is correctly omitted because the output schema handles it.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3 and the schema already carries most field-level meaning. The description still adds value above that baseline: the distinction that value vs values is driven by multi_select-ness (with format delegated to create-template-dynamic-field), the non-empty select_values constraint for select types, and the autofill-clearing behavior of a default value.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Update an existing dynamic field on a template.' The verb choice cleanly separates it from the create-template-dynamic-field and delete-template-dynamic-field siblings without needing to name them, and a second sentence enumerates exactly which properties can be changed.

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

Usage Guidelines5/5

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

It gives an explicit trigger ('The user wants to change a dynamic field's name, scope, options, default value, or other properties') and an explicit when-not with an alternative path: a field's type cannot be changed, so the agent must 'delete the field and create a new one.' Partial-update semantics ('Only send the fields you want to change') are also stated, which is the key invocation guidance for this tool.

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

update-template-partyUpdate template partyA
Destructive
Inspect

Update an existing party on a template.

Use this tool when:

  • The user wants to change a party's role label, entity details, or scope

  • The user wants to link an existing external party to a saved account party, or unlink it again

Only send the fields you want to change. reference is the party's role label on the template (e.g. "Employer").

Account party linkage:

  • Send account_party_uuid (from list-account-parties) to link the party to a saved account party. While linked, only reference may be changed; entity_name, address, and scope cannot be sent.

  • Send account_party_uuid as null to unlink the party, turning it back into an external party whose entity details and scope you can then set.

Use get-template-info to discover the parties on a template and their UUIDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoWhen internal_and_external, collaborators from this party may change the party's information. Only for external (non account-linked) parties.
addressNoParty's address. Only for external (non account-linked) parties.
referenceNoGeneric reference for the party's role on the template. e.g. "Counterparty", "Customer", "Employer"
party_uuidYesUUID of the party to update (use get-template-info to find it)
entity_nameNoActual name of the party. Only for external (non account-linked) parties.
template_uuidYesUUID of the template the party belongs to
account_party_uuidNoUUID of a saved account party (from list-account-parties) to link this party to. Send null to unlink. While linked, only reference may be changed.

Output Schema

ParametersJSON Schema
NameRequiredDescription
uuidNoIdentifier for the party - unique to the specific instance of the party. Do not show to the user unless they ask for it
addressNoThe party's address. Absent when not yet known
ref_uuidNoA static reference identifier, allowing parties in documents to be matched their corresponding party in the document's source template. Do not show to the user unless they ask for it
referenceNoA generic reference for the party. e.g. "Customer", "Employee", etc
entity_nameNoThe actual name of the party. Absent when not yet known
is_internalNoTrue if the party belongs to this account
_entity_typeNoOnly relevant for tooling. Do not show to the user

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only declare destructiveHint=true and openWorldHint=false, so the description adds real value: partial-update semantics ('Only send the fields you want to change'), the mutual-exclusivity constraint while linked (only reference editable), and the unlink workflow via null account_party_uuid. It stops short of stating irreversibility or what exactly the write destroys, which would justify a 5.

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

Conciseness4/5

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

Front-loaded purpose sentence followed by scannable bulleted conditions and a labeled linkage section. Slightly verbose but every section earns its place; no filler.

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

Completeness5/5

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

An output schema exists so return values need not be described, and the description covers the complex linked/unlinked state model and the discovery prerequisite tools. Complete for an agent to invoke correctly.

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

Parameters4/5

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

Schema coverage is 100% (baseline 3), and the description goes beyond it by explaining the cross-field constraint between account_party_uuid and entity_name/address/scope, and clarifying that reference is the role label. This narrative linkage guidance is not fully derivable from the individual field descriptions.

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

Purpose5/5

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

States a specific verb and resource ('Update an existing party on a template') and clearly differentiates from siblings such as create-template-party, delete-template-party, and update-document-party. An agent can select it without opening the schema.

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

Usage Guidelines5/5

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

Explicit 'Use this tool when' bullets give conditions for the two main scenarios (editing role/entity/scope, and linking/unlinking an account party), and it names the alternatives get-template-info and list-account-parties for discovering the required UUIDs. Nothing is left to inference.

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

update-template-signature-blockUpdate template signature blockA
Destructive
Inspect

Update the presentation of a signature block on a template.

Use this tool when:

  • The user wants to change how an existing signature block looks (its style or scale)

Only style (regular or minimal) and scale (50–150, percent) can be changed. The party a signature block belongs to cannot be reassigned; to move a signature block to a different party, delete it and create a new one. Use get-template-info with include=["signature_blocks"] to discover the signature blocks on a template and their UUIDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
scaleNoScale percentage of the signature block (50–150)
styleNoVisual style of the signature block
template_uuidYesUUID of the template the signature block belongs to
signature_block_uuidYesUUID of the signature block to update (use get-template-info with include=["signature_blocks"] to find it)

Output Schema

ParametersJSON Schema
NameRequiredDescription
uuidNoDo not show to the user unless they ask for it
scaleNoScale percentage of the signature block (50–150)
styleNoVisual style of the signature block
ref_uuidNoA static reference identifier, allowing signature blocks in documents to be matched to their corresponding block in the source template. Do not show to the user unless they ask for it
party_uuidNoUUID of the party this signature block belongs to. Do not show to the user unless they ask for it
_entity_typeNoOnly relevant for tooling. Do not show to the user
document_user_uuidNoUUID of the single signatory this signature block is bound to. Absent when the block is bound to its party instead, in which case every signatory of that party signs it. Do not show to the user unless they ask for it

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare the mutation and destructiveHint=true profile, and the description adds real behavioral context beyond that: only style and scale are editable, party reassignment is impossible, and discovery requires get-template-info. It does not, however, say whether the update is reversible or what the response contains, which is the remaining gap.

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?

Front-loaded one-line purpose, then a scannable when-to-use bullet, then hard constraints. Four short units, each carrying an operational fact; nothing is padding.

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

Completeness5/5

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

With an output schema present the description needn't explain return values, and it covers purpose, constraints, and the prerequisite lookup. Nothing an agent needs in order to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema carries the parameter documentation (baseline 3). The description adds genuine meaning beyond the schema by stating that the party association is immutable and that style/scale are the only mutable properties, plus it repeats the discovery path for signature_block_uuid.

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

Purpose5/5

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

States a specific verb and resource ('Update the presentation of a signature block on a template') and scopes it to presentation only, which cleanly separates it from create-template-signature-block and delete-template-signature-block among the siblings.

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?

Gives an explicit when-to-use condition ('the user wants to change how an existing signature block looks'), names the two mutable fields, and states the workaround for the excluded case (delete and recreate to move a party). It also points at get-template-info as the discovery step, so the agent knows what to do before calling.

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. 68 tool updates
    • First observedarchive-document
    • First observedattach-account-users-to-team
    • First observedcreate-account-document-type
    • First observedcreate-account-metadata
    • First observedcreate-account-tag
    • First observedcreate-account-team
    • First observedcreate-document-from-pdf-upload
    • First observedcreate-document-from-scratch
    • First observedcreate-document-from-template
    • First observedcreate-document-party
    • First observedcreate-document-pdf-upload-url
    • First observedcreate-document-signatory
    • First observedcreate-template-dynamic-field
    • First observedcreate-template-from-scratch
    • First observedcreate-template-party
    • First observedcreate-template-signature-block
    • First observeddelete-account-document-type
    • First observeddelete-account-metadata
    • First observeddelete-account-tag
    • First observeddelete-account-team
    • First observeddelete-document-signatory
    • First observeddelete-template-dynamic-field
    • First observeddelete-template-party
    • First observeddelete-template-signature-block
    • First observeddetach-account-users-from-team
    • First observedduplicate-document
    • First observedduplicate-template
    • First observedfind-automations
    • First observedfind-document-users
    • First observedfind-external-parties
    • First observedfind-imports
    • First observedget-account-info
    • First observedget-document-info
    • First observedget-latest-document-pdf
    • First observedget-template-html
    • First observedget-template-info
    • First observedget-user-info
    • First observedjoin-document
    • First observedlist-account-document-types
    • First observedlist-account-metadata
    • First observedlist-account-parties
    • First observedlist-account-playbooks
    • First observedlist-account-tags
    • First observedlist-account-team-members
    • First observedlist-account-teams
    • First observedlist-account-users
    • First observedlist-documents
    • First observedlist-templates
    • First observedmove-document-to-done-stage
    • First observedmove-document-to-review-stage
    • First observedmove-document-to-signing-stage
    • First observedreplace-template-content
    • First observedrestore-document
    • First observedset-template-published-state
    • First observedupdate-account-document-type
    • First observedupdate-account-metadata
    • First observedupdate-account-tag
    • First observedupdate-account-team
    • First observedupdate-document
    • First observedupdate-document-dynamic-fields
    • First observedupdate-document-metadata-values
    • First observedupdate-document-party
    • First observedupdate-document-signatory
    • First observedupdate-document-tags
    • First observedupdate-document-teams
    • First observedupdate-template-dynamic-field
    • First observedupdate-template-party
    • First observedupdate-template-signature-block

Publisher details

Operator
fynk · Publisher source
Vendor relationship
First-party
Restrictions
Requires a fynk Essential, Business or Pro plan (or 14-day free trial) with MCP enabled by an account owner or admin under Account Settings → MCP; no regional limits or custom OAuth app needed, as clients register automatically via OAuth. · Publisher source

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Perplexity for social: ask what competitors are running across social and get answers grounded in real ad and creative data, not guesses.
    2
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Enables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.
    16
    4 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources