*MCP › Referencia › CRM*

# Vincular un documento a una oportunidad

> Vincula a la oportunidad el presupuesto, el pedido o el proyecto que salió de ella.

Con `kind: "quote"` e `isPrimary: true`, ese presupuesto pasa a ser el principal y los demás se degradan. `meta.created` distingue un vínculo nuevo de uno que ya existía, que es lo que necesita saber un reintento. Devuelve la oportunidad completa, la misma proyección que su GET. El vínculo en sí —`kind`, `linkedEntityId`, `created`— va en `meta`.

HERRAMIENTA `filmo_crm_opportunities_link` · `crm:write` · 120/min · Puede requerir un add-on

## Argumentos

| Nombre | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `opportunityId` | string | Sí | Identificador de la oportunidad. |
| `kind` | string | Sí | Lo que está vinculado a la oportunidad. `quote`, `order`, `project` |
| `quoteId` | string | No | Presupuesto. Obligatorio con kind="quote". |
| `orderId` | string | No | Pedido. Obligatorio con kind="order". |
| `projectId` | string | No | Proyecto. Obligatorio con kind="project". |
| `isPrimary` | boolean | No | Solo con kind="quote": marca este presupuesto como el principal. |
| `idempotencyKey` | string | No | Clave de idempotencia elegida por el cliente (se recomienda un UUID). Repetir la misma clave con los mismos argumentos en 24 h devuelve la respuesta almacenada sin volver a ejecutar; con argumentos distintos responde 422. Es la forma segura de reintentar tras un fallo de red. |
| `ifMatch` | string | No | Bloqueo optimista: el meta.etag que obtuviste de la lectura de detalle de este recurso (o "*"). Si el recurso ha cambiado desde entonces, la llamada falla con 412 precondition_failed antes de escribir nada; léelo de nuevo y reintenta. Omítelo para escribir sin condiciones. |

## Resultado

En un éxito el resultado lleva `structuredContent` con `data` y `meta`. Estos son los atributos de `data`.

| Nombre | Tipo | Descripción |
| --- | --- | --- |
| `opportunityId` | string |  |
| `identifier` | string |  |
| `name` | string |  |
| `status` | string |  `open`, `won`, `lost` |
| `amount` | string |  |
| `currency` | string |  |
| `pipelineId` | string |  |
| `pipelineName` | string |  |
| `stageId` | string |  |
| `stageName` | string |  |
| `stageType` | string |  `open`, `won`, `lost` |
| `effectiveProbability` | number |  |
| `weightedAmount` | string |  |
| `daysInStage` | integer |  |
| `expectedCloseDate` | string<date-time> |  |
| `contactName` | string |  |
| `companyName` | string |  |
| `ownerName` | string |  |
| `source` | string |  `inbound_email`, `website_form`, `referral`, `cold_outreach`, `event`, `social`, `existing_customer`, `partner`, `other` |
| `createdAt` | string<date-time> |  |
| `updatedAt` | string<date-time> |  |
| `description` | string |  |
| `version` | integer |  |
| `collaboratorStaffIds` | string[] |  |
| `quoteIds` | string[] |  |
| `stageHistory` | object[] |  |
| `stageHistory.fromStageId` | string |  |
| `stageHistory.toStageId` | string |  |
| `stageHistory.toStatus` | string |  |
| `stageHistory.daysInPrevStage` | integer |  |
| `stageHistory.movedAt` | string<date-time> |  |
| `stageHistory.note` | string |  |

*Llamada · filmo_crm_opportunities_link*

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "filmo_crm_opportunities_link",
    "arguments": {
      "opportunityId": "oppo_8f2a1c",
      "kind": "quote"
    }
  }
}
```

*Resultado (generado desde el esquema)*

```json
{
  "structuredContent": {
    "data": {
      "opportunityId": "oppo_8f2a1c",
      "identifier": "<identifier>",
      "name": "Example",
      "status": "open",
      "amount": "1234.50",
      "currency": "EUR",
      "pipelineId": "pipe_8f2a1c",
      "pipelineName": "Example",
      "stageId": "stag_8f2a1c",
      "stageName": "Example",
      "stageType": "open",
      "effectiveProbability": 1,
      "weightedAmount": "1234.50",
      "daysInStage": 1,
      "expectedCloseDate": "2026-09-01T08:00:00Z",
      "contactName": "Example",
      "companyName": "Example",
      "ownerName": "Example",
      "source": "inbound_email",
      "createdAt": "2026-09-01T08:00:00Z",
      "updatedAt": "2026-09-01T08:00:00Z",
      "description": "<description>",
      "version": 1,
      "collaboratorStaffIds": [
        "coll_8f2a1c"
      ],
      "quoteIds": [
        "quot_8f2a1c"
      ],
      "stageHistory": [
        {
          "fromStageId": "from_8f2a1c",
          "toStageId": "tost_8f2a1c",
          "toStatus": "<toStatus>",
          "daysInPrevStage": 1,
          "movedAt": "2026-09-01T08:00:00Z",
          "note": "<note>"
        }
      ]
    },
    "meta": {
      "idempotencyKey": "<the key you sent, or the one the server generated>",
      "rateLimit": {
        "limit": 120,
        "remaining": 119,
        "reset": 42
      }
    }
  }
}
```

## La misma operación por REST

Esta herramienta ejecuta [`POST /api/v1/crm/opportunities/{opportunityId}/links`](https://docs.filmo.io/es/rest-api/endpoint-reference/crm/link-a-document-to-an-opportunity).

---

URL canónica: https://docs.filmo.io/es/mcp/tools/crm/filmo-crm-opportunities-link  
Última actualización: 2026-10-25