# Mets y sus herramientas

Un **Met** es un agente de tu workspace: tiene una misión, instrucciones, Funciones IA, skills y acceso a los datos del workspace (colecciones y contactos). Con `met.agents` los creas y ajustas por código; con la introspección de tools sabes exactamente qué ve cada uno.

## Crear y ajustar Mets

```ts
import Met from '@meteor.ia/sdk';

const met = new Met(process.env.MET_API_KEY!, { workspaceId: 40 });

const agente = await met.agents.create({
  name: 'Valeria',
  title: 'Asesora comercial',
  mission: 'Calificar y responder leads entrantes',
  instructions: 'Sé concisa. Confirma presupuesto antes de agendar.',
});

await met.agents.list();          // todos los Mets del workspace
await met.agents.retrieve(agente.id);
await met.agents.update(agente.id, { instructions: 'Nuevo guion.', active: true });
```

Los campos editables son `name`, `title`, `mission`, `instructions` y `active`. Para darle una skill del workspace: `met.agents.linkSkill(agentId, skillId)` (y `unlinkSkill` para quitarla).

## Ver qué herramientas tiene un Met

Este es el diagnóstico #1 cuando una Función no aflora o cuando no sabes qué apagar:

```ts
const tools = await met.agents.tools(agente.id);
// [{ name, source: 'collection'|'skill'|'function'|'internal', description, disabled }]
```

Cada tool trae su `source` (de dónde viene) y `disabled` (si ya está apagada para este Met). Si tu Función no aparece con `source: 'function'`, el problema está en la Función misma (sin handler, `active: false`), no en el Met. Los nombres que devuelve este método son los **únicos válidos** para `disabled_tools`.

## Apagar herramientas por Met

```ts
await met.agents.update(agente.id, {
  disabled_tools: ['mcp_meteor_list_items', 'mcp_meteor_get_item'],
});
```

Deshabilitar una tool no la desvincula: la deja fuera del set que el LLM puede llamar (se oculta del catálogo y se rechaza en runtime). Toma los nombres de `agents.tools()`.

> Las tools `mcp_meteor_*` (source `internal`) son **genéricas**: operan sobre todas las colecciones del workspace, no sobre una sola. Si apagas `mcp_meteor_list_items`, se lo quitas al Met para **todas** las colecciones a la vez. Para cerrar una colección puntual, usa `expose_to_agent` (abajo).

## Ocultar una colección al Met

Para que ninguna vía —API, chat o canal— exponga una colección al LLM, márcala como no visible, sin borrar datos:

```ts
await met.collections.update(collectionId, { expose_to_agent: false });
```

`expose_to_agent` viene en `true` por defecto. Ponla en `false` para datos internos que el Met no debe consultar, y vuelve a `true` para reexponerla. Más en [Colecciones e items](colecciones-e-items.html).

> Qué Met responde un run se decide por ruteo determinístico (el bind `met`), no por estas tools. Ver [Ejecutar Mets](ejecutar-agentes.html).

## Ejemplo: dejar un Met con solo su Función

```ts
const bot = await met.agents.create({ name: 'Cotizador', mission: 'Cotiza por API' });

// 1. Mira qué tiene disponible
const tools = await met.agents.tools(bot.id);

// 2. Apaga todo lo interno (colecciones genéricas) y deja pasar solo su Función
const internas = tools.filter((t) => t.source === 'internal').map((t) => t.name);
await met.agents.update(bot.id, { disabled_tools: internas });

// 3. Cierra además una colección sensible en todos los caminos
await met.collections.update(preciosInternosId, { expose_to_agent: false });
```

Así el Met queda acotado a su Función IA, sin acceso indiscriminado a las colecciones del workspace.
