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.

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_*yhubspot_search_objectsson 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
- ¿Qué es el modo código de MCP?
- Ejecución segura de código para agentes de IA: cómo funciona el runner aislado
- Recetas del modo código: ingresos mensuales, conciliación de facturas, 100 consultas de precios
- El agente propone una herramienta de código, el administrador la aprueba
- Gestiona tu ERP con IA: weclapp
- Despliega AnythingMCP con Docker Compose
- Conecta weclapp y HubSpot a Claude
¿Te ha sido útil esta guía?