Pular para o conteúdo principal

Tutorial do Cursor SDK: execute agentes de código com TypeScript

Use o Cursor SDK para rodar um agente local e, depois, um agente em nuvem que corrige um pequeno bug em um repo do GitHub e abre um pull request.
Atualizado 17 de set. de 2026  · 12 min lido

Explorar com IA

ChatGPTClaudePerplexity

A Cursor anunciou seu SDK para TypeScript no fim de abril de 2026 e o lançou em beta público. O pacote é publicado como @cursor/sdk e roda em ambientes Node, como scripts, jobs de CI e serviços de backend.

A principal diferença em relação ao uso do Cursor no editor é onde a tarefa começa. Em vez de abrir um chat e digitar o prompt você mesmo, seu código cria o agente, envia a tarefa, transmite eventos, aguarda o resultado e trata erros.

Neste tutorial, configuramos o SDK, executamos um quickstart local e, depois, construímos o projeto principal: um agente em nuvem que corrige um bug em um repositório do GitHub e abre um pull request. Eu deixo o bug pequeno de propósito para que o fluxo do SDK fique visível. Em seguida, cobrimos os pontos de extensão e as verificações de segurança necessárias antes de adaptar o padrão. O projeto em nuvem usa um repositório de apoio com o script de inicialização e o projeto alvo.

O SDK está em beta público, então confira a documentação oficial antes de reutilizar este código em um projeto de longo prazo.

O que é o Cursor SDK?

O Cursor SDK é um pacote TypeScript, @cursor/sdk, que permite criar e executar agentes do Cursor via código. Ele dá acesso a:

  • Execuções de agentes locais e em nuvem.
  • Ferramentas de codebase do Cursor, incluindo indexação, busca, grep, servidores MCP, skills, hooks e subagentes.
  • Os modelos disponíveis na sua conta Cursor, incluindo Composer 2, GPT-5.5 e Claude.

O SDK usa o mesmo sistema de agentes do Cursor IDE, CLI e app web. A diferença é que você o chama a partir de TypeScript.

Quando usar o SDK

O SDK se encaixa em tarefas que devem começar pelo código, e não por uma pessoa digitando no editor. Eu usaria em um job de CI que pede para um agente inspecionar um teste com falha, um webhook que cria uma branch para correção de bug ou uma ferramenta interna que roda uma tarefa fixa de agente a partir de um formulário.

SDK versus o app Cursor

O SDK é mais uma forma de usar agentes do Cursor, ao lado do Cursor IDE e do cursor agent CLI.

Use o IDE para conversar no editor. Use a CLI para prompts no terminal. Use o SDK quando código TypeScript precisar criar o agente, enviar a tarefa e lidar com o resultado. Como mencionado acima, a CLI não aceita chaves de provedores externos; o SDK também autentica apenas com uma chave de API do Cursor.

Como o Cursor SDK se organiza

Antes de escrever código, ajuda conhecer os poucos objetos e opções de runtime que o SDK expõe.

Diagrama mostrando o roteamento do código do Cursor SDK para Node local, VM em nuvem do Cursor ou VM gerenciada pelo usuário, todos compartilhando as mesmas ferramentas de agente e camada de modelos.

Arquitetura do Cursor SDK em três runtimes. Imagem do autor.

Três runtimes

O SDK suporta três locais onde um agente pode rodar.

Runtime 

O que faz

Quando usar

Local 

Executa o agente inline no seu processo Node, com arquivos lidos do disco

Scripts de dev, checagens de CI contra a working tree, iteração rápida

Nuvem do Cursor

Roda em uma VM isolada com seu repo clonado, gerenciada pelo Cursor

Agentes em paralelo, tarefas longas, execuções que continuam após desconexões

Nuvem autogerenciada

Mesma proposta da nuvem, mas com suas VMs e rede

Times que precisam manter código, segredos e artefatos dentro do seu ambiente

Neste artigo, usamos local e nuvem do Cursor. A nuvem autogerenciada, citada acima, é principalmente para planos Enterprise. O código do SDK muda via a chave de configuração que você passa: local ou cloud.

Runtime, ferramentas e modelos

