Primeros pasos7 minutos de lectura7 idiomas

Crea tu primera herramienta de código MCP: pedidos del ERP y cuenta del CRM en una sola llamada

Un tutorial paso a paso del modo código de AnythingMCP: inicia el code runner, activa el modo código y guarda una herramienta de código que lee los últimos pedidos del ERP (weclapp) y la cuenta y los deals abiertos del CRM (HubSpot) en una sola llamada. Solo lectura, con los permisos de quien llama y auditada.

HCPor el equipo de HelpCodeActualizado 7 min de lectura Código abierto en GitHub

Sin tarjeta de crédito · 7 días de prueba · Alternativa self-host disponible

  • Prueba gratis de 7 días
    Sin tarjeta de crédito
  • RGPD y SOC 2 ready
    Datos en la UE, registros de auditoría
  • Código abierto en GitHub
    Open source · AGPL-3.0
  • Funciona con ChatGPT, Claude, Gemini
    Cualquier cliente compatible con MCP

Resumen

Un tutorial paso a paso del modo código de AnythingMCP: inicia el code runner, activa el modo código y guarda una herramienta de código que lee los últimos pedidos del ERP (weclapp) y la cuenta y los deals abiertos del CRM (HubSpot) en una sola llamada. Solo lectura, con los permisos de quien llama y auditada.

TL;DR: Antes de una llamada con un cliente, un comercial le pide al asistente un resumen: los últimos pedidos del ERP y el responsable de la cuenta y los deals abiertos del CRM. Sin el modo código, son cuatro o cinco llamadas a herramientas, cada una leída completa por el modelo. Con una herramienta de código guardada es una sola: customer_overview(customer) ejecuta un programa corto de JavaScript que hace las llamadas, se queda con lo importante y devuelve un único resumen compacto. Este tutorial construye esa herramienta en un AnythingMCP autoalojado (v0.52.1 o posterior) con weclapp como ERP y HubSpot como CRM; el mismo patrón funciona con cualesquiera dos conectores.

Qué necesitas

  • AnythingMCP autoalojado v0.52.1 o posterior. El modo código llegará próximamente a AnythingMCP Cloud.
  • Dos conectores con herramientas de lectura, aquí weclapp y HubSpot, instalados y funcionando.
  • Permisos de administrador en el workspace.

¿Nuevo en la idea? ¿Qué es el modo código de MCP? explica por qué un programa gana a muchas llamadas a herramientas.

Paso 1 — Inicia el code runner

El código nunca se ejecuta dentro del propio AnythingMCP. Se ejecuta en un contenedor code-runner aparte, y sin él se rechaza toda ejecución de código. Añade a tu .env:

COMPOSE_PROFILES=code-runner
CODE_RUNNER_URL=ws://code-runner:8777

Si ya usas perfiles, enuméralos juntos, por ejemplo COMPOSE_PROFILES=files,code-runner. Después:

docker compose up -d

El runner no guarda secretos, no publica puertos y no tiene ruta a internet; solo el backend habla con él, a través de la red interna de Docker. Cómo aísla cada ejecución: Ejecución segura de código para agentes de IA.

Paso 2 — Activa el modo código en el servidor MCP

El modo código está desactivado por defecto en cada servidor MCP, y las herramientas de código guardadas se rechazan en un servidor cuyo modo código es off. Establece el modo código del servidor que usa tu equipo de ventas en tools (solo herramientas de código guardadas). inline ofrece además al agente code_execute y code_propose_tool; no lo necesitas para este tutorial.

En el dashboard, abre MCP Servers y luego el servidor. En la tarjeta Server settings de arriba, pon Code mode en Saved code tools only y haz clic en Save. Después, vuelve a conectar el cliente de IA.

¿Prefieres la API? PUT /api/mcp-servers/<id> con {"codeMode": "tools"} hace lo mismo. El ajuste existe desde la v0.52.1; en la v0.52.0, actualiza primero.

Paso 3 — Anota los ids de los dos conectores

Una herramienta de código declara qué conectores puede llamar su programa. Abre cada conector en el dashboard: su id es la última parte de la dirección, /connectors/<id>. Copia los ids del conector de weclapp y del de HubSpot.

Paso 4 — Crea la herramienta de código

Abre el conector de weclapp, ve a MCP Tools y haz clic en Add Tool. Establece Tool Type en Code Tool y rellena:

  • Tool Name: customer_overview
  • Description: "Resumen de un cliente antes de una llamada: los últimos 10 pedidos del ERP, la cuenta del CRM y sus deals abiertos. Indica el nombre de la empresa o parte de él." La descripción es lo que la IA lee para decidir cuándo llamar a la herramienta, así que indica qué devuelve.
  • Input Parameters: un parámetro, customer, de tipo string, obligatorio.
