Cracked
Una clave para 63,577 herramientas de agentes: scrapers, búsqueda, datos, modelos de IA. Pago por llamada, ejecuciones fallidas gratis. MCP + REST.
Documentación
Actualizado el 2 de septiembre de 2026 · probado con el protocolo MCP 2025-06-18 · por Cracked Engineering
Servidor MCP
Cracked expone un servidor MCP remoto a través de HTTP Streamable en https://cracked.ai/mcp. Dos formas de autenticarse: OAuth 2.1 (inicia sesión con tu cuenta de Cracked desde Claude.ai, Claude Desktop, ChatGPT, Cursor) o un encabezado de clave API bearer (Claude Code, Codex, OpenCode, scripts).
Herramientas expuestas
Las herramientas genéricas están siempre registradas. Además de ellas, cada capacidad de smart-run está disponible como su propia herramienta tipada (id de capacidad con guiones bajos: instagram-profile se convierte en instagram_profile), de modo que un cliente puede llamar a weather_forecast({latitude, longitude}) directamente en lugar de descubrir e inspeccionar primero.
| Herramienta | Argumentos | Propósito |
|---|---|---|
discover_tools | query, limit?, live_only? | Búsqueda en lenguaje natural con precio, salud y disponibilidad. |
inspect_tool | provider, endpoint | Esquema, precio, salud, documentación. |
run_tool | provider, endpoint, input, wait? | Ejecutar y facturar. wait:false para scrapers largos. |
run_capability | capability, input, wait? | Smart run por id de capacidad; recurre entre proveedores. |
list_capabilities | id? | Ids de capacidad, esquemas de entrada, candidatos clasificados. Gratis. |
get_run | run_id, wait_seconds? | Consultar una ejecución asíncrona. |
get_balance | Saldo del espacio de trabajo en USD. | |
create_checkout_link | amount_usd, ref?, promo?, success_url? | Genera un enlace de pago con tarjeta para entregar a tu propietario. Gratis hasta que se pague. |
recruit_agent | agent_name?, task? | Prompt de incorporación para otro agente con tu enlace de referencia incrustado (registro, primera ejecución, flujo de reclamo). Gratis. |
<capability> | los campos de entrada de la capacidad | Una herramienta por capacidad, p. ej. web_search, instagram_profile, weather_forecast. Devuelve primero la salida normalizada y luego un resumen compacto de la ejecución (routedTo, status, cost, runId). |
Conjuntos de herramientas
164 herramientas de capacidad es más de lo que algunos clientes listan cómodamente, por lo que el conjunto se elige con un parámetro de consulta tools en la URL del servidor. Todo lo demás (autenticación, metadatos OAuth, facturación) es idéntico.
| URL | Herramientas | Úsalo cuando |
|---|---|---|
https://cracked.ai/mcp o ?tools=top | genéricas + 40 capacidades más usadas | Predeterminado. Instagram, TikTok, YouTube, X, LinkedIn, Google Maps, Amazon, búsqueda web y scraping, enriquecimiento, clima, acciones, cripto, generación de imágenes y voz, transcripción, chat LLM. |
https://cracked.ai/mcp?tools=all | genéricas + las 164 capacidades | Agentes que eligen herramientas por nombre y esquema y pueden mantener una lista larga de herramientas. |
https://cracked.ai/mcp?tools=core | solo genéricas | Clientes con presupuestos pequeños de herramientas; usa run_capability y run_tool. |
El identificador de recurso protegido OAuth es https://cracked.ai/mcp para los tres; los clientes que se conectan a /mcp?tools=all descubren los mismos metadatos en /.well-known/oauth-protected-resource/mcp e inician sesión una vez.
Ejemplo de entrada tools/list para una herramienta de capacidad:
{
"name": "weather_forecast",
"title": "Weather forecast",
"description": "Current conditions plus daily forecast for coordinates. Use geocode first for a city name. Price: from $0.002/call via Open-Meteo Weather + $0.001 platform fee, billed to the workspace balance. Smart run: Cracked picks the best live tool for \"weather-forecast\", maps the input and falls back to the next provider on failure (1 live).",
"inputSchema": { "type": "object", "properties": { "latitude": { "type": "number", "description": "Latitude" }, "longitude": { "type": "number", "description": "Longitude" }, "days": { "type": "number", "description": "Forecast days 1-16" }, "units": { "type": "string", "description": "celsius or fahrenheit" } }, "required": ["latitude", "longitude"] }
}
Llamarla devuelve primero la salida y luego un resumen compacto de la ejecución:
{
"output": { "timezone": "America/Chicago", "current": { "temperature_2m": 91.6, "relative_humidity_2m": 41, ... }, "daily": { ... } },
"run": { "capability": "weather-forecast", "status": "COMPLETED", "routedTo": { "provider": "open-meteo", "endpoint": "/forecast" }, "httpStatus": 200, "runId": "b637d650-...", "totalUsd": 0.003, "durationMs": 1107, "attempts": 1, "fallbackUsed": false, "tried": [ ... ] },
"hints": { "capability": "GET /v1/capabilities?id=weather-forecast" }
}
Claude.ai y Claude Desktop (OAuth)
Configuración → Conectores → Añadir conector personalizado. Nombre Cracked, URL https://cracked.ai/mcp (o https://cracked.ai/mcp?tools=all). Claude descubre nuestro servidor OAuth, se registra, te envía a la pantalla de consentimiento de Cracked y eliges el espacio de trabajo a facturar. Los tokens duran 30 días y se renuevan automáticamente. Revócalos desde API keys.
ChatGPT
Configuración → Conectores → Crear. URL de conexión https://cracked.ai/mcp (o https://cracked.ai/mcp?tools=all para exponer cada capacidad), autenticación OAuth. Mismo flujo de consentimiento. ChatGPT lista cada capacidad como una acción separada, por lo que el conjunto predeterminado mantiene la página del conector legible.
Claude Code
# default: generic tools + 40 most-used capabilities as typed tools
claude mcp add --transport http cracked https://cracked.ai/mcp --header "Authorization: Bearer ck_live_..."
# every capability as a tool
claude mcp add --transport http cracked "https://cracked.ai/mcp?tools=all" --header "Authorization: Bearer ck_live_..."
# or let Claude Code run the OAuth flow:
claude mcp add --transport http cracked https://cracked.ai/mcp
Cursor
{ "mcpServers": { "cracked": { "url": "https://cracked.ai/mcp?tools=all", "headers": { "Authorization": "Bearer ck_live_..." } } } }
Un clic: cracked.ai/install tiene un enlace profundo de Cursor para el conjunto predeterminado y uno para tools=all.
Codex
codex mcp add cracked --url https://cracked.ai/mcp --header "Authorization: Bearer ck_live_..."
OpenCode
{ "mcp": { "cracked": { "type": "remote", "url": "https://cracked.ai/mcp", "enabled": true, "headers": { "Authorization": "Bearer ck_live_..." } } } }
Herramientas nativas para los SDK de OpenAI y Anthropic (sin MCP)
Las mismas definiciones de herramientas se sirven como JSON plano en GET https://cracked.ai/v1/capabilities/tools (gratis, sin autenticación, CORS *, caché de una hora). Pega el array en tools=[...] y luego ejecuta cada llamada que haga el modelo con POST https://cracked.ai/v1/run {"capability", "input"}. El nombre de la herramienta es el id de capacidad con guiones bajos; /v1/run acepta cualquiera de las dos grafías.
| Consulta | Devuelve |
|---|---|
?format=openai (predeterminado) | [{ type: "function", function: { name, description, parameters } }] |
?format=anthropic | [{ name, description, input_schema }] |
?format=mcp | [{ name, title, description, inputSchema }], lo que lista /mcp |
&set=top (predeterminado) / &set=all | 40 capacidades más usadas / las 164 |
SDK de OpenAI (Python)
import json, os, requests
from openai import OpenAI
CRACKED = "https://cracked.ai"
H = {"Authorization": f"Bearer {os.environ['CRACKED_API_KEY']}", "content-type": "application/json"}
tools = requests.get(f"{CRACKED}/v1/capabilities/tools?format=openai&set=top").json()
def run_capability(name, arguments):
r = requests.post(f"{CRACKED}/v1/run", headers=H, json={"capability": name, "input": arguments}, timeout=300).json()
return r.get("output") if r.get("status") == "COMPLETED" else {"error": r.get("status"), "detail": r.get("providerResponse"), "attempts": r.get("attempts")}
client = OpenAI()
messages = [{"role": "user", "content": "How many followers does @nike have on Instagram, and what is the weather in Austin?"}]
while True:
resp = client.chat.completions.create(model="gpt-4.1", messages=messages, tools=tools)
msg = resp.choices[0].message
messages.append(msg)
if not msg.tool_calls:
print(msg.content); break
for call in msg.tool_calls:
out = run_capability(call.function.name, json.loads(call.function.arguments))
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(out)})
SDK de Anthropic (Python)
import json, os, requests
import anthropic
CRACKED = "https://cracked.ai"
H = {"Authorization": f"Bearer {os.environ['CRACKED_API_KEY']}", "content-type": "application/json"}
tools = requests.get(f"{CRACKED}/v1/capabilities/tools?format=anthropic&set=top").json()
def run_capability(name, arguments):
r = requests.post(f"{CRACKED}/v1/run", headers=H, json={"capability": name, "input": arguments}, timeout=300).json()
return r.get("output") if r.get("status") == "COMPLETED" else {"error": r.get("status"), "detail": r.get("providerResponse"), "attempts": r.get("attempts")}
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "How many followers does @nike have on Instagram, and what is the weather in Austin?"}]
while True:
resp = client.messages.create(model="claude-opus-5", max_tokens=16000, tools=tools, messages=messages)
messages.append({"role": "assistant", "content": resp.content})
if resp.stop_reason != "tool_use":
print(next(b.text for b in resp.content if b.type == "text")); break
results = []
for block in resp.content:
if block.type == "tool_use":
out = run_capability(block.name, block.input)
results.append({"type": "tool_result", "tool_use_id": block.id, "content": json.dumps(out)})
messages.append({"role": "user", "content": results})
SDK de Anthropic (TypeScript)
import Anthropic from "@anthropic-ai/sdk";
const CRACKED = "https://cracked.ai";
const H = { Authorization: \`Bearer ${process.env.CRACKED_API_KEY}\`, "content-type": "application/json" };
const tools = (await (await fetch(\`${CRACKED}/v1/capabilities/tools?format=anthropic&set=top\`)).json()) as Anthropic.Tool[];
async function runCapability(name: string, input: unknown) {
const r = await (await fetch(\`${CRACKED}/v1/run\`, { method: "POST", headers: H, body: JSON.stringify({ capability: name, input }) })).json();
return r.status === "COMPLETED" ? r.output : { error: r.status, detail: r.providerResponse, attempts: r.attempts };
}
const client = new Anthropic();
const messages: Anthropic.MessageParam[] = [{ role: "user", content: "Top 5 news stories about peptides this week, with URLs." }];
for (;;) {
const resp = await client.messages.create({ model: "claude-opus-5", max_tokens: 16000, tools, messages });
messages.push({ role: "assistant", content: resp.content });
if (resp.stop_reason !== "tool_use") { console.log(resp.content.find((b) => b.type === "text")?.text); break; }
const results: Anthropic.ToolResultBlockParam[] = [];
for (const block of resp.content) if (block.type === "tool_use") results.push({ type: "tool_result", tool_use_id: block.id, content: JSON.stringify(await runCapability(block.name, block.input)) });
messages.push({ role: "user", content: results });
}
Scrapers largos: envía "wait": false a /v1/run, recibe HTTP 202 con un runId y luego consulta GET /v1/runs/{runId}?wait=30. Las ejecuciones con estado distinto de 2xx nunca se facturan. Consulta Smart run para las reglas de enrutamiento y la referencia de la API para cada campo.
Detalles de OAuth
- Descubrimiento:
https://cracked.ai/.well-known/oauth-authorization-serveryhttps://cracked.ai/.well-known/oauth-protected-resource/mcp. - Registro dinámico de clientes (RFC 7591) en
/oauth/register; sin configuración manual de clientes. - Código de autorización con PKCE (S256), tokens de actualización, revocación en
/oauth/revoke. - Ámbitos:
tools:discover,tools:run,wallet:read,offline_access. - Un token de acceso es una clave con ámbito de espacio de trabajo (
ck_oauth_…) que también funciona en la API HTTP.
Verificar desde la shell
curl -s "https://cracked.ai/mcp?tools=all" -H "Authorization: Bearer ck_live_..." -H "content-type: application/json" -H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
# call a capability tool directly
curl -s https://cracked.ai/mcp -H "Authorization: Bearer ck_live_..." -H "content-type: application/json" -H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"weather_forecast","arguments":{"latitude":30.27,"longitude":-97.74}}}'