Uma execução no SDK tem três partes. O runtime é onde executa. As ferramentas do agente incluem indexação, busca, chamadas de ferramenta MCP, skills, hooks e subagentes. O modelo é selecionado com model: { id: "composer-2" } ou outro id disponível na sua conta.

Você define essas peças na configuração do agente.

Agent e Run

Os dois objetos principais do SDK são o Agent e o Run. Um agente guarda o estado da conversa, a configuração do workspace e as definições do modelo. Um run é um prompt enviado a esse agente, com seu próprio stream, status, resultado e handle de cancelamento.

A separação importa porque agentes em nuvem impõem um run ativo por agente. Se você tentar enviar um segundo prompt enquanto o primeiro ainda está rodando, a API retorna 409 agent_busy. Para rodar em paralelo, crie agentes separados, e não vários runs no mesmo agente.

Streaming de eventos

Cada run expõe um stream de eventos via run.stream(), que é um iterador assíncrono. Cada evento tem um campo type. No beta público atual, o SDK emite eventos system, user, assistant, tool_call, thinking, status, request e task. Não há um evento documentado connection:reconnecting; reconexões são tratadas dentro do SDK.

Para atualizações de nível mais baixo, agent.send() também aceita callbacks onDelta e onStep.

Configurando o Cursor SDK

A configuração é só Node, TypeScript e uma chave de API do Cursor.

Pré-requisitos

Você precisa de:

  • Node.js 22 ou mais recente. O pacote oficialmente suporta Node 18+, mas o Node 22 acompanha os exemplos do cookbook oficial e suporta a flag --env-file usada abaixo para carregar o .env.

  • Uma conta Cursor no plano Pro (US$ 20/mês) ou superior para agentes em nuvem.

  • Familiaridade básica com TypeScript.

  • tsx para rodar TypeScript sem compilar.

Instale o SDK e as ferramentas de TypeScript:

Instale o SDK

Em uma pasta nova:

npm init -y
npm install @cursor/sdk
npm install --save-dev typescript tsx @types/node

Adicione "type": "module" ao seu package.json para que os imports funcionem como ESM. Depois, adicione um tsconfig.json que suporte await no topo do arquivo e descarte assíncrono explícito:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "lib": ["ES2022", "ESNext.Disposable"],
    "strict": true,
    "esModuleInterop": true
  }
}

Obtenha uma chave de API do Cursor

A chave era gerada originalmente em cursor.com/dashboard/cloud-agents, mas foi movida para cursor.com/dashboard/integrations. Se um guia apontar para "Cloud Agents", confira em Integrations.

Página Integrations do painel do Cursor com a seção User API Keys destacada e um botão Generate visível.

Gere User API Keys em Integrations. Imagem do autor.

Gere uma User API Key ali e armazene como CURSOR_API_KEY:

echo 'CURSOR_API_KEY=crsr_your_key_here' > .env

Adicione .env ao seu .gitignore. O SDK lê process.env diretamente; ele não carrega arquivos .env para você.

Estrutura do projeto

Estrutura de pastas: package.json, tsconfig.json, .env e src/ para seus scripts. Adicione uma pasta .cursor/ para hooks, skills e subagentes quando precisar.

Seu primeiro agente Cursor local

O primeiro exemplo é propositalmente pequeno. Ele cria um agente local, envia um prompt, transmite a resposta e encerra o agente.

Crie um agente local

Crie 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() retorna um handle antes do agente fazer qualquer trabalho. local: { cwd: process.cwd() } aponta o agente para o diretório de trabalho atual. O SDK suporta descarte assíncrono; em código de tutorial, eu prefiro um bloco finally explícito porque evita dúvidas sobre a versão de await using.

Envie um prompt e transmita a resposta

Enviar um prompt retorna um objeto Run com seu próprio stream e status. Este exemplo lê o stream em um loop for await e imprime apenas o texto do assistant.

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]();
}

O agente emite vários tipos de evento, incluindo thinking, tool_call e status. Este exemplo filtra pelo texto do assistant porque esse é o conteúdo visível. event.message.content é tipado e utilizável para streaming, mas é baseado em blocos e pode incluir chamadas de ferramenta. Se você só precisa do texto final, pule o stream e leia result.result após run.wait(). durationMs é público, porém opcional, então o exemplo o trata como opcional.

