Curso
Cursor anunció su SDK de TypeScript a finales de abril de 2026 y lo lanzó como beta pública. El paquete se publica como @cursor/sdk y se ejecuta desde entornos Node, como scripts, trabajos de CI y servicios backend.
La gran diferencia respecto a usar Cursor en el editor es dónde empieza la tarea. En lugar de abrir un chat y escribir un prompt tú mismo, tu código crea el agente, envía la tarea, hace streaming de eventos, espera el resultado y gestiona errores.
En este tutorial, configuramos el SDK, ejecutamos un quickstart local y luego construimos el proyecto principal: un agente en la nube que corrige un bug en un repositorio de GitHub y abre un pull request. Mantengo el bug pequeño a propósito para que el flujo del SDK se vea claro. Después, cubrimos los puntos de extensión y las comprobaciones de seguridad necesarias antes de adaptar el patrón. El proyecto en la nube usa un repo complementario con el script lanzador y el proyecto objetivo.
El SDK está en beta pública, así que revisa la documentación oficial antes de reutilizar este código en un proyecto a largo plazo.
¿Qué es el SDK de Cursor?
El SDK de Cursor es un paquete de TypeScript, @cursor/sdk, que te permite crear y ejecutar agentes de Cursor desde código. Te da acceso a:
- Ejecuciones de agentes locales y en la nube.
- Las herramientas de codebase de Cursor, como indexación, búsqueda, grep, servidores MCP, skills, hooks y subagentes.
- Los modelos disponibles en tu cuenta de Cursor, incluidos Composer 2, GPT-5.5 y Claude.
El SDK usa el mismo sistema de agentes que el IDE de Cursor, la CLI y la app web. La diferencia es que lo invocas desde TypeScript.
Cuándo usar el SDK
El SDK encaja en tareas que deben iniciarse desde código en lugar de por una persona tecleando en el editor. Yo lo usaría para un trabajo de CI que pida a un agente inspeccionar un test fallido, un webhook que cree una rama para un bugfix o una herramienta interna que ejecute una tarea fija de agente desde un formulario.
SDK frente a la app de Cursor
El SDK es otra forma de usar agentes de Cursor, junto al IDE de Cursor y la cursor agent CLI.
Usa el IDE para chatear en el editor. Usa la CLI para prompts en la terminal. Usa el SDK cuando código en TypeScript necesite crear el agente, enviar la tarea y manejar el resultado. Como se mencionó arriba, la CLI no admite claves de proveedores externos; el SDK también se autentica solo mediante una clave API de Cursor.
Cómo encaja el SDK de Cursor
Antes de escribir código, ayuda conocer los pocos objetos y elecciones de runtime que expone el SDK.