anythingmcp.internal/connectors
Formulario Edit Tool de un conector llamado Accounting: nombre de la herramienta revenue_by_month, Tool Type Code Tool, un campo Program con JavaScript que llama a amcp.run, el JSON de Uses (connectors) con un connectorId, Run as Invoker (los permisos propios de quien llama), la casilla Allow write tools sin marcar e Input Parameters
El editor de herramientas con Tool Type Code Tool, aquí para otra herramienta de ejemplo (revenue_by_month) en un workspace de demostración. Program, Uses, Run as y Allow write tools son los campos que rellena este tutorial.

Paso 5 — Escribe el programa

El Program es el cuerpo de una función JavaScript asíncrona. Las entradas de la herramienta están en args; amcp.run(name, args) llama a otra herramienta y devuelve su resultado como JSON ya parseado (y lanza un error si la herramienta falla). Lo que devuelvas con return es lo que recibe la IA.

// Input: args.customer, a company name or part of it.
const name = String(args.customer ?? '').trim();
if (!name) return { error: 'Pass a customer name.' };

// ERP (weclapp): the customer, then its latest sales orders.
const parties = await amcp.run('weclapp_list_customers', {
  filter: `company-ilike=%${name}%`,
  pageSize: 5,
});
const customer = (parties.result ?? [])[0];
if (!customer) return { error: `No customer matching "${name}" in the ERP.` };

const orders = await amcp.run('weclapp_list_sales_orders', {
  filter: `customerId-eq=${customer.id}`,
  sort: '-orderDate',
  pageSize: 10,
});

// CRM (HubSpot): the company record and its open deals.
const companies = await amcp.run('hubspot_search_objects', {
  object_type: 'companies',
  query: customer.company,
  properties: ['name', 'domain', 'hubspot_owner_id', 'lifecyclestage'],
  limit: 1,
});
const company = companies.results?.[0];

let deals = [];
if (company) {
  const found = await amcp.run('hubspot_search_objects', {
    object_type: 'deals',
    filter_groups: [{ filters: [
      { propertyName: 'associations.company', operator: 'EQ', value: company.id },
      { propertyName: 'hs_is_closed', operator: 'EQ', value: 'false' },
    ] }],
    properties: ['dealname', 'amount', 'dealstage', 'closedate'],
    limit: 20,
  });
  deals = found.results ?? [];
}

// Only this goes back to the model.
return {
  customer: { number: customer.customerNumber, name: customer.company },
  lastOrders: (orders.result ?? []).map((o) => ({
    number: o.orderNumber, date: o.orderDate, status: o.status, net: o.netAmount,
  })),
  crm: company
    ? { owner: company.properties.hubspot_owner_id, stage: company.properties.lifecyclestage }
    : null,
  openDeals: deals.map((d) => ({
    name: d.properties.dealname, amount: d.properties.amount,
    stage: d.properties.dealstage, close: d.properties.closedate,
  })),
};

Los nombres de campo son los que devuelven las APIs de weclapp y HubSpot. Antes de fiarte de un campo, ejecuta una vez la herramienta subyacente en su panel Test y mira el resultado; dentro del programa, await amcp.describe('weclapp_list_sales_orders') devuelve el esquema de entrada de una herramienta.

Una nota sobre el cruce de datos. Este programa empareja la empresa del CRM por nombre, lo cual basta para un resumen previo. Si guardas el número de cliente del ERP en una propiedad de HubSpot, filtra por ella y la coincidencia será exacta.

Paso 6 — Declara qué puede usar el programa

Uses (connectors) enumera los conectores, y opcionalmente las herramientas exactas, que el programa puede llamar. Pega los dos ids del paso 3:

[
  { "connectorId": "<weclapp connector id>", "tools": ["weclapp_list_customers", "weclapp_list_sales_orders"] },
  { "connectorId": "<hubspot connector id>", "tools": ["hubspot_search_objects"] }
]

Nombrar las herramientas es opcional (sin "tools" se permite todo el conector), pero una lista corta facilita la revisión de la herramienta. Solo se aceptan conectores del mismo workspace. Una herramienta fuera de esta lista falla con un error, aunque el usuario pudiera llamarla directamente.

Paso 7 — Ejecutar como invoker, solo lectura

  • Run as: Invoker (los permisos propios de quien llama). Cada llamada interna se comprueba contra el rol de la persona que usa la herramienta. Un comercial sin acceso a HubSpot recibe un error en la parte de HubSpot, exactamente igual que si hubiera llamado a HubSpot directamente. (Definer se ejecuta con la curación del autor, como un procedimiento almacenado; es para administradores y Enterprise.)
  • Allow write tools: desactivado. Entonces el programa solo puede llamar a herramientas de solo lectura; weclapp_list_* y hubspot_search_objects son lecturas. Las herramientas de código con escritura requieren Enterprise.

Haz clic en Create Tool.

Paso 8 — Pruébala desde Claude o ChatGPT