Trate erros

O SDK lança erros tipados que estendem CursorAgentError. Casos comuns incluem AuthenticationError para chave inválida, ConfigurationError para id de modelo inválido, RateLimitError, IntegrationNotConnectedError e 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;
  }
}

A flag isRetryable é o que sua lógica de retry deve checar. Erros de rede e limite de taxa são retomáveis; configuração ruim e autenticação não são.

Execute

Salve o arquivo e rode com o carregador de .env do Node e tsx.

node --env-file=.env --import tsx/esm src/01-quickstart.ts

A flag --env-file=.env carrega CURSOR_API_KEY antes do script iniciar. O script deve imprimir o texto do assistant e, depois, um rodapé de status em uma linha. Se você vir um erro de autenticação, confira seu .env e confirme que a chave foi gerada no painel de Integrations.

Transmitindo eventos de um agente local. Vídeo do autor.

Construindo um agente de correção de bugs na nuvem

O próximo exemplo sai de uma pasta local para um repo do GitHub clonado na nuvem do Cursor. A tarefa ainda é pequena: corrigir um teste de autenticação com falha e abrir um pull request.

Quando optar pela nuvem

Agentes em nuvem rodam em VMs gerenciadas pelo Cursor. Eles clonam o repo, preparam o ambiente de desenvolvimento e continuam mesmo se seu script local encerrar. Ao terminar, podem enviar uma branch e abrir um pull request. A troca é o tempo de inicialização e maior uso de tokens em comparação com uma execução local pequena.

Execução em nuvem iniciada pelo SDK. Vídeo do autor.

As execuções em nuvem aparecem no Cursor Web e na janela de Agents do desktop enquanto trabalham. Agentes em nuvem criados via SDK ficam fora da lista padrão. No Cursor Web, use Filter > Source > SDK. No desktop, use o rodapé da sidebar: Show > SDK. Se você tiver o id do agente bc-, também pode abri-lo diretamente em https://cursor.com/agents/bc-... ou pelo deep link do desktop. Uma regra simples é usar nuvem quando qualquer uma destas for verdadeira:

  • A tarefa pode levar mais tempo do que uma sessão de script local.
  • Você quer um PR ou uma branch como output, não apenas texto.
  • Você quer rodar vários agentes em paralelo contra o mesmo repo.
  • O agente precisa executar código (testes, builds) em um ambiente isolado.

Para checagens locais curtas, use o runtime local.

Configure o agente

A configuração em nuvem substitui a chave local por cloud. Você lista o repo a ser clonado, opcionalmente fixa uma branch inicial e define se o Cursor deve abrir um PR quando a execução terminar.

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 é um array, mas a nuvem v1 atualmente suporta um único repo por agente. startingRef é a branch ou commit de onde o agente começa. autoCreatePR: true pede ao Cursor para abrir um pull request ao finalizar. Permissões do GitHub, estado da integração, diffs vazios ou regras do repo ainda podem resultar apenas em uma branch, sem PR.

Para o agente clonar o repo, sua conta Cursor precisa da integração com o GitHub configurada. Se não estiver conectada, o SDK retorna um IntegrationNotConnectedError com um campo helpUrl.

Envie a tarefa e reconecte depois

O padrão abaixo envia uma tarefa e então espera o resultado via Agent.getRun(). Isso permite que outro processo se reconecte depois, caso o script original encerre.

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});
}

Você pode transmitir a execução para output em tempo real, mas wait() é suficiente quando você só precisa do resultado. Quando um PR é criado, a URL vem em result.git?.branches[0]?.prUrl; a nuvem v1 ainda não suporta múltiplos repos, então o índice 0 é a branch a verificar. Se não houver URL de PR, confira branch?.branch e abra o PR manualmente. Guarde o run.id e o agent.agentId se planeja reanexar depois.

PR no GitHub criado por agente em nuvem. Vídeo do autor.

Neste ponto, revise o pull request como qualquer outra mudança de código.

