> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.getdial.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.getdial.ai/_mcp/server.

# Cursor

> Use Dial from Cursor by dropping the Dial skill into your Cursor config.

Drop the Dial skill into your Cursor config so the editor's agent learns how to drive the `dial` CLI on demand. Once installed, Cursor can send messages, place calls, and wait for events without you re-explaining the surface.

## Install

Pick one of two paths. **Option 1** drops the Dial CLI skill into your Cursor config so the agent drives the `dial` CLI. **Option 2** wires up Dial's [MCP server](/integrations/tools/mcp) so Cursor calls Dial's tools natively.

### Option 1 — CLI skill (Recommended)

First, get the `dial` CLI on your PATH:

```bash title="Shell install"
curl -fsSL https://getdial.ai/install | bash
```

```text title="Agent prompt"
Follow https://getdial.ai/skills.md to install and onboard the dial CLI.
```

Then drop the Cursor-specific Dial skill into your config:

```bash
dial auth verify-otp --code <code> --agent cursor
```

`auth verify-otp` verifies your code first, then copies the Dial skill into Cursor's standard config directory. Re-run the command anytime (after a CLI upgrade, for example) to overwrite the skill in place — the verification step is a no-op once you're signed in.

### Option 2 — MCP server

Cursor has no CLI command to add an MCP server — you declare it in Cursor's `mcp.json` config file ([Cursor MCP docs](https://cursor.com/docs/mcp)). Add Dial under the `mcpServers` key, using either the local stdio transport (`npx -y @getdial/cli mcp`, which reuses your saved CLI key) or the remote Streamable HTTP transport (OAuth in the browser):

```json title="Local config"
# ~/.cursor/mcp.json  (global)  ·  .cursor/mcp.json  (project)
{
  "mcpServers": {
    "dial": {
      "command": "npx",
      "args": ["-y", "@getdial/cli", "mcp"]
    }
  }
}
```

```json title="Remote config"
# ~/.cursor/mcp.json  (global)  ·  .cursor/mcp.json  (project)
{
  "mcpServers": {
    "dial": {
      "url": "https://getdial.ai/mcp"
    }
  }
}
```

See the [MCP page](/integrations/tools/mcp) for the full tool list and the remote OAuth flow.

## What gets installed

With Option 1, a single markdown skill describing the `dial` CLI — its commands, flags, and conventions, mirroring the [CLI reference](/documentation/cli/commands). Cursor loads the skill when a Dial-related task comes up; nothing else is touched. With Option 2, nothing lands in your config beyond the `mcpServers` entry — Cursor discovers Dial's tools from the server itself.

## Use it

Both paths work the same way in use — just ask in plain language:

> Send an SMS to +14155550123 with the body "running late, ETA 10 min".

Cursor figures out the right action and runs it. With the MCP server it calls Dial's tools directly (no CLI shell-out); with the skill it drives the `dial` CLI. See [Using Dial from an agent](/documentation/get-started/using-dial-from-an-agent) for more examples.

## Inbound event handling (Suggestion)

You can also wake Cursor automatically when a Dial event arrives by wiring a [CLI command target](/integrations/methods/cli-command-target): for each inbound event, the listen daemon spawns a handler that delivers a fresh prompt to Cursor's headless agent.

First install the listen daemon:

```bash
dial listen install
```

### 1. Write a handler

```bash
#!/usr/bin/env bash
# /usr/local/bin/handle-dial-event-cursor
event="$1"

type=$(jq -r '.type'        <<<"$event")
from=$(jq -r '.from // ""'  <<<"$event")
body=$(jq -r '.body // ""'  <<<"$event")

prompt=$(cat <<EOF
A Dial event just arrived. Decide what to do and act on it.

  type: $type
  from: $from
  body: $body

raw event JSON:
$event
EOF
)

# Detach a fresh Cursor agent run and return right away.
nohup cursor-agent -p "$prompt" </dev/null >>~/.dial/cursor.log 2>&1 &
disown
exit 0
```

`-p` (alias `--print`) is Cursor's headless / non-interactive mode. Add `-m <model>` to pick a model.

### 2. Register

```bash
chmod +x /usr/local/bin/handle-dial-event-cursor
dial local-target add cmd /usr/local/bin/handle-dial-event-cursor
```

The `nohup … & disown` pattern keeps Cursor running after the handler exits, so a multi-minute agent run never collides with the daemon's per-attempt `--timeout`. See [CLI command target](/integrations/methods/cli-command-target) for the full reference, delivery semantics, and the once-retry behavior.