Ir al contenido principal

Tutorial del SDK de Cursor: ejecuta agentes de código con TypeScript

Usa el SDK de Cursor para ejecutar un agente local y luego un agente en la nube que corrige un pequeño bug en un repo de GitHub y abre un pull request.
Actualizado 17 sept 2026  · 12 min leer

Explorar con IA

ChatGPTClaudePerplexity

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.

Diagrama que muestra el enrutamiento del SDK de Cursor hacia Node local, VM en la nube de Cursor o VM gestionada por el usuario, todos compartiendo las mismas herramientas de agente y capa de modelos.

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

Nube autogestionada

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-file que usamos abajo para cargar .env.

  • Una cuenta de Cursor Pro ($20/mes) o superior para agentes en la nube.

  • Conocimientos básicos de TypeScript.

  • tsx para 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.

Página de Integrations del panel de Cursor con la sección User API Keys resaltada y un botón Generate visible.

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.

Streaming de eventos desde un agente local. Vídeo del autor.

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.

Ejecución en la nube iniciada desde el SDK. Vídeo del autor.

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.

PR de GitHub creado por un agente en la nube. Vídeo del autor.

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

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-kanban lista agentes en la nube, los agrupa por estado o repo y previsualiza artefactos.

  • coding-agent-cli envuelve agentes locales y en la nube en una herramienta de terminal.

  • app-builder ejecuta 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_KEY y cualquier otro token, y recuerda que los valores env en 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: true con 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.


Khalid Abdelaty's photo
Author
Khalid Abdelaty
LinkedIn

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.

Temas
Inteligencia Artificial

Aprende con DataCamp

Curso

Desarrollo de software con Cursor

1 h 30 min
4.2K
Crea código listo para producción con Cursor. Aprende sobre indicaciones de IA, refactorización, pruebas y flujos de trabajo avanzados.
Ver detallesRight Arrow
Iniciar Curso
Ver másRight Arrow
Relacionado
cursor ai code editor

Tutorial

Cursor AI: Una guía con 10 ejemplos prácticos

Aprende a instalar Cursor AI en Windows, macOS y Linux, y descubre cómo utilizarlo a través de 10 casos de uso diferentes.

Tutorial

Tutorial de DeepSeek-Coder-V2: Ejemplos, instalación, puntos de referencia

DeepSeek-Coder-V2 es un modelo de lenguaje de código de código abierto que rivaliza con el rendimiento de GPT-4, Gemini 1.5 Pro, Claude 3 Opus, Llama 3 70B o Codestral.
Dimitri Didmanidze's photo

Dimitri Didmanidze

8 min

Tutorial

Tutorial de la API de OpenAI Assistants

Una visión completa de la API Assistants con nuestro artículo, que ofrece una mirada en profundidad a sus características, usos en la industria, guía de configuración y las mejores prácticas para maximizar su potencial en diversas aplicaciones empresariales.
Zoumana Keita 's photo

Zoumana Keita

14 min

Tutorial

Guía de torchchat de PyTorch: Configuración local con Python

Aprende a configurar el torchat de PyTorch localmente con Python en este tutorial práctico, que proporciona orientación paso a paso y ejemplos.

Tutorial

Tutorial de GitHub y Git para principiantes

Un tutorial para principiantes que muestra cómo funciona Git y por qué es clave en proyectos de ciencia de datos.
Abid Ali Awan's photo

Abid Ali Awan

9 min

Tutorial

Tutorial de GIT Push y Pull

Aprende a realizar solicitudes de Git PUSH y PULL con GitHub Desktop y la línea de comandos.

Olivia Smith

13 min

Ver MásVer Más