Local versus nuvem, de relance

Os dois runtimes usam o mesmo SDK, mas se comportam de forma diferente.

Capacidade

Local

Nuvem

Onde roda

Seu processo Node

Uma VM gerenciada pelo Cursor

Acesso a arquivos

Seu disco

Apenas o repo clonado

Sobrevive a desconexões

Não

Sim

Abre PRs

Não

Sim, quando as permissões do repo permitem

Retorna artefatos

Não

Sim (URLs pré-assinadas por 15 minutos)

Use para

Iteração, CI em um checkout

Tarefas longas, execuções paralelas, output em PR

Use execuções locais para checagens rápidas. Use execuções em nuvem quando precisar de uma branch, PR ou artefato.

Outros exemplos

O consertador de bugs usou o fluxo principal do SDK: criar um agente, enviar uma tarefa, esperar um resultado e revisar o output. O cookbook do Cursor mostra as mesmas chamadas do SDK em exemplos maiores:

  • agent-kanban lista agentes em nuvem, agrupa por status ou repo e pré-visualiza artefatos.

  • coding-agent-cli envolve agentes locais e em nuvem em uma ferramenta de terminal.

  • app-builder roda um agente local a partir de uma UI de chat e pré-visualiza código React gerado.

Um detalhe para não confundir é o tratamento de artefatos. Artefatos só estão disponíveis em execuções na nuvem. Agentes locais servem para output de texto e checagens rápidas. Agentes em nuvem servem para tarefas que precisam de arquivos, branches ou PRs como saída.

MCP, skills, hooks e subagentes

O SDK pode ler a mesma configuração de agente de projeto que o Cursor usa no IDE. O consertador de bugs não precisa de tudo isso, mas estas peças importam quando o agente trabalha em um repo real.

Servidores MCP

Como mencionado antes, servidores MCP conectam agentes a ferramentas externas. Você pode passá-los inline em Agent.create() ou defini-los em .cursor/mcp.json. Se você passar mcpServers novamente em agent.send(), aquele run usa os servidores de send() em vez dos de Agent.create(). Use servidores MCP HTTP para ferramentas hospedadas. Use MCP stdio para ferramentas que rodam ao lado do agente.

Skills

Skills são arquivos markdown em .cursor/skills/ que dão instruções de projeto ao agente, como escolhas de framework de testes, convenções de API ou regras de release. Use-as para orientações que devem valer para todo run no repo.

Hooks

Hooks vivem em .cursor/hooks.json e rodam em pontos específicos do loop do agente. Usos comuns incluem formatar após edições de arquivo e bloquear comandos de shell destrutivos antes da execução. Para hooks de segurança, use comportamento fail closed para que um hook quebrado bloqueie a ação.

Subagentes