Comprueba primero el programa con el botón Test de la herramienta en el dashboard: ejecuta el código en el code runner, con las mismas reglas que una llamada real. Después pruébala desde un cliente de IA conectado al servidor MCP. La herramienta está disponible en todos los servidores que tengan el conector de weclapp y el modo código activado. Vuelve a conectar o actualiza las herramientas en tu cliente de IA y pregunta:

"Voy a llamar a Lindenhof Bau en diez minutos. ¿Qué han pedido recientemente, quién es el responsable de la cuenta y hay deals abiertos?"

El asistente llama a customer_overview una sola vez y redacta el resumen a partir del resultado compacto, en lugar de leer listas completas de pedidos y registros del CRM. Si algo falla, el resultado de la herramienta indica qué: una llamada fuera de Uses ('hubspot_search_objects' is not a tool this code tool can use), un error devuelto por la API o un timeout. Corrige el programa, guarda y vuelve a preguntar.

Qué ocurre en cada llamada

  • Una ejecución, un registro. Cada llamada a la herramienta se registra como una ejecución de código, y cada llamada a herramientas que hace el programa queda en el registro de auditoría como cualquier otra llamada, con el usuario.
  • Límites. Una ejecución puede durar hasta 10 segundos, hacer hasta 500 llamadas a herramientas (16 a la vez) y devolver hasta 1 MB. Un programa que supera un límite se detiene con un error claro y no afecta a nada más.
  • Sin anidamiento. Una herramienta de código no puede llamar a otra herramienta de código.
  • Solo en tus servidores. Las herramientas de código se sirven en los servidores MCP propios del workspace, nunca en el endpoint compartido /mcp.

Planes

Herramientas de código guardadas por edición, según lo anunciado con la v0.52: Community 3, Starter 5, Team 20, Enterprise ilimitadas. Las herramientas de código con escritura y "run as definer" son Enterprise. Compara los planes.

FAQ

¿Necesito saber JavaScript? Basta con JavaScript básico: await, objetos, map y filter. También puedes dejar que el agente redacte el programa y lo proponga como herramienta para que lo revises.

¿Puede el programa llamar directamente a una API externa? No. No tiene acceso a la red. Solo puede llamar a las herramientas MCP indicadas en Uses; para llegar a otra API, añádela primero como conector.

¿En qué conector debe vivir la herramienta de código? En cualquiera de los que usa; la herramienta aparece allí donde ese conector esté asignado. Elige aquel cuya audiencia deba recibir la herramienta.

Relacionado

¿Te ha sido útil esta guía?

MCP en tu stack en 60 segundos.

Pon en marcha AnythingMCP en la nube gestionada o alójalo en tu propia infraestructura. 7 días gratis, sin tarjeta de crédito.

Guías relacionadas

GS
Primeros pasos

Code Mode: reduce el consumo de tokens del agente de IA ejecutando las herramientas en un solo paso

El modo código permite que un agente de IA ejecute un breve programa que orquesta muchas herramientas MCP en una única llamada, en lugar de una ida y vuelta por herramienta. El filtrado y la combinación de datos ocurren en una sandbox aislada, de modo que solo regresa la respuesta final, reduciendo el consumo de tokens en flujos de trabajo con muchos datos hasta en un 90–99 %.

GS
Primeros pasos

Recetas del modo código de MCP: ingresos mensuales, conciliación de facturas y 100 consultas de precios en una sola llamada

Tres programas prácticos del modo código para AnythingMCP: ingresos mensuales de la tienda online (Shopify) y la contabilidad (Lexware Office), pedidos conciliados con facturas y 100 consultas de precios de clientes en una sola llamada a una herramienta en lugar de 100. Con el código, los límites que importan y cuándo guardar un programa como herramienta.

GS
Primeros pasos

¿Qué es el modo código de MCP? Menos tokens y menos idas y vueltas para los agentes de IA

El modo código permite que un agente de IA ejecute un programa corto que llama a varias herramientas MCP, en lugar de llamarlas una a una a través del modelo. Por qué ahorra tokens e idas y vueltas, cuándo ayuda y cuándo no, y cómo lo ejecuta AnythingMCP: herramientas de código guardadas, código en línea y propuestas del agente, en un runner aislado.

GS
Primeros pasos

El grafo de conocimiento MCP: un conector que aprende cómo se conectan tus sistemas

AnythingMCP no es solo un proxy MCP — construye un grafo de conocimiento de tus herramientas para que los agentes de IA sepan cómo encadenar un cliente de tu CRM con sus pedidos en el ERP. Así funciona el conector inteligente.

GS
Primeros pasos

¿Qué es el Protocolo de Contexto del Modelo (MCP)?

Una guía completa para entender el Protocolo de Contexto del Modelo: cómo funciona, por qué es importante y cómo empezar.

GS
Primeros pasos

Introducción a AnythingMCP

Instala y configura AnythingMCP en minutos. Clona el repositorio, ejecuta el script de configuración interactivo y comienza a conectar tus APIs a agentes de IA.