Arquitectura del SDK de Cursor en tres runtimes. Imagen del autor.
Tres runtimes
El SDK admite tres lugares donde puede ejecutarse un agente.
|
Runtime |
Qué hace |
Cuándo usarlo |
|
Local |
Ejecuta el agente inline en tu proceso de Node, con archivos leídos del disco |
Scripts de desarrollo, comprobaciones de CI sobre un working tree, iteración rápida |
|
Nube de Cursor |
Se ejecuta en una VM aislada con tu repo clonado, gestionada por Cursor |
Agentes en paralelo, tareas más largas, ejecuciones que continúan tras desconexiones |
|
Misma forma que la nube, pero con tus VMs y red |
Equipos que necesitan que código, secretos y artefactos de build permanezcan en su entorno |
En este artículo usamos local y la nube de Cursor. La nube autogestionada, listada arriba, es principalmente para planes Enterprise. El código del SDK cambia mediante la clave de configuración que pasas: local o cloud.
Runtime, herramientas y modelos
Una ejecución dentro del SDK tiene tres partes. El runtime es dónde se ejecuta. Las herramientas del agente incluyen indexación, búsqueda, llamadas a herramientas MCP, skills, hooks y subagentes. El modelo se selecciona con model: { id: "composer-2" } u otro id que tu cuenta pueda usar.
Configuras estas piezas en la configuración del agente.
Agent y Run
Los dos objetos principales del SDK son Agent y Run. Un agente guarda el estado de la conversación, la configuración del workspace y los ajustes del modelo. Un run es un prompt enviado a ese agente, con su propio stream, estado, resultado y handle de cancelación.
Esta separación importa porque los agentes en la nube fuerzan un run activo por agente. Si intentas enviar un segundo prompt mientras el primero sigue en curso, la API devuelve 409 agent_busy. Para ejecutar en paralelo, crea agentes separados, no runs separados sobre el mismo agente.
Eventos en streaming
Cada run expone un stream de eventos mediante run.stream(), que es un iterador asíncrono. Cada evento tiene un campo type. En la beta pública actual, el SDK emite eventos system, user, assistant, tool_call, thinking, status, request y task. No hay un evento documentado connection:reconnecting; las reconexiones se gestionan dentro del SDK.
Para actualizaciones de más bajo nivel, agent.send() también acepta callbacks onDelta y onStep.
Configurar el SDK de Cursor
La configuración es solo Node, TypeScript y una clave API de Cursor.
Requisitos previos
Necesitas:
-
Node.js 22 o superior. El paquete admite oficialmente Node 18 o superior, pero Node 22 coincide con los ejemplos del cookbook oficial y admite la flag
--env-fileque usamos abajo para cargar.env. -
Una cuenta de Cursor Pro ($20/mes) o superior para agentes en la nube.
-
Conocimientos básicos de TypeScript.
-
tsxpara ejecutar TypeScript sin compilar.
Instala el SDK y las herramientas de TypeScript:
Instala el SDK
En una carpeta nueva:
npm init -y
npm install @cursor/sdk
npm install --save-dev typescript tsx @types/node
Añade "type": "module" a tu package.json para que las importaciones funcionen como ESM. Luego añade un tsconfig.json que admita await a nivel superior y liberación asíncrona explícita:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"lib": ["ES2022", "ESNext.Disposable"],
"strict": true,
"esModuleInterop": true
}
}
Consigue una clave API de Cursor
La clave se generaba originalmente en cursor.com/dashboard/cloud-agents, pero se ha movido a cursor.com/dashboard/integrations. Si una guía apunta a "Cloud Agents", comprueba Integrations.