Subagentes são agentes nomeados que o agente principal pode chamar para trabalhos focados, como revisão de código ou escrita de testes. Defina-os em .cursor/agents/*.md ou inline em Agent.create({ agents: { ... } }). Agentes em nuvem carregam subagentes do projeto a partir do repo checado. Agentes locais precisam de local.settingSources: ["project"] se você quiser que leiam a configuração .cursor/ do projeto. Mantenha cada subagente enxuto.

Verificações de segurança

Antes de agentes tocarem um repo real, defina os limites primeiro. Esta é a parte que eu não pularia.

  • Restrinja permissões ao mínimo. Agentes podem ler arquivos, rodar comandos e usar quaisquer credenciais que você expuser. Dê acesso com escopo de repo, não credenciais amplas de serviços.

  • Mantenha segredos fora dos prompts. Prompts podem parar em transcrições. Use variáveis de ambiente para CURSOR_API_KEY e qualquer outro token, e lembre que valores de env em MCP via stdio chegam ao runtime onde o servidor executa.

  • Exija revisão humana. Se um agente em nuvem pode abrir PRs, a proteção de branch deve exigir um revisor humano antes do merge. Não combine autoCreatePR: true com auto-merge a menos que o repo seja de baixo risco.

  • Monitore custo e escolha de modelo. O uso do SDK consome do pool de uso por tokens do Cursor. Como citado, o Composer 2 é uma opção de modelo para tarefas de código; chame Cursor.models.list() se precisar ver quais ids de modelo sua conta pode usar.

  • Faça logs da execução. run.conversation() retorna uma visão estruturada dos turnos do agente. Armazene para execuções que você possa precisar debugar ou auditar depois.

Conclusão

Este artigo cobriu npm install @cursor/sdk, um quickstart local, um agente em nuvem que abre um pull request e os principais pontos de extensão para comportamento de agentes em repos.

Use o SDK quando o código precisar iniciar e gerenciar o agente. Se a tarefa for apenas uma conversa no editor, o app do Cursor costuma ser suficiente.

Para comparar, nossos guias sobre o Claude Agent SDK e o OpenAI Agents SDK cobrem APIs de agentes em outros ecossistemas.


Khalid Abdelaty's photo
Author
Khalid Abdelaty
LinkedIn

Sou engenheiro de dados e criador de comunidades que trabalha com pipelines de dados, nuvem e ferramentas de IA, além de escrever tutoriais práticos e de alto impacto para o DataCamp e desenvolvedores iniciantes.

FAQs

O Cursor SDK funciona com Python ou outra linguagem?

Oficialmente, não. O SDK é apenas para TypeScript no beta público; usuários de Python devem chamar diretamente a REST API de Cloud Agents.

Posso usar o SDK no plano gratuito Hobby?

Sim para agentes locais, dentro dos limites de taxa e tetos de uso do plano gratuito. Não para agentes em nuvem; esses exigem Pro ou superior.

Como cancelo uma execução que está demorando demais?

Chame run.cancel(). O status muda para cancelled, o stream ao vivo é abortado e run.wait() resolve com o resultado cancelado.

Onde entram os hooks se o SDK não tem um callback programático?

Hooks são política do repositório, não lógica por script. Coloque regras compartilhadas em .cursor/hooks.json e mantenha a lógica específica de execução em torno de agent.send() ou run.wait() no seu código TypeScript.

O SDK está pronto para produção?

Use primeiro para tarefas de baixo risco. A superfície do SDK ainda está em beta público. Fixe a versão de @cursor/sdk, restrinja segredos, exija revisão e espere mudanças de API antes da disponibilidade geral.

Tópicos
Inteligência Artificial

Aprenda com a DataCamp

Curso

Desenvolvimento de Software com o Cursor

1 h 30 min
4.2K
Crie código pronto para produção com o Cursor. Aprenda sobre prompts de IA, refatoração, testes e fluxos de trabalho avançados.
Ver detalhesRight Arrow
Iniciar Curso
Ver maisRight Arrow
Relacionado
cursor ai code editor

Tutorial

AI do cursor: Um guia com 10 exemplos práticos

Saiba como instalar o Cursor AI no Windows, macOS e Linux e descubra como usá-lo em 10 casos de uso diferentes.

Tutorial

Tutorial de GitHub e Git para iniciantes

Um tutorial para iniciantes mostrando como o controle de versão do Git funciona e por que ele é essencial em projetos de ciência de dados.
Abid Ali Awan's photo

Abid Ali Awan

9 min

Tutorial

Tutorial de push e pull do GIT

Saiba como realizar solicitações Git PUSH e PULL por meio do GitHub Desktop e da linha de comando.

Olivia Smith

13 min

Tutorial

Tutorial da API de assistentes da OpenAI

Uma visão geral abrangente da API Assistants com nosso artigo, que oferece uma análise aprofundada de seus recursos, usos no setor, orientação de configuração e práticas recomendadas para maximizar seu potencial em vários aplicativos de negócios.
Zoumana Keita 's photo

Zoumana Keita

14 min

Tutorial

Guia de torchchat do PyTorch: Configuração local com Python

Saiba como configurar o torchchat do PyTorch localmente com Python neste tutorial prático, que fornece orientação e exemplos passo a passo.

Tutorial

Criando agentes LangChain para automatizar tarefas em Python

Um tutorial abrangente sobre a criação de agentes LangChain com várias ferramentas para automatizar tarefas em Python usando LLMs e modelos de bate-papo usando OpenAI.
Ver MaisVer Mais