En esta página
La API de Claude de Anthropic admite el uso nativo de herramientas: defines herramientas con esquemas JSON y Claude decide cuándo invocarlas durante una conversación. Las 26 herramientas de web scraping de CrawlForge encajan de forma natural: le dan a Claude la capacidad de buscar en la web, extraer contenido, hacer scraping de datos estructurados y realizar investigaciones profundas, todo a través de la API estándar de tool_use.
Esta guía te lleva paso a paso por la definición de las herramientas de CrawlForge para la API de Claude, el manejo de las respuestas de uso de herramientas y la creación de un asistente de investigación de nivel de producción.
Tabla de contenidos
- Requisitos previos
- Cómo funciona el uso de herramientas de Claude con CrawlForge
- Paso 1: define los esquemas de herramientas de CrawlForge
- Paso 2: maneja el bucle de uso de herramientas
- Paso 3: crea un asistente de investigación
- Avanzado: streaming con uso de herramientas
- Desglose de costo en credits
- Buenas prácticas
- Preguntas frecuentes
- Próximos pasos
Requisitos previos
npm install @anthropic-ai/sdk dotenv# .env
ANTHROPIC_API_KEY=sk-ant-xxxxx
CRAWLFORGE_API_KEY=cf_live_xxxxxObtén tu API key de CrawlForge en crawlforge.dev/signup: incluye 1,000 credits gratis. Para acceder a la API de Claude, visita console.anthropic.com y sigue la guía de primeros pasos de la API.
Cómo funciona el uso de herramientas de Claude con CrawlForge
El uso de herramientas de Claude sigue un bucle de petición-respuesta:
- Envías un mensaje con las definiciones de herramientas y un prompt del usuario
- Claude responde con texto o con un bloque de contenido
tool_use - Ejecutas la herramienta (llamas a la API de CrawlForge) y devuelves el resultado
- Claude incorpora el resultado y continúa su respuesta
You -> Claude: "What's on the Hacker News front page?"
Claude -> You: tool_use { name: "extract_content", input: { url: "https://news.ycombinator.com" } }
You -> CrawlForge: POST /api/v1/tools/extract_content { url: "..." }
CrawlForge -> You: { content: "..." }
You -> Claude: tool_result { content: "..." }
Claude -> You: "Here are the top stories on Hacker News right now: ..."
Paso 1: define los esquemas de herramientas de CrawlForge
Define las herramientas que Claude puede usar. Cada herramienta necesita un name, una description y un input_schema (formato JSON Schema):
// lib/tool-definitions.ts
import Anthropic from '@anthropic-ai/sdk';
export const crawlforgeTools: Anthropic.Tool[] = [
{
name: 'search_web',
description: 'Search Google and return top results. Use when you need to find web pages about a topic. Returns titles, URLs, and snippets. Costs 5 credits.',
input_schema: {
type: 'object' as const,
properties: {
query: {
type: 'string',
description: 'The search query',
},
limit: {
type: 'number',
description: 'Maximum number of results (default: 5)',
},
},
required: ['query'],
},
},
{
name: 'extract_content',
description: 'Extract the main readable content from a web page. Returns clean text without navigation, ads, or boilerplate. Use when you need to read a specific URL. Costs 2 credits.',
input_schema: {
type: 'object' as const,
properties: {
url: {
type: 'string',
description: 'The full URL to extract content from',
},
},
required: ['url'],
},
},
{
name: 'scrape_structured',
description: 'Extract specific data from a page using CSS selectors. Use when you need structured data like prices, names, or lists. Costs 2 credits.',
input_schema: {
type: 'object' as const,
properties: {
url: {
type: 'string',
description: 'The URL to scrape',
},
selectors: {
type: 'object',
description: 'Map of field names to CSS selectors',
additionalProperties: { type: 'string' },
},
},
required: ['url', 'selectors'],
},
},
{
name: 'fetch_url',
description: 'Fetch raw HTML from a URL. Cheapest option at 1 credit. Use for APIs or when you need the raw HTML.',
input_schema: {
type: 'object' as const,
properties: {
url: {
type: 'string',
description: 'The URL to fetch',
},
},
required: ['url'],
},
},
{
name: 'extract_metadata',
description: 'Get page metadata including title, description, Open Graph tags, and other meta information. Costs 1 credit.',
input_schema: {
type: 'object' as const,
properties: {
url: {
type: 'string',
description: 'The URL to extract metadata from',
},
},
required: ['url'],
},
},
];Paso 2: maneja el bucle de uso de herramientas
El patrón central: envía mensajes a Claude, comprueba si quiere usar una herramienta, ejecuta la herramienta a través de CrawlForge y devuelve el resultado.
// lib/agent.ts
import Anthropic from '@anthropic-ai/sdk';
import { crawlforgeTools } from './tool-definitions';
const client = new Anthropic();
const CRAWLFORGE_BASE = 'https://crawlforge.dev/api/v1/tools';
// Execute a CrawlForge tool
async function executeTool(
name: string,
input: Record<string, unknown>
): Promise<string> {
const response = await fetch(`${CRAWLFORGE_BASE}/${name}`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.CRAWLFORGE_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
});
if (!response.ok) {
return JSON.stringify({ error: `HTTP ${response.status}: ${response.statusText}` });
}
const data = await response.json();
return JSON.stringify(data);
}
// Run Claude with CrawlForge tools
export async function askClaude(prompt: string): Promise<string> {
const messages: Anthropic.MessageParam[] = [
{ role: 'user', content: prompt },
];
// Tool use loop: keep going until Claude gives a final text response
while (true) {
const response = await client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 4096,
tools: crawlforgeTools,
messages,
});
// Check if Claude wants to use a tool
if (response.stop_reason === 'tool_use') {
// Add Claude's response to message history
messages.push({ role: 'assistant', content: response.content });
// Execute each tool call and collect results
const toolResults: Anthropic.ToolResultBlockParam[] = [];
for (const block of response.content) {
if (block.type === 'tool_use') {
const result = await executeTool(
block.name,
block.input as Record<string, unknown>
);
toolResults.push({
type: 'tool_result',
tool_use_id: block.id,
content: result,
});
}
}
// Return tool results to Claude
messages.push({ role: 'user', content: toolResults });
} else {
// Claude gave a final text response
const textBlock = response.content.find(b => b.type === 'text');
return textBlock ? textBlock.text : '';
}
}
}
// Usage
const answer = await askClaude(
'What are the top 3 trending repositories on GitHub right now?'
);
console.log(answer);Este bucle maneja el uso de herramientas en varios pasos de forma automática. Claude podría buscar, luego extraer contenido de un resultado y después buscar de nuevo: el bucle continúa hasta que produce una respuesta de texto final.
Paso 3: crea un asistente de investigación
Envuelve el agente en una aplicación más estructurada:
// research-assistant.ts
import { askClaude } from './lib/agent';
async function researchTopic(topic: string, depth: 'quick' | 'thorough' = 'quick') {
const systemPrompt = depth === 'thorough'
? `Research this topic thoroughly. Search for at least 3 different sources,
read each one, and provide a comprehensive summary with citations.
Topic: ${topic}`
: `Quickly answer this question using web search if needed.
Be concise and cite your source. Topic: ${topic}`;
console.log(`Researching: ${topic} (mode: ${depth})`);
const result = await askClaude(systemPrompt);
console.log(result);
return result;
}
// Quick research: ~7 credits (search + 1 extract)
await researchTopic('What is the current version of Next.js?', 'quick');
// Thorough research: ~11-15 credits (search + 3 extracts)
await researchTopic(
'Compare the performance of Bun vs Node.js for HTTP servers in 2026',
'thorough'
);Avanzado: streaming con uso de herramientas
Para una mejor experiencia de usuario, usa streaming para mostrar el razonamiento de Claude en tiempo real:
// lib/streaming-agent.ts
import Anthropic from '@anthropic-ai/sdk';
import { crawlforgeTools } from './tool-definitions';
const client = new Anthropic();
const CRAWLFORGE_BASE = 'https://crawlforge.dev/api/v1/tools';
async function executeTool(
name: string,
input: Record<string, unknown>
): Promise<string> {
const response = await fetch(`${CRAWLFORGE_BASE}/${name}`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.CRAWLFORGE_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
});
return JSON.stringify(await response.json());
}
export async function streamWithTools(prompt: string) {
const messages: Anthropic.MessageParam[] = [
{ role: 'user', content: prompt },
];
while (true) {
const stream = client.messages.stream({
model: 'claude-sonnet-4-20250514',
max_tokens: 4096,
tools: crawlforgeTools,
messages,
});
// Collect streamed text
let hasToolUse = false;
stream.on('text', (text) => {
process.stdout.write(text); // Stream to terminal in real time
});
const response = await stream.finalMessage();
if (response.stop_reason === 'tool_use') {
hasToolUse = true;
messages.push({ role: 'assistant', content: response.content });
const toolResults: Anthropic.ToolResultBlockParam[] = [];
for (const block of response.content) {
if (block.type === 'tool_use') {
console.log(`\n[Calling ${block.name}...]\n`);
const result = await executeTool(
block.name,
block.input as Record<string, unknown>
);
toolResults.push({
type: 'tool_result',
tool_use_id: block.id,
content: result,
});
}
}
messages.push({ role: 'user', content: toolResults });
}
if (!hasToolUse) break;
}
}
// Usage: streams text to stdout as Claude generates it
await streamWithTools('What is CrawlForge MCP and how does it compare to Firecrawl?');Desglose de costo en credits
| Flujo | Herramientas usadas | Credits |
|---|---|---|
| Respuesta rápida (1 página) | extract_content | 2 |
| Buscar + leer el primer resultado | search_web + extract_content | 7 |
| Investigación a fondo (3 fuentes) | search_web + 3x extract_content | 11 |
| Extracción de datos estructurados | scrape_structured | 2 |
| Comprobación de metadatos de página | extract_metadata | 1 |
| Obtención de HTML en bruto | fetch_url | 1 |
| Informe profundo multifuente | deep_research | 10 |
El nivel Free (1,000 credits únicos) admite aproximadamente 140 extracciones de una sola página o 90 flujos de buscar y leer para empezar. El plan Hobby ($19/mes, 5,000 credits) es ideal para desarrollo y uso ligero en producción.
Buenas prácticas
Escribe descripciones de herramientas descriptivas. Claude usa el campo description para decidir qué herramienta llamar. Incluye qué hace la herramienta, cuándo usarla y su costo en credits. "Extract the main readable content from a web page" es mejor que "Get content".
Incluye el costo en credits en las descripciones. Cuando Claude sabe que fetch_url cuesta 1 credit y deep_research cuesta 10, elige de forma natural la opción más barata para tareas sencillas.
Maneja los errores con elegancia. Devuelve los mensajes de error como resultados de herramienta en lugar de lanzar excepciones. Claude puede adaptar su estrategia cuando una herramienta falla: por ejemplo, probar una URL distinta o reformular una búsqueda.
Configura max_tokens de forma adecuada. El contenido web puede ser largo. Configura max_tokens en al menos 4096 para darle a Claude espacio para incorporar los resultados de las herramientas en respuestas completas.
Usa system prompts para guiar el uso de herramientas. Indícale a Claude cuándo buscar y cuándo acceder directamente a una URL conocida. Esto evita llamadas innecesarias a search_web (5 credits) cuando bastaría con un extract_content directo (2 credits).
Preguntas frecuentes
¿Puedo usar CrawlForge con Claude 3.5 Haiku para reducir costos?
Sí. Todos los modelos de Claude que admiten uso de herramientas funcionan con las herramientas de CrawlForge. Haiku es más barato por token, pero puede necesitar instrucciones más explícitas para elegir la herramienta correcta. Claude Sonnet ofrece el mejor equilibrio entre costo y precisión en el uso de herramientas.
¿Cómo manejo los límites de velocidad?
La API de CrawlForge incluye cabeceras de límite de velocidad (X-RateLimit-Remaining). Si recibes una respuesta 429, añade un reintento con retroceso exponencial. Para uso de alto volumen, el plan Professional incluye límites de velocidad más altos.
¿Puede Claude llamar a varias herramientas de CrawlForge en un solo turno?
Sí. Claude puede solicitar el uso de varias herramientas en una sola respuesta. El bucle de uso de herramientas del Paso 2 lo maneja: itera sobre todos los bloques tool_use y devuelve todos los resultados a la vez.
¿Qué ocurre cuando se acaban los credits de CrawlForge?
La API devuelve un error 402 Payment Required. Devuélvelo como resultado de herramienta para que Claude pueda informar al usuario. Puedes comprobar los credits restantes a través del dashboard o del endpoint de credits de la API.
Próximos pasos
Ahora tienes una aplicación impulsada por Claude con acceso web en vivo. Explora más:
- Inicio rápido de CrawlForge para la integración nativa de MCP con Claude Code
- Las 26 herramientas explicadas con costos en credits y ejemplos de uso
- Crear un asistente de investigación con IA con Claude y CrawlForge
- Comparativa CrawlForge vs Firecrawl para elegir la herramienta adecuada
Dale a Claude acceso a la web en vivo. Empieza gratis con 1,000 credits: sin tarjeta de crédito.
Pruébalo tú mismo — sin necesidad de registrarte
Ejecuta cualquiera de las 27 herramientas de scraping y extracción de CrawlForge en el playground y luego empieza gratis con 1,000 credits.
1,000 credits gratis • Se recargan cada mes • No se requiere tarjeta de crédito
Etiquetas
Sobre el autor
Mantente al día con los últimos artículos
Recibe tutoriales, novedades del producto y consejos de web scraping en tu bandeja de entrada.
Sin spam. Cancela tu suscripción cuando quieras.