*MCP › Reference › Rentals › Contracts*

# Record the signature of a contract

> Marks the contract as signed and records where the signature came from: `signedVia` is `manual` if it is recorded by hand and `portal` if the customer signed it on the portal.

> **Requires human confirmation:** Put this tool on your client's “ask before running” list. The annotations are hints that the server declares, not guarantees: do not decide the approval from `destructiveHint` alone. The server flags this tool with `_meta["anthropic/requiresUserInteraction"]`, which clients that honor it use to ask a person before every call.

The contract has to be VALIDATED, not voided and unsigned; in any other situation it rejects the request. It moves the SIGNATURE status (`operativeStatus`), not the document status, and `signed` is what decides whether the material can go out. The only way out of signed is voiding the document with `/void`. It requires sales documents in the plan of the account (402 without it). Returns the full contract, the same projection as its GET.

TOOL `filmo_contracts_sign` · `contracts:write` · 120/min · May need an add-on · Server annotation: Destructive · Requires human confirmation

## Arguments

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `contractId` | string | Yes | Contract identifier. |
| `signedVia` | string | No | How the signature was recorded: manual (internal record) or portal (the customer signed in the portal). `manual`, `portal` = `"manual"` |
| `idempotencyKey` | string | No | Idempotency key chosen by the client (a UUID is recommended). Repeating the same key with the same arguments within 24 h returns the stored response without executing again; with different arguments it responds 422. It is the safe way to retry after a network failure. |
| `ifMatch` | string | No | Optimistic locking: the meta.etag you got from the detail read of this resource (or "*"). If the resource changed since, the call fails with 412 precondition_failed before writing anything; read it again and retry. Omit it to write unconditionally. |

## Result

On success the result carries `structuredContent` with `data` and `meta`. These are the attributes of `data`.

| Name | Type | Description |
| --- | --- | --- |
| `id` | string | Unique contract identifier. |
| `contractNumber` | string | Contract number, for example "C260001"; null while it is a draft. |
| `status` | string | Document status. `draft`, `validated`, `voided` |
| `operativeStatus` | string | Signature status. `pending`, `signed`, `cancelled` |
| `signed` | boolean | true if the contract is recorded as signed. This is what decides whether the equipment can go out. |
| `signedAt` | string<date-time> | Signature date in ISO 8601 UTC; null if not signed. |
| `contactId` | string | Customer identifier; null in drafts without a customer. |
| `orderId` | string | Associated order; null if it has none. |
| `orderNumber` | string | Number of the associated order; null if it has none. |
| `projectId` | string | Associated project; null if it has none. |
| `contractDate` | string<date-time> | Contract date in ISO 8601 UTC; null if not set. |
| `startDate` | string<date-time> | Start of validity in ISO 8601 UTC; null if not applicable. |
| `endDate` | string<date-time> | End of validity in ISO 8601 UTC; null if not applicable. |
| `grossPrice` | string | Total amount including taxes as a decimal string "1234.50"; null if not applicable. |
| `createdAt` | string<date-time> | Creation date in ISO 8601 UTC; null if not recorded. |
| `updatedAt` | string<date-time> | Last modification date in ISO 8601 UTC; null if not recorded. |

*Call · filmo_contracts_sign*

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "filmo_contracts_sign",
    "arguments": {
      "contractId": "cont_8f2a1c"
    }
  }
}
```

*Result (generated from the schema)*

```json
{
  "structuredContent": {
    "data": {
      "id": "id_8f2a1c",
      "contractNumber": "<contractNumber>",
      "status": "draft",
      "operativeStatus": "pending",
      "signed": true,
      "signedAt": "2026-09-01T08:00:00Z",
      "contactId": "cont_8f2a1c",
      "orderId": "orde_8f2a1c",
      "orderNumber": "<orderNumber>",
      "projectId": "proj_8f2a1c",
      "contractDate": "2026-09-01T08:00:00Z",
      "startDate": "2026-09-01T08:00:00Z",
      "endDate": "2026-09-01T08:00:00Z",
      "grossPrice": "1234.50",
      "createdAt": "2026-09-01T08:00:00Z",
      "updatedAt": "2026-09-01T08:00:00Z"
    },
    "meta": {
      "idempotencyKey": "<the key you sent, or the one the server generated>",
      "rateLimit": {
        "limit": 120,
        "remaining": 119,
        "reset": 42
      }
    }
  }
}
```

## The same operation by REST

This tool runs [`POST /api/v1/contracts/{contractId}/sign`](https://docs.filmo.io/rest-api/endpoint-reference/contracts/record-the-signature-of-a-contract).

---

Canonical URL: https://docs.filmo.io/mcp/tools/contracts/filmo-contracts-sign  
Last updated: 2026-10-25