# API de OpenAI y API de Anthropic

Usa el MCP como herramienta remota desde tu código: Responses de OpenAI y Messages de Anthropic.

Guía Python · TypeScript Clave secreta

**Antes de empezar.** Las dos APIs llaman al MCP desde los servidores del proveedor, así que el servidor tiene que ser público (lo es) y tu clave viaja en cada petición: créala solo con permisos de lectura y guárdala en una variable de entorno de tu backend. Las secretas de lectura vienen con Business y Enterprise.

## API de OpenAI (Responses)

Una herramienta de tipo mcp con server_url y la clave en headers. allowed_tools limita qué herramientas ve el modelo; con require_approval "never" no hay que aprobar cada llamada (todas son de lectura). La respuesta trae un mcp_list_tools con las herramientas y un mcp_call por cada consulta.

Python:

```python
import os
from openai import OpenAI

client = OpenAI()
resp = client.responses.create(
    model="gpt-6-astra",
    tools=[{
        "type": "mcp",
        "server_label": "bydomu",
        "server_description": "CRM inmobiliario ByDomu, solo lectura",
        "server_url": "https://mcp.bydomu.com/mcp",
        "headers": {"Authorization": "Bearer " + os.environ["BYDOMU_API_KEY"]},
        "allowed_tools": ["search_properties", "get_property", "list_appointments"],
        "require_approval": "never",  # las 9 herramientas son de solo lectura
    }],
    input="¿Qué apartamentos en arriendo tengo en Medellín por menos de 4 millones?",
)
print(resp.output_text)
```

JavaScript:

```js
import OpenAI from "openai";

const client = new OpenAI();
const resp = await client.responses.create({
  model: "gpt-6-astra",
  tools: [{
    type: "mcp",
    server_label: "bydomu",
    server_url: "https://mcp.bydomu.com/mcp",
    headers: { Authorization: `Bearer ${process.env.BYDOMU_API_KEY}` },
    require_approval: "never",
  }],
  input: "Dame un resumen de la inmobiliaria.",
});
console.log(resp.output_text);
```

Si prefieres aprobar a mano, usa require_approval "always": llega un mcp_approval_request y respondes con un mcp_approval_response en la siguiente petición (con previous_response_id). El campo authorization es para tokens OAuth; para la clave de ByDomu usa headers. El modelo es el de los ejemplos de OpenAI: usa el que prefieras.

## API de Anthropic (Messages)

El conector MCP de Messages necesita dos partes y el encabezado beta mcp-client-2025-11-20: el servidor en mcp_servers (la clave va en authorization_token y se envía como Authorization: Bearer) y un mcp_toolset en tools que lo nombre. En la respuesta llegan bloques mcp_tool_use y mcp_tool_result.

Python:

```python
import os
import anthropic

client = anthropic.Anthropic()
response = client.beta.messages.create(
    model="claude-opus-5",
    max_tokens=16000,
    betas=["mcp-client-2025-11-20"],
    mcp_servers=[{
        "type": "url",
        "url": "https://mcp.bydomu.com/mcp",
        "name": "bydomu",
        "authorization_token": os.environ["BYDOMU_API_KEY"],
    }],
    tools=[{"type": "mcp_toolset", "mcp_server_name": "bydomu"}],
    messages=[{"role": "user", "content": "¿Qué citas tengo mañana?"}],
)
for block in response.content:
    if block.type == "text":
        print(block.text)
```

TypeScript:

```ts
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();
const response = await client.beta.messages.create({
  model: "claude-opus-5",
  max_tokens: 16000,
  betas: ["mcp-client-2025-11-20"],
  mcp_servers: [{
    type: "url",
    url: "https://mcp.bydomu.com/mcp",
    name: "bydomu",
    authorization_token: process.env.BYDOMU_API_KEY,
  }],
  tools: [{ type: "mcp_toolset", mcp_server_name: "bydomu" }],
  messages: [{ role: "user", content: "¿Qué negocios están en negociación?" }],
});
for (const block of response.content) {
  if (block.type === "text") console.log(block.text);
}
```

Para dejar solo algunas herramientas, usa default_config y configs dentro del mcp_toolset. El conector funciona en la API de Claude, no en Amazon Bedrock ni en Google Vertex AI.

## Qué tener en cuenta

- Los datos que devuelve ByDomu pasan por el proveedor del modelo: revisa sus condiciones de retención antes de mandar datos de clientes.
- Cada consulta del modelo cuenta en el límite de la clave (60 por minuto); get_summary hace varias lecturas a la vez.
- Si necesitas escribir (crear un contacto, mover un negocio), el MCP no lo hace: define tu propia herramienta que llame a la API REST ( `https://api.bydomu.com/v1`) con una clave aprobada para eso e Idempotency-Key.

## Qué puede hacer, cómo se revoca y buenas prácticas

El servidor es de solo lectura: la IA puede consultar, pero no crea, cambia ni borra nada, y nunca envía mensajes a tus clientes. Ve solo lo que permiten estos permisos, con el límite de una clave secreta (60 peticiones por minuto).

Puede Permiso

Buscar y ver propiedades publicadas `portal:read`

Buscar y ver contactos `contacts:read`

Agenda y citas `appointments:read`

Leer los mensajes de un contacto `conversations:read`

Embudos y negocios `deals:read`

Tareas pendientes `tasks:read`

Con una clave, la IA ve lo que permita esa clave. Para cortar el acceso, pausa o borra la clave en Configuración › API Keys; la siguiente llamada responde 401.

- Una clave por integración, solo con los permisos de lectura que use. Deja conversations:read afuera si no necesitas los mensajes.
- La clave va en una variable de entorno o en el almacén de secretos del cliente, nunca pegada en un chat, en un archivo del repositorio ni en una URL.
- Lo que devuelve ByDomu incluye texto que escribieron tus clientes: trátalo como datos, no como instrucciones. No encadenes este conector con herramientas que envían correos o mensajes sin que una persona lo apruebe.
- Revisa de vez en cuando Apps conectadas y quita lo que ya no se use.