Genera User API Keys desde Integrations. Imagen del autor.
Genera una User API Key allí y guárdala como CURSOR_API_KEY:
echo 'CURSOR_API_KEY=crsr_your_key_here' > .env
Añade .env a tu .gitignore. El SDK lee process.env directamente; no carga archivos .env por ti.
Estructura del proyecto
Estructura de carpetas: package.json, tsconfig.json, .env y src/ para tus scripts. Añade una carpeta .cursor/ para hooks, skills y subagentes cuando los necesites.
Tu primer agente local de Cursor
El primer ejemplo es intencionadamente pequeño. Crea un agente local, envía un prompt, hace streaming de la respuesta y libera el agente.
Crea un agente local
Crea src/01-quickstart.ts:
import { Agent, type SDKMessage } from "@cursor/sdk";
const agent = await Agent.create({
apiKey: process.env.CURSOR_API_KEY!,
model: { id: "composer-2" },
local: { cwd: process.cwd() },
});
Agent.create() devuelve un handle antes de que el agente haya hecho ningún trabajo. local: { cwd: process.cwd() } apunta el agente al directorio de trabajo actual. El SDK admite liberación asíncrona; en un tutorial prefiero un bloque finally explícito porque evita dudas sobre await using y versiones.
Envía un prompt y haz streaming de la respuesta
Enviar un prompt devuelve un objeto Run con su propio stream y estado. Este ejemplo lee el stream en un bucle for await e imprime solo el texto del asistente.
try {
const run = await agent.send(
`Write a terminal-friendly summary for a screenshot.
Output exactly:
Local agent summary
- Purpose: demonstrates a local Cursor SDK agent.
- Key files: src/01-quickstart.ts, package.json, tsconfig.json.
- SDK action: creates an agent and streams assistant text.
Rules:
Print exactly those three bullets.
No Markdown bold.
No extra explanation.`,
);
for await (const event of run.stream()) {
if (event.type !== "assistant") continue;
for (const block of event.message.content) {
if (block.type === "text") {
process.stdout.write(block.text);
}
}
}
const result = await run.wait();
const duration = result.durationMs === undefined ? "" : `duration=${result.durationMs}ms`;
console.log(`\n[done] status=${result.status}${duration}`);
} finally {
await agent[Symbol.asyncDispose]();
}
El agente emite varios tipos de evento, como thinking, tool_call y status. Este ejemplo filtra por texto del assistant porque es la respuesta visible. event.message.content está tipado y es utilizable para streaming, pero es por bloques y puede incluir llamadas a herramientas. Si solo necesitas el texto final, omite el stream y lee result.result tras run.wait(). durationMs es pública pero opcional, por eso el ejemplo la trata como opcional.
Gestiona errores
El SDK lanza errores tipados que extienden CursorAgentError. Casos comunes incluyen AuthenticationError por una clave errónea, ConfigurationError por un id de modelo inválido, RateLimitError, IntegrationNotConnectedError y NetworkError.
import { CursorAgentError } from "@cursor/sdk";
try {
// ... agent code
} catch (error) {
if (error instanceof CursorAgentError) {
console.error([${error.code ?? "unknown"}] ${error.message});
if (error.isRetryable) {
console.error("Retryable. Try again in a moment.");
}
} else {
throw error;
}
}
La marca isRetryable es lo que debe comprobar tu lógica de reintentos. Los errores de red y los límites de ritmo son reintentables; la configuración incorrecta y la autenticación, no.
Ejecútalo
Guarda el archivo y ejecútalo con el cargador de .env de Node y tsx.
node --env-file=.env --import tsx/esm src/01-quickstart.ts
La flag --env-file=.env carga CURSOR_API_KEY antes de que empiece el script. El script debería imprimir el texto del asistente y luego un pie de estado en una línea. Si ves un error de autenticación, comprueba tu .env y confirma que la clave se generó desde el panel de Integrations.
Crear un agente en la nube para corregir bugs
El siguiente ejemplo pasa de una carpeta local a un repo de GitHub clonado en la nube de Cursor. La tarea sigue siendo pequeña: arreglar un test de autenticación que falla y abrir un pull request.
Cuándo optar por la nube
Los agentes en la nube se ejecutan en VMs gestionadas por Cursor. Clonan el repo, preparan un entorno de desarrollo y continúan si tu script local termina. Al finalizar, pueden subir una rama y abrir un pull request. La contrapartida es el tiempo de arranque y un mayor uso de tokens frente a una ejecución local pequeña.
Las ejecuciones en la nube aparecen en Cursor Web y en la ventana de Agents del escritorio mientras trabajan. Los agentes en la nube lanzados por el SDK se filtran fuera de la lista por defecto. En Cursor Web, usa Filter > Source > SDK. En la ventana de Agents de escritorio, usa el pie de la barra lateral: Show > SDK. Si tienes el id del agente bc-, también puedes abrirlo directamente en https://cursor.com/agents/bc-... o mediante el deep link de escritorio. Una regla sencilla es usar la nube cuando se cumpla cualquiera de estos puntos:
- La tarea puede durar más que una sesión de script local.
- Quieres un PR o rama como salida, no solo texto.
- Quieres ejecutar varios agentes en paralelo contra el mismo repo.
- El agente necesita ejecutar código (tests, builds) en un entorno aislado.
Para comprobaciones locales cortas, usa el runtime local.
Configura el agente
La configuración en la nube sustituye la clave local por cloud. Indicas el repo a clonar, opcionalmente fijas una rama inicial y decides si Cursor debe abrir un PR al finalizar la ejecución.
import { Agent, CursorAgentError } from "@cursor/sdk";
const agent = await Agent.create({
apiKey: process.env.CURSOR_API_KEY!,
name: "Cloud bug fixer",
model: { id: "composer-2" },
cloud: {
repos: [
{ url: "https://github.com/your-org/your-repo", startingRef: "main" },
],
autoCreatePR: true,
},
});
console.log(Started cloud agent ${agent.agentId});
repos es un array, pero la nube v1 actualmente admite un único repo por agente. startingRef es la rama o commit desde el que empieza el agente. autoCreatePR: true pide a Cursor abrir un pull request al terminar. Los permisos de GitHub, el estado de la integración, diffs vacíos o reglas del repo pueden dejarte solo con una rama en lugar de un PR.
Para que el agente clone el repo, tu cuenta de Cursor debe tener configurada la integración con GitHub. Si no está conectada, el SDK devuelve un IntegrationNotConnectedError con un campo helpUrl.
Envía la tarea y reconéctate más tarde
El patrón de abajo envía una tarea y luego espera el resultado a través de Agent.getRun(). Esto permite que otro proceso se reconecte después si el script original termina.
const run = await agent.send(
"Find the failing test in the auth module, fix the bug, and add a regression test.",
);
console.log(Run ${run.id} in progress.);
const handle = await Agent.getRun(run.id, {
runtime: "cloud",
agentId: agent.agentId,
apiKey: process.env.CURSOR_API_KEY!,
});
const result = await handle.wait();
const branch = result.git?.branches?.[0];
console.log(Status: ${result.status});
if (branch?.prUrl) {
console.log(PR: ${branch.prUrl});
} else if (branch?.branch) {
console.log(Branch: ${branch.branch});
}
Puedes hacer streaming del run para ver salida en vivo, pero wait() basta cuando solo necesitas el resultado. Cuando se crea un PR, la URL se devuelve en result.git?.branches[0]?.prUrl; la nube v1 aún no admite varios repos, así que el índice 0 es la rama que debes comprobar. Si no hay URL de PR, revisa branch?.branch y abre el PR manualmente. Conserva run.id y agent.agentId si planeas reanudar más tarde.
Llegados a este punto, revisa el pull request como cualquier otro cambio de código.
Local frente a nube de un vistazo
Ambos runtimes usan el mismo SDK pero se comportan de forma diferente.
|
Capacidad |
Local |
Nube |
|
Dónde se ejecuta |
Tu proceso de Node |
Una VM gestionada por Cursor |
|
Acceso a archivos |
Tu disco |
Solo el repo clonado |
|
Sobrelleva desconexiones |
No |
Sí |
|
Abre PRs |
No |
Sí, cuando los permisos del repo lo permiten |
|
Devuelve artefactos |
No |
Sí (URLs prefirmadas de 15 minutos) |
|
Úsalo para |
Iteración, CI sobre un checkout |
Tareas largas, ejecuciones en paralelo, salida en PR |
Usa ejecuciones locales para comprobaciones rápidas. Usa la nube cuando necesites una rama, un PR o un artefacto.
Otros ejemplos
El corrector de bugs usó el flujo principal del SDK: crear un agente, enviar una tarea, esperar un resultado y revisar la salida. El cookbook de Cursor muestra las mismas llamadas del SDK en ejemplos más grandes:
-
agent-kanbanlista agentes en la nube, los agrupa por estado o repo y previsualiza artefactos. -
coding-agent-clienvuelve agentes locales y en la nube en una herramienta de terminal. -
app-builderejecuta un agente local desde una UI de chat y previsualiza código React generado.
Un detalle a tener claro es la gestión de artefactos. Los artefactos solo están disponibles en ejecuciones en la nube. Los agentes locales encajan con salidas de texto y comprobaciones rápidas. Los agentes en la nube encajan con tareas que necesitan archivos, ramas o PRs como salida.
MCP, skills, hooks y subagentes
El SDK puede leer la misma configuración de agentes de proyecto que usa Cursor en el IDE. El corrector de bugs no necesita todo, pero estas piezas importan cuando el agente trabaja en un repo real.
Servidores MCP
Como se mencionó, los servidores MCP conectan agentes con herramientas externas. Puedes pasarlos inline en Agent.create() o definirlos en .cursor/mcp.json. Si vuelves a pasar mcpServers en agent.send(), esa ejecución usa los servidores de send() en lugar de los de Agent.create(). Usa servidores MCP HTTP para herramientas alojadas. Usa servidores MCP stdio para herramientas que corren junto al agente.
Skills
Las skills son archivos markdown en .cursor/skills/ que dan al agente instrucciones de proyecto, como elecciones de framework de tests, convenciones de API o reglas de releases. Úsalas para pautas que deban aplicarse a cada ejecución del repo.
Hooks
Los hooks viven en .cursor/hooks.json y se ejecutan en puntos específicos del bucle del agente. Usos comunes incluyen formatear tras ediciones de archivos y bloquear comandos de shell destructivos antes de su ejecución. Para hooks de seguridad, usa comportamiento de fallo cerrado para que un hook roto bloquee la acción.
Subagentes
Los subagentes son agentes con nombre a los que el agente principal puede llamar para trabajo focalizado, como revisión de código o escritura de tests. Defínelos en .cursor/agents/*.md o inline en Agent.create({ agents: { ... } }). Los agentes en la nube cargan subagentes del proyecto desde el repo checkout. Los agentes locales necesitan local.settingSources: ["project"] si quieres que lean la configuración .cursor/ del proyecto. Mantén cada subagente acotado.
Comprobaciones de seguridad
Antes de que los agentes toquen un repo real, define primero los límites. Esta parte no me la saltaría.
-
Restringe permisos al mínimo. Los agentes pueden leer archivos, ejecutar comandos y usar cualquier credencial que les expongas. Dales acceso acotado al repo, no credenciales amplias de servicios.
-
Mantén los secretos fuera de los prompts. Los prompts pueden acabar en transcripciones. Usa variables de entorno para
CURSOR_API_KEYy cualquier otro token, y recuerda que los valoresenven servidores MCP stdio llegan al runtime donde se ejecuta el servidor. -
Exige revisión humana. Si un agente en la nube puede abrir PRs, la protección de ramas debería exigir un revisor humano antes del merge. No combines
autoCreatePR: truecon auto-merge salvo que el repo sea de bajo riesgo. -
Vigila el coste y la elección de modelo. El uso del SDK consume del pool de uso por tokens de Cursor. Como se mencionó, Composer 2 es una opción de modelo para tareas de código; llama a
Cursor.models.list()si necesitas ver qué ids de modelo puede usar tu cuenta. -
Registra la ejecución.
run.conversation()devuelve una vista estructurada de los turnos del agente. Guárdala para ejecuciones que quizá necesites depurar o auditar.
Conclusión
Este artículo cubrió npm install @cursor/sdk, un quickstart local, un agente en la nube que abre un pull request y los principales puntos de extensión para el comportamiento de agentes en repos.
Usa el SDK cuando el código tenga que iniciar y gestionar el agente. Si la tarea es solo una conversación en el editor, normalmente basta con la app de Cursor.
Para comparar, nuestras guías sobre el Claude Agent SDK y el OpenAI Agents SDK cubren APIs de agentes en otros ecosistemas.
Soy ingeniero de datos y creador de comunidades. Trabajo con canalizaciones de datos, nube y herramientas de IA, al tiempo que escribo tutoriales prácticos y de gran impacto para DataCamp y programadores emergentes.
FAQs
¿Funciona el SDK de Cursor con Python u otro lenguaje?
Oficialmente no. El SDK es solo para TypeScript en la beta pública; los usuarios de Python deberían llamar directamente a la Cloud Agents REST API.
¿Puedo usar el SDK con el plan gratuito Hobby?
Sí para agentes locales, dentro de los límites de la capa gratuita y topes de uso. No para agentes en la nube; esos requieren Pro o superior.
¿Cómo cancelo una ejecución que tarda demasiado?
Llama a run.cancel(). El estado pasa a cancelled, el stream en vivo se aborta y run.wait() resuelve con el resultado cancelado.
¿Dónde encajan los hooks si el SDK no tiene un callback programático?
Los hooks son política del repo, no lógica por script. Pon reglas compartidas en .cursor/hooks.json y deja la lógica específica de run alrededor de agent.send() o run.wait() en tu código TypeScript.
¿Está el SDK listo para producción?
Úsalo primero para tareas de bajo riesgo. La superficie del SDK sigue en beta pública. Fija @cursor/sdk, limita secretos, exige revisión y espera cambios en la API antes de la disponibilidad general.


