JavaScript / TypeScript Quickstart#

No Python required. All desktop automation runs natively in Node.js.

Install#

npm install @vitalops/opendesk-sdk

Register with Claude Code:

npx opendesk-js install
npx opendesk-js uninstall   # to remove

Try it via Claude#

Once registered, open Claude Code and ask:

“Take a screenshot and describe what’s on my screen”

“Open Safari and go to google.com

“Click the first button you see”

“Show me the audit log”

“Replay everything you just did”

Claude calls the tools automatically — no code needed.


SDK examples#

1. Take a screenshot#

import { OpenDeskClient } from "@vitalops/opendesk-sdk";

const client = new OpenDeskClient();
const result = await client.screenshot({ marks: true });
console.log(result.output);

2. Click a button by name#

await client.ui({ action: "click", app: "TextEdit", title: "File" });

3. Type text#

await client.keyboard({ action: "type", text: "Hello from JS" });
await client.keyboard({ action: "press", key: "enter" });

4. Full agentic loop (Vercel AI SDK)#

import { OpenDeskClient } from "@vitalops/opendesk-sdk";
import { generateText } from "ai";
import { anthropic } from "@ai-sdk/anthropic";

const client = new OpenDeskClient();
const shot = await client.screenshot({ marks: true });

const { text } = await generateText({
  model: anthropic("claude-opus-4-6"),
  messages: [
    {
      role: "user",
      content: [
        { type: "text", text: "Click the most prominent button on screen." },
        { type: "image", image: shot.attachments[0].content },
      ],
    },
  ],
});

5. Native MCP server (Node.js)#

import { createMcpServer } from "@vitalops/opendesk-sdk";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = createMcpServer();
await server.connect(new StdioServerTransport());

6. Custom session or permission handler#

const client = new OpenDeskClient({
  sessionId: "my-session",
  permissionHandler: async (tool, action, description) => {
    console.log(`Allow: ${description}`);
  },
});

Next steps#