Conectar

Crea tu propio cliente

Usa los SDK oficiales de MCP o los conectores MCP de las APIs de Anthropic y OpenAI.

Con este servidor, Client.callTool del SDK de TypeScript y call_tool del de Python devuelven los éxitos y los errores sin lanzar -32602. Filmo lo ha comprobado con @modelcontextprotocol/sdk 1.26.0 y 1.32.1, @modelcontextprotocol/client 2.3.1 y mcp 2.3.0 y 1.27.1. Cómo se lee un error está en Errores.

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const transport = new StreamableHTTPClientTransport(new URL("https://app.filmo.io/api/v1/mcp"), {
  requestInit: { headers: { Authorization: `Bearer ${process.env.FILMO_API_KEY}` } },
});
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(transport);

const result = await client.callTool({ name: "filmo_orders_list", arguments: { limit: 20 } });
if (result.isError) {
  // A tool error: the problem is JSON in the first text block, and there is no structuredContent.
  const problem = JSON.parse((result.content as { text: string }[])[0].text);
  console.error(problem.code, problem.detail);
} else {
  console.log(result.structuredContent); // { data, meta }
}

Los paquetes de la línea 2 de los SDK (@modelcontextprotocol/client, mcp 2.x con result.is_error y httpx2) tienen otra API; el contrato del servidor es el mismo.

Las dos APIs admiten un servidor MCP remoto. Las listas de abajo salen del catálogo: son las herramientas de lectura del preset recomendado y las que piden confirmación humana.

{
  "mcp_servers": [
    {
      "type": "url",
      "url": "https://app.filmo.io/api/v1/mcp",
      "name": "filmo",
      "authorization_token": "<FILMO_API_KEY>"
    }
  ],
  "tools": [
    {
      "type": "mcp_toolset",
      "mcp_server_name": "filmo",
      "default_config": {
        "enabled": false
      },
      "configs": {
        "filmo_items_list": {
          "enabled": true
        },
        "filmo_items_get": {
          "enabled": true
        },
        "filmo_availability_check": {
          "enabled": true
        },
        "filmo_serialized_items_list": {
          "enabled": true
        },
        "filmo_serialized_items_get": {
          "enabled": true
        },
        "filmo_spaces_list": {
          "enabled": true
        },
        "filmo_spaces_get": {
          "enabled": true
        },
        "filmo_vehicles_list": {
          "enabled": true
        },
        "filmo_vehicles_get": {
          "enabled": true
        },
        "filmo_staff_list": {
          "enabled": true
        },
        "filmo_staff_get": {
          "enabled": true
        },
        "filmo_staff_availability_check": {
          "enabled": true
        },
        "filmo_vehicles_availability_check": {
          "enabled": true
        },
        "filmo_kits_list": {
          "enabled": true
        },
        "filmo_kits_get": {
          "enabled": true
        },
        "filmo_planner_services_list": {
          "enabled": true
        },
        "filmo_schedule_get": {
          "enabled": true
        },
        "filmo_unavailabilities_list": {
          "enabled": true
        },
        "filmo_planner_resources_list": {
          "enabled": true
        },
        "filmo_account_get": {
          "enabled": true
        }
      }
    }
  ]
}

Anthropic exige la cabecera anthropic-beta: mcp-client-2025-11-20; el campo authorization_token es el token Bearer. OpenAI no documenta una cabecera propia: solo authorization. En OpenAI, require_approval con never solo para las herramientas de lectura deja todo lo demás pidiendo aprobación.

Herramientas que piden confirmación humana (para tu lista de aprobación)
[
  "filmo_contacts_delete",
  "filmo_contacts_update",
  "filmo_contacts_address_delete",
  "filmo_contacts_related_remove",
  "filmo_items_delete",
  "filmo_spaces_delete",
  "filmo_spaces_amenities_replace",
  "filmo_vehicles_delete",
  "filmo_staff_delete",
  "filmo_tags_delete",
  "filmo_tags_assignment_remove",
  "filmo_planner_assignment_remove",
  "filmo_unavailabilities_delete",
  "filmo_tasks_delete",
  "filmo_purchase_orders_receive",
  "filmo_repair_tickets_update",
  "filmo_treasury_payments_create",
  "filmo_orders_cancel",
  "filmo_items_accessories_update",
  "filmo_items_alternatives_update",
  "filmo_orders_line_items_return",
  "filmo_ai_ask",
  "filmo_workflows_run",
  "filmo_orders_unreserve",
  "filmo_projects_orders_unlink",
  "filmo_invoices_validate",
  "filmo_invoices_void",
  "filmo_credit_notes_validate",
  "filmo_credit_notes_void",
  "filmo_contracts_validate",
  "filmo_contracts_sign",
  "filmo_contracts_void",
  "filmo_contracts_cancel",
  "filmo_supplier_invoices_validate",
  "filmo_supplier_invoices_void"
]
Atención:

No pegues la clave en el código ni en un fichero del repositorio: léela de un almacén de secretos o del entorno.

  • Introducción

    Inicio rápido de MCP

    Conecta un asistente, compruébalo con una herramienta de lectura y elige los permisos que necesita.

  • Acceso

    Autenticación y permisos

    Autentica con una clave de API en una cabecera o deja que el cliente inicie sesión con OAuth 2.1. En ambos casos los permisos deciden qué herramientas existen.

  • Guías

    Escrituras seguras

    Un asistente que puede escribir también puede escribir lo equivocado. Decide qué herramientas necesitan a una persona, reintenta sin duplicar y sabe qué pone en marcha una escritura.

¿Te ha resultado útil esta página?