# McpConnect

> Install guide for an MCP server with per-client tabs for Claude Code, Claude Desktop, Cursor, VS Code and generic JSON, copyable snippets with a masked token, one-click deep links and a connection test.

Source: https://docs.nasaqui.com/components/mcp-connect

## Install

```bash
npx shadcn@latest add https://docs.nasaqui.com/r/mcp-connect.json
```

Tell people how to connect their AI tool to your MCP server. One tab per client with the exact command or
JSON, a copy button, a one-click install link where the client has one, the server URL and token, and a
button that tests the connection.

## When to use

- Next to the API keys of a product that ships an MCP server.
- Docs or onboarding pages that need copy-ready client config.

## When not to use

- A general code sample: use [`CodeBlock`](https://docs.nasaqui.com/components/code-block).
- Managing the keys themselves: [`ApiKeys`](https://docs.nasaqui.com/components/api-keys).

## Import

```tsx
import { McpConnect } from "@fadymondy/nasaq/web";
// inside this monorepo: "@nasaq/web"
```

## Quick start

```tsx
import { McpConnect } from "@fadymondy/nasaq/web";

declare const token: string;

export function Connect() {
  return <McpConnect serverUrl="https://mcp.example.com/mcp" serverName="example" token={token} onTest={async () => ({ ok: true, tools: 12 })} />;
}
```

## Anatomy

```
McpConnect                      data-slot="mcp-connect" (Card)
├─ server URL                   CopyField (dir="ltr")
├─ token                        masked field: show/hide, copy
├─ Tabs                         one per client
│  ├─ numbered steps
│  ├─ snippet                   CodeBlock with target (file or Terminal) and copy
│  └─ deep link                 "Add to Cursor" / "Install in VS Code"
└─ Test connection              Alert: success (latency, tools) or failure
```

## API

**McpConnect**: every `div` prop except `children`, plus:

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `serverUrl` | `string` | required | Streamable HTTP endpoint. |
| `serverName` | `string` | `"nasaq"` | Key the server gets in each config. |
| `token` | `string` | | Put in the snippets. Shown masked; copying gives the real one. Omit for a `YOUR_TOKEN` placeholder. |
| `tokenHeader` | `string` | `"Authorization"` | Sent as `Bearer <token>`. Any other header carries the bare token. |
| `clients` | `McpClientId[]` | all five | `claude-code`, `claude-desktop`, `cursor`, `vscode`, `generic`. |
| `defaultClient` | `McpClientId` | first | Tab open first. |
| `onTest` | `() => Promise<{ ok, latencyMs?, tools?, error? }>` | | Shows Test connection. A rejection shows a generic failure. |
| `labels` | `Partial<McpConnectLabels>` | | Override any string. |

**Helpers** (pure, tested): `mcpSnippet(client, server, tokenOverride?)` returns `{ target, language, code, deepLink? }`;
`maskToken(token)`.

## Examples

**Only two clients**

```tsx
import { McpConnect } from "@fadymondy/nasaq/web";

export const Two = () => <McpConnect serverUrl="https://mcp.example.com/mcp" clients={["claude-code", "cursor"]} />;
```

**Build a snippet yourself**

```tsx
import { mcpSnippet } from "@fadymondy/nasaq/web";

export const cmd = mcpSnippet("claude-code", { name: "example", url: "https://mcp.example.com/mcp", token: "abc" }).code;
```

## Accessibility

- Tabs are Base UI `Tabs`: arrow keys move, the panel is labelled by its tab.
- The token field has a label and the show/hide button has a state-aware name. Test results are announced (`role="status"` or `alert`).

## RTL & i18n

- English and Arabic strings follow the Nasaq locale. URLs, commands, JSON and tokens are `dir="ltr"`.

## Styling & tokens

- Built on `Card`, `Tabs`, `CodeBlock`, `CopyField`, `Alert` and `--nq-*` tokens.
- Target `[data-slot="mcp-connect"]`.

## Do / Don't

- Do give a scoped, expiring token, not a master key.
- Do keep the token masked on screen; the copy button gives the real one.
- Don't put the token in a deep link you log or share.
- Client config formats change: check them against each client's docs when you upgrade.

## Related

- [`ApiKeys`](https://docs.nasaqui.com/components/api-keys)
- [`CodeBlock`](https://docs.nasaqui.com/components/code-block)
- [`Tabs`](https://docs.nasaqui.com/components/tabs)

## Lab

https://docs.nasaqui.com/?path=/docs/components-integrations-mcp-connect--docs

## Code

### React

```tsx
import { McpConnect } from "@fadymondy/nasaq/web";

declare const token: string;

export function Connect() {
  return <McpConnect serverUrl="https://mcp.example.com/mcp" serverName="example" token={token} onTest={async () => ({ ok: true, tools: 12 })} />;
}
```

### shadcn

```tsx
import { McpConnect } from "@/components/ui/mcp-connect";

declare const token: string;

export function Connect() {
  return <McpConnect serverUrl="https://mcp.example.com/mcp" serverName="example" token={token} onTest={async () => ({ ok: true, tools: 12 })} />;
}
```

### Vue

```vue
<script setup lang="ts">
import { NqMcpConnect } from "@fadymondy/nasaq/vue";

const token = "nsq_live_a1b2c3d4e5f6g7h8i9j0";
const onTest = async () => ({ ok: true, tools: 12 });
</script>

<template>
  <NqMcpConnect server-url="https://mcp.example.com/mcp" server-name="example" :token="token" :on-test="onTest" />
</template>
```

### Blade

```blade
<x-nq::mcp-connect server-url="https://mcp.example.com/mcp" server-name="example" token="nsq_live_a1b2c3d4e5f6g7h8i9j0" testable
    x-on:test="$event.detail.wait(Promise.resolve({ ok: true, tools: 12 }))" />
```

### HTML + Alpine

```html
<div data-slot="mcp-connect" x-data="nqMcpConnect(JSON.parse('{\u0022token\u0022:\u0022nsq_live_a1b2c3d4e5f6g7h8i9j0\u0022,\u0022masked\u0022:\u0022nsq_li\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022i9j0\u0022,\u0022labels\u0022:{\u0022showToken\u0022:\u0022Show token\u0022,\u0022hideToken\u0022:\u0022Hide token\u0022,\u0022test\u0022:\u0022Test connection\u0022,\u0022testing\u0022:\u0022Testing\\u2026\u0022,\u0022answered\u0022:\u0022The server answered ({parts}).\u0022,\u0022answeredBare\u0022:\u0022The server answered.\u0022,\u0022tool1\u0022:\u00221 tool\u0022,\u0022tools\u0022:\u0022{n} tools\u0022,\u0022sep\u0022:\u0022, \u0022,\u0022failedFallback\u0022:\u0022The server did not answer. Check the URL and the token.\u0022},\u0022snippets\u0022:[{\u0022real\u0022:\u0022claude mcp add --transport http example https:\\\/\\\/mcp.example.com\\\/mcp --header \\u0022Authorization: Bearer nsq_live_a1b2c3d4e5f6g7h8i9j0\\u0022\u0022,\u0022masked\u0022:\u0022claude mcp add --transport http example https:\\\/\\\/mcp.example.com\\\/mcp --header \\u0022Authorization: Bearer nsq_li\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022i9j0\\u0022\u0022},{\u0022real\u0022:\u0022{\\n  \\u0022mcpServers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022command\\u0022: \\u0022npx\\u0022,\\n      \\u0022args\\u0022: [\\n        \\u0022-y\\u0022,\\n        \\u0022mcp-remote\\u0022,\\n        \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n        \\u0022--header\\u0022,\\n        \\u0022Authorization: Bearer nsq_live_a1b2c3d4e5f6g7h8i9j0\\u0022\\n      ]\\n    }\\n  }\\n}\u0022,\u0022masked\u0022:\u0022{\\n  \\u0022mcpServers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022command\\u0022: \\u0022npx\\u0022,\\n      \\u0022args\\u0022: [\\n        \\u0022-y\\u0022,\\n        \\u0022mcp-remote\\u0022,\\n        \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n        \\u0022--header\\u0022,\\n        \\u0022Authorization: Bearer nsq_li\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022i9j0\\u0022\\n      ]\\n    }\\n  }\\n}\u0022},{\u0022real\u0022:\u0022{\\n  \\u0022mcpServers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022url\\u0022: \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n      \\u0022headers\\u0022: {\\n        \\u0022Authorization\\u0022: \\u0022Bearer nsq_live_a1b2c3d4e5f6g7h8i9j0\\u0022\\n      }\\n    }\\n  }\\n}\u0022,\u0022masked\u0022:\u0022{\\n  \\u0022mcpServers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022url\\u0022: \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n      \\u0022headers\\u0022: {\\n        \\u0022Authorization\\u0022: \\u0022Bearer nsq_li\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022i9j0\\u0022\\n      }\\n    }\\n  }\\n}\u0022},{\u0022real\u0022:\u0022{\\n  \\u0022servers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022type\\u0022: \\u0022http\\u0022,\\n      \\u0022url\\u0022: \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n      \\u0022headers\\u0022: {\\n        \\u0022Authorization\\u0022: \\u0022Bearer nsq_live_a1b2c3d4e5f6g7h8i9j0\\u0022\\n      }\\n    }\\n  }\\n}\u0022,\u0022masked\u0022:\u0022{\\n  \\u0022servers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022type\\u0022: \\u0022http\\u0022,\\n      \\u0022url\\u0022: \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n      \\u0022headers\\u0022: {\\n        \\u0022Authorization\\u0022: \\u0022Bearer nsq_li\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022i9j0\\u0022\\n      }\\n    }\\n  }\\n}\u0022},{\u0022real\u0022:\u0022{\\n  \\u0022mcpServers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022type\\u0022: \\u0022http\\u0022,\\n      \\u0022url\\u0022: \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n      \\u0022headers\\u0022: {\\n        \\u0022Authorization\\u0022: \\u0022Bearer nsq_live_a1b2c3d4e5f6g7h8i9j0\\u0022\\n      }\\n    }\\n  }\\n}\u0022,\u0022masked\u0022:\u0022{\\n  \\u0022mcpServers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022type\\u0022: \\u0022http\\u0022,\\n      \\u0022url\\u0022: \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n      \\u0022headers\\u0022: {\\n        \\u0022Authorization\\u0022: \\u0022Bearer nsq_li\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022i9j0\\u0022\\n      }\\n    }\\n  }\\n}\u0022}]}'))" x-on:test="$event.detail.wait(Promise.resolve({ ok: true, tools: 12 }))" class="flex flex-col gap-4 rounded-card border border-border bg-card py-4 text-card-foreground w-full max-w-3xl">
    <div data-slot="card-header" class="grid auto-rows-min items-start gap-1 px-4 has-data-[slot=card-action]:grid-cols-[1fr_auto]"><h2 data-slot="card-title" class="text-label text-foreground">Connect an MCP client</h2>
        <div data-slot="card-description" class="text-body-sm text-muted-foreground">Let an AI assistant use this workspace through the Model Context Protocol.</div></div>
    <div data-slot="card-content" class="px-4 flex flex-col gap-5"><div class="grid gap-4 sm:grid-cols-2">
            <div data-slot="field" x-data="nqField(false)" x-modelable="invalid" x-id="['nq-field']"
         data-valid     class="flex flex-col gap-1.5">
    <label data-slot="field-label"  class="text-label text-foreground data-disabled:opacity-50">Server URL</label>
                <div data-slot="copy-field" class="contents">
    <div role="group" data-slot="input-group"
    class="group/input-group flex h-control min-h-[var(--nq-touch-min,0px)] w-full min-w-0 items-center overflow-hidden rounded-control border border-input bg-card text-body text-foreground transition-colors duration-150 ease-nq focus-within:border-nq-focus focus-within:outline-1 focus-within:outline-nq-focus has-[[data-invalid]]:border-nq-danger has-[[aria-invalid=true]]:border-nq-danger has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50"><input data-slot="input-group-input"  dir="ltr"     readonly="readonly" value="https://mcp.example.com/mcp" aria-label="Server URL" x-on:focus="$el.select()" class="h-full min-w-0 flex-1 border-0 bg-transparent px-3 text-body text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed pointer-coarse:text-[16px] text-start" />
        <div data-slot="input-group-addon" data-align="end"
    class="flex h-full shrink-0 items-center gap-1.5 text-body-sm text-muted-foreground [&_svg]:size-4 order-last ps-1 pe-3"><span class="contents" x-data="nqCopyButton('https:\/\/mcp.example.com\/mcp', 1500)">
    <button data-slot="copy-button"
     type="button"                         aria-label="Copy" x-on:click="copy()" x-bind:data-copied="state === &#039;copied&#039; ? &#039;&#039; : null" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0 data-copied:text-nq-success-text">
        <svg aria-hidden="true" x-show="state !== 'copied'" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
  <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
</svg>        <svg aria-hidden="true" x-show="state === 'copied'" style="display: none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></button>
    <span data-slot="copy-button-status" role="status" aria-live="polite" class="sr-only"
        data-copied-label="Copied to clipboard" data-failed-label="Could not copy"
        x-text="state === 'copied' ? $el.dataset.copiedLabel : state === 'failed' ? $el.dataset.failedLabel : ''"></span>
</span></div></div>
</div>
</div>
                            <div data-slot="field" x-data="nqField(false)" x-modelable="invalid" x-id="['nq-field']"
         data-valid     class="flex flex-col gap-1.5">
    <label data-slot="field-label"  class="text-label text-foreground data-disabled:opacity-50">Access token</label>
                    <div data-slot="mcp-token" class="contents">
                    <div role="group" data-slot="input-group"
    class="group/input-group flex h-control min-h-[var(--nq-touch-min,0px)] w-full min-w-0 items-center overflow-hidden rounded-control border border-input bg-card text-body text-foreground transition-colors duration-150 ease-nq focus-within:border-nq-focus focus-within:outline-1 focus-within:outline-nq-focus has-[[data-invalid]]:border-nq-danger has-[[aria-invalid=true]]:border-nq-danger has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50"><input data-slot="input-group-input"  dir="ltr"     readonly="readonly" aria-label="Access token" x-bind:value="shownToken" x-on:focus="$el.select()" class="h-full min-w-0 flex-1 border-0 bg-transparent px-3 text-body text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed pointer-coarse:text-[16px] text-start" />
                        <div data-slot="input-group-addon" data-align="end"
    class="flex h-full shrink-0 items-center gap-1.5 text-body-sm text-muted-foreground [&_svg]:size-4 order-last ps-1 pe-3"><button data-slot="button"
     type="button"                         x-bind:aria-label="toggleLabel" x-bind:aria-pressed="String(reveal)" x-on:click="reveal = ! reveal" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0">
        <svg aria-hidden="true" x-show="reveal" style="display: none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49"/>
  <path d="M14.084 14.158a3 3 0 0 1-4.242-4.242"/>
  <path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143"/>
  <path d="m2 2 20 20"/>
</svg>                                <svg aria-hidden="true" x-show="! reveal" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"/>
  <circle cx="12" cy="12" r="3"/>
</svg></button>
                            <span class="contents" x-data="nqCopyButton('nsq_live_a1b2c3d4e5f6g7h8i9j0', 1500)">
    <button data-slot="copy-button"
     type="button"                         aria-label="Copy token" x-on:click="copy()" x-bind:data-copied="state === &#039;copied&#039; ? &#039;&#039; : null" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0 data-copied:text-nq-success-text">
        <svg aria-hidden="true" x-show="state !== 'copied'" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
  <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
</svg>        <svg aria-hidden="true" x-show="state === 'copied'" style="display: none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></button>
    <span data-slot="copy-button-status" role="status" aria-live="polite" class="sr-only"
        data-copied-label="Copied to clipboard" data-failed-label="Could not copy"
        x-text="state === 'copied' ? $el.dataset.copiedLabel : state === 'failed' ? $el.dataset.failedLabel : ''"></span>
</span></div></div>
                    </div>
</div>
                    </div>
                    <p class="text-caption text-muted-foreground">The token is shown here so you can paste it. Treat it like a password.</p>
                    <div data-slot="tabs" data-orientation="horizontal" x-data="nqTabs('claude-code')" x-modelable="value" x-id="['nq-tabs']" class="flex flex-col gap-4">
    <div data-slot="tabs-list" data-variant="segmented" aria-orientation="horizontal" x-bind="list"
    aria-label="Client" class="relative z-0 flex max-w-full overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden w-fit gap-0.5 rounded-control bg-secondary p-0.5">
    <button type="button" data-slot="tabs-tab" x-bind="tab('claude-code')"
     data-active aria-selected="true"         class="inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-label text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:text-foreground data-active:text-foreground [&_svg]:size-4 [&_svg]:shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:pointer-events-none data-disabled:opacity-50 h-7 rounded-[calc(var(--radius-control)-2px)] px-3">Claude Code</button>
                                            <button type="button" data-slot="tabs-tab" x-bind="tab('claude-desktop')"
            class="inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-label text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:text-foreground data-active:text-foreground [&_svg]:size-4 [&_svg]:shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:pointer-events-none data-disabled:opacity-50 h-7 rounded-[calc(var(--radius-control)-2px)] px-3">Claude Desktop</button>
                                            <button type="button" data-slot="tabs-tab" x-bind="tab('cursor')"
            class="inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-label text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:text-foreground data-active:text-foreground [&_svg]:size-4 [&_svg]:shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:pointer-events-none data-disabled:opacity-50 h-7 rounded-[calc(var(--radius-control)-2px)] px-3">Cursor</button>
                                            <button type="button" data-slot="tabs-tab" x-bind="tab('vscode')"
            class="inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-label text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:text-foreground data-active:text-foreground [&_svg]:size-4 [&_svg]:shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:pointer-events-none data-disabled:opacity-50 h-7 rounded-[calc(var(--radius-control)-2px)] px-3">VS Code</button>
                                            <button type="button" data-slot="tabs-tab" x-bind="tab('generic')"
            class="inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-label text-muted-foreground outline-none transition-colors duration-150 ease-nq hover:text-foreground data-active:text-foreground [&_svg]:size-4 [&_svg]:shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:pointer-events-none data-disabled:opacity-50 h-7 rounded-[calc(var(--radius-control)-2px)] px-3">Other (JSON)</button>
                                        <span data-slot="tabs-indicator" aria-hidden="true"
    class="absolute -z-10 transition-[left,width] duration-200 ease-nq left-[var(--active-tab-left)] w-[var(--active-tab-width)] top-[var(--active-tab-top)] h-[var(--active-tab-height)] rounded-[calc(var(--radius-control)-2px)] bg-background shadow-xs"></span>
</div>
                                                        <div data-slot="tabs-panel" x-bind="panel('claude-code')"
        class="outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus flex flex-col gap-4"><ol class="flex flex-col gap-1.5 text-body-sm text-foreground">
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">1</span>
                                    <span class="sr-only">Step 1: </span>
                                    <span class="min-w-0">Open a terminal in your project.</span>
                                </li>
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">2</span>
                                    <span class="sr-only">Step 2: </span>
                                    <span class="min-w-0">Run the command.</span>
                                </li>
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">3</span>
                                    <span class="sr-only">Step 3: </span>
                                    <span class="min-w-0">Type /mcp in Claude Code to check it is connected.</span>
                                </li>
                                                    </ol>
                        <div class="flex flex-col gap-3">
                            <div data-slot="mcp-snippet" class="overflow-hidden rounded-surface border border-border" dir="ltr">
                                <div class="flex h-row items-center justify-between gap-2 border-b border-border bg-nq-surface-soft ps-3 pe-1.5 font-mono text-caption text-muted-foreground">
                                    <span class="truncate">Terminal</span>
                                    <span class="contents" x-data="nqCopyButton('claude mcp add --transport http example https:\/\/mcp.example.com\/mcp --header \u0022Authorization: Bearer nsq_live_a1b2c3d4e5f6g7h8i9j0\u0022', 1500)">
    <button data-slot="copy-button"
     type="button"                         aria-label="Copy Terminal" x-on:click="copy()" x-bind:data-copied="state === &#039;copied&#039; ? &#039;&#039; : null" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0 data-copied:text-nq-success-text">
        <svg aria-hidden="true" x-show="state !== 'copied'" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
  <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
</svg>        <svg aria-hidden="true" x-show="state === 'copied'" style="display: none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></button>
    <span data-slot="copy-button-status" role="status" aria-live="polite" class="sr-only"
        data-copied-label="Copied to clipboard" data-failed-label="Could not copy"
        x-text="state === 'copied' ? $el.dataset.copiedLabel : state === 'failed' ? $el.dataset.failedLabel : ''"></span>
</span>
                                </div>
                                <figure data-slot="code-block" data-language="bash" dir="ltr" x-data="nqCodeBlock(JSON.parse('{\u0022code\u0022:\u0022claude mcp add --transport http example https:\\\/\\\/mcp.example.com\\\/mcp --header \\u0022Authorization: Bearer nsq_li\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022i9j0\\u0022\u0022,\u0022language\u0022:\u0022bash\u0022,\u0022marked\u0022:[],\u0022lineNumbers\u0022:false}'))" x-bind:data-highlighted="highlighted ? '' : null" x-effect="setCode(shownSnippet(0))"
    class="group/code relative m-0 overflow-hidden border-border bg-nq-surface-soft text-start [--shiki-foreground:var(--nq-fg)] [--shiki-background:transparent] [--shiki-token-comment:var(--nq-fg-muted)] [--shiki-token-keyword:var(--nq-accent-text)] [--shiki-token-string:var(--nq-success-text)] [--shiki-token-string-expression:var(--nq-success-text)] [--shiki-token-constant:var(--nq-warning-text)] [--shiki-token-function:var(--nq-info-text)] [--shiki-token-parameter:var(--nq-fg-body)] [--shiki-token-punctuation:var(--nq-fg-muted)] [--shiki-token-link:var(--nq-info-text)] rounded-none border-0">
        <pre data-slot="code-block-pre" role="region" tabindex="0" aria-label="Terminal"
        class="m-0 overflow-auto bg-transparent py-3 font-mono text-code text-[var(--shiki-foreground)] outline-none focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-nq-focus "><code class="block w-max min-w-full"><span data-line="1"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>claude mcp add --transport http example https://mcp.example.com/mcp --header &quot;Authorization: Bearer nsq_li••••••••••••i9j0&quot;</span></span></code></pre>
</figure>
                            </div>
                                                    </div></div>
                                                        <div data-slot="tabs-panel" x-bind="panel('claude-desktop')"
     hidden     class="outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus flex flex-col gap-4"><ol class="flex flex-col gap-1.5 text-body-sm text-foreground">
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">1</span>
                                    <span class="sr-only">Step 1: </span>
                                    <span class="min-w-0">Open Settings, then Developer, then Edit Config.</span>
                                </li>
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">2</span>
                                    <span class="sr-only">Step 2: </span>
                                    <span class="min-w-0">Add this to claude_desktop_config.json. It needs Node.js for npx.</span>
                                </li>
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">3</span>
                                    <span class="sr-only">Step 3: </span>
                                    <span class="min-w-0">Restart Claude Desktop.</span>
                                </li>
                                                    </ol>
                        <div class="flex flex-col gap-3">
                            <div data-slot="mcp-snippet" class="overflow-hidden rounded-surface border border-border" dir="ltr">
                                <div class="flex h-row items-center justify-between gap-2 border-b border-border bg-nq-surface-soft ps-3 pe-1.5 font-mono text-caption text-muted-foreground">
                                    <span class="truncate">claude_desktop_config.json</span>
                                    <span class="contents" x-data="nqCopyButton('{\n  \u0022mcpServers\u0022: {\n    \u0022example\u0022: {\n      \u0022command\u0022: \u0022npx\u0022,\n      \u0022args\u0022: [\n        \u0022-y\u0022,\n        \u0022mcp-remote\u0022,\n        \u0022https:\/\/mcp.example.com\/mcp\u0022,\n        \u0022--header\u0022,\n        \u0022Authorization: Bearer nsq_live_a1b2c3d4e5f6g7h8i9j0\u0022\n      ]\n    }\n  }\n}', 1500)">
    <button data-slot="copy-button"
     type="button"                         aria-label="Copy claude_desktop_config.json" x-on:click="copy()" x-bind:data-copied="state === &#039;copied&#039; ? &#039;&#039; : null" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0 data-copied:text-nq-success-text">
        <svg aria-hidden="true" x-show="state !== 'copied'" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
  <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
</svg>        <svg aria-hidden="true" x-show="state === 'copied'" style="display: none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></button>
    <span data-slot="copy-button-status" role="status" aria-live="polite" class="sr-only"
        data-copied-label="Copied to clipboard" data-failed-label="Could not copy"
        x-text="state === 'copied' ? $el.dataset.copiedLabel : state === 'failed' ? $el.dataset.failedLabel : ''"></span>
</span>
                                </div>
                                <figure data-slot="code-block" data-language="json" dir="ltr" x-data="nqCodeBlock(JSON.parse('{\u0022code\u0022:\u0022{\\n  \\u0022mcpServers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022command\\u0022: \\u0022npx\\u0022,\\n      \\u0022args\\u0022: [\\n        \\u0022-y\\u0022,\\n        \\u0022mcp-remote\\u0022,\\n        \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n        \\u0022--header\\u0022,\\n        \\u0022Authorization: Bearer nsq_li\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022i9j0\\u0022\\n      ]\\n    }\\n  }\\n}\u0022,\u0022language\u0022:\u0022json\u0022,\u0022marked\u0022:[],\u0022lineNumbers\u0022:false}'))" x-bind:data-highlighted="highlighted ? '' : null" x-effect="setCode(shownSnippet(1))"
    class="group/code relative m-0 overflow-hidden border-border bg-nq-surface-soft text-start [--shiki-foreground:var(--nq-fg)] [--shiki-background:transparent] [--shiki-token-comment:var(--nq-fg-muted)] [--shiki-token-keyword:var(--nq-accent-text)] [--shiki-token-string:var(--nq-success-text)] [--shiki-token-string-expression:var(--nq-success-text)] [--shiki-token-constant:var(--nq-warning-text)] [--shiki-token-function:var(--nq-info-text)] [--shiki-token-parameter:var(--nq-fg-body)] [--shiki-token-punctuation:var(--nq-fg-muted)] [--shiki-token-link:var(--nq-info-text)] rounded-none border-0">
        <pre data-slot="code-block-pre" role="region" tabindex="0" aria-label="claude_desktop_config.json"
        class="m-0 overflow-auto bg-transparent py-3 font-mono text-code text-[var(--shiki-foreground)] outline-none focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-nq-focus "><code class="block w-max min-w-full"><span data-line="1"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>{</span></span><span data-line="2"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>  &quot;mcpServers&quot;: {</span></span><span data-line="3"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>    &quot;example&quot;: {</span></span><span data-line="4"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      &quot;command&quot;: &quot;npx&quot;,</span></span><span data-line="5"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      &quot;args&quot;: [</span></span><span data-line="6"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>        &quot;-y&quot;,</span></span><span data-line="7"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>        &quot;mcp-remote&quot;,</span></span><span data-line="8"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>        &quot;https://mcp.example.com/mcp&quot;,</span></span><span data-line="9"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>        &quot;--header&quot;,</span></span><span data-line="10"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>        &quot;Authorization: Bearer nsq_li••••••••••••i9j0&quot;</span></span><span data-line="11"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      ]</span></span><span data-line="12"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>    }</span></span><span data-line="13"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>  }</span></span><span data-line="14"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>}</span></span></code></pre>
</figure>
                            </div>
                                                    </div></div>
                                                        <div data-slot="tabs-panel" x-bind="panel('cursor')"
     hidden     class="outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus flex flex-col gap-4"><ol class="flex flex-col gap-1.5 text-body-sm text-foreground">
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">1</span>
                                    <span class="sr-only">Step 1: </span>
                                    <span class="min-w-0">Use the button, or add this to ~/.cursor/mcp.json.</span>
                                </li>
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">2</span>
                                    <span class="sr-only">Step 2: </span>
                                    <span class="min-w-0">Open Cursor Settings, then MCP, and turn the server on.</span>
                                </li>
                                                    </ol>
                        <div class="flex flex-col gap-3">
                            <div data-slot="mcp-snippet" class="overflow-hidden rounded-surface border border-border" dir="ltr">
                                <div class="flex h-row items-center justify-between gap-2 border-b border-border bg-nq-surface-soft ps-3 pe-1.5 font-mono text-caption text-muted-foreground">
                                    <span class="truncate">~/.cursor/mcp.json</span>
                                    <span class="contents" x-data="nqCopyButton('{\n  \u0022mcpServers\u0022: {\n    \u0022example\u0022: {\n      \u0022url\u0022: \u0022https:\/\/mcp.example.com\/mcp\u0022,\n      \u0022headers\u0022: {\n        \u0022Authorization\u0022: \u0022Bearer nsq_live_a1b2c3d4e5f6g7h8i9j0\u0022\n      }\n    }\n  }\n}', 1500)">
    <button data-slot="copy-button"
     type="button"                         aria-label="Copy ~/.cursor/mcp.json" x-on:click="copy()" x-bind:data-copied="state === &#039;copied&#039; ? &#039;&#039; : null" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0 data-copied:text-nq-success-text">
        <svg aria-hidden="true" x-show="state !== 'copied'" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
  <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
</svg>        <svg aria-hidden="true" x-show="state === 'copied'" style="display: none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></button>
    <span data-slot="copy-button-status" role="status" aria-live="polite" class="sr-only"
        data-copied-label="Copied to clipboard" data-failed-label="Could not copy"
        x-text="state === 'copied' ? $el.dataset.copiedLabel : state === 'failed' ? $el.dataset.failedLabel : ''"></span>
</span>
                                </div>
                                <figure data-slot="code-block" data-language="json" dir="ltr" x-data="nqCodeBlock(JSON.parse('{\u0022code\u0022:\u0022{\\n  \\u0022mcpServers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022url\\u0022: \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n      \\u0022headers\\u0022: {\\n        \\u0022Authorization\\u0022: \\u0022Bearer nsq_li\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022i9j0\\u0022\\n      }\\n    }\\n  }\\n}\u0022,\u0022language\u0022:\u0022json\u0022,\u0022marked\u0022:[],\u0022lineNumbers\u0022:false}'))" x-bind:data-highlighted="highlighted ? '' : null" x-effect="setCode(shownSnippet(2))"
    class="group/code relative m-0 overflow-hidden border-border bg-nq-surface-soft text-start [--shiki-foreground:var(--nq-fg)] [--shiki-background:transparent] [--shiki-token-comment:var(--nq-fg-muted)] [--shiki-token-keyword:var(--nq-accent-text)] [--shiki-token-string:var(--nq-success-text)] [--shiki-token-string-expression:var(--nq-success-text)] [--shiki-token-constant:var(--nq-warning-text)] [--shiki-token-function:var(--nq-info-text)] [--shiki-token-parameter:var(--nq-fg-body)] [--shiki-token-punctuation:var(--nq-fg-muted)] [--shiki-token-link:var(--nq-info-text)] rounded-none border-0">
        <pre data-slot="code-block-pre" role="region" tabindex="0" aria-label="~/.cursor/mcp.json"
        class="m-0 overflow-auto bg-transparent py-3 font-mono text-code text-[var(--shiki-foreground)] outline-none focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-nq-focus "><code class="block w-max min-w-full"><span data-line="1"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>{</span></span><span data-line="2"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>  &quot;mcpServers&quot;: {</span></span><span data-line="3"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>    &quot;example&quot;: {</span></span><span data-line="4"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      &quot;url&quot;: &quot;https://mcp.example.com/mcp&quot;,</span></span><span data-line="5"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      &quot;headers&quot;: {</span></span><span data-line="6"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>        &quot;Authorization&quot;: &quot;Bearer nsq_li••••••••••••i9j0&quot;</span></span><span data-line="7"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      }</span></span><span data-line="8"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>    }</span></span><span data-line="9"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>  }</span></span><span data-line="10"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>}</span></span></code></pre>
</figure>
                            </div>
                                                            <div>
                                    <a data-slot="mcp-deep-link"
     href="cursor://anysphere.cursor-deeplink/mcp/install?name=example&amp;config=eyJ1cmwiOiJodHRwczovL21jcC5leGFtcGxlLmNvbS9tY3AiLCJoZWFkZXJzIjp7IkF1dGhvcml6YXRpb24iOiJCZWFyZXIgbnNxX2xpdmVfYTFiMmMzZDRlNWY2ZzdoOGk5ajAifX0%3D"                         class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border-border bg-card text-foreground hover:bg-nq-hover h-control-sm px-2.5">
        <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M15 3h6v6"/>
  <path d="M10 14 21 3"/>
  <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>
</svg>                                        Add to Cursor</a>
                                </div>
                                                    </div></div>
                                                        <div data-slot="tabs-panel" x-bind="panel('vscode')"
     hidden     class="outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus flex flex-col gap-4"><ol class="flex flex-col gap-1.5 text-body-sm text-foreground">
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">1</span>
                                    <span class="sr-only">Step 1: </span>
                                    <span class="min-w-0">Use the button, or add this to .vscode/mcp.json.</span>
                                </li>
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">2</span>
                                    <span class="sr-only">Step 2: </span>
                                    <span class="min-w-0">Open Copilot Chat in Agent mode and start the server from the tools list.</span>
                                </li>
                                                    </ol>
                        <div class="flex flex-col gap-3">
                            <div data-slot="mcp-snippet" class="overflow-hidden rounded-surface border border-border" dir="ltr">
                                <div class="flex h-row items-center justify-between gap-2 border-b border-border bg-nq-surface-soft ps-3 pe-1.5 font-mono text-caption text-muted-foreground">
                                    <span class="truncate">.vscode/mcp.json</span>
                                    <span class="contents" x-data="nqCopyButton('{\n  \u0022servers\u0022: {\n    \u0022example\u0022: {\n      \u0022type\u0022: \u0022http\u0022,\n      \u0022url\u0022: \u0022https:\/\/mcp.example.com\/mcp\u0022,\n      \u0022headers\u0022: {\n        \u0022Authorization\u0022: \u0022Bearer nsq_live_a1b2c3d4e5f6g7h8i9j0\u0022\n      }\n    }\n  }\n}', 1500)">
    <button data-slot="copy-button"
     type="button"                         aria-label="Copy .vscode/mcp.json" x-on:click="copy()" x-bind:data-copied="state === &#039;copied&#039; ? &#039;&#039; : null" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0 data-copied:text-nq-success-text">
        <svg aria-hidden="true" x-show="state !== 'copied'" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
  <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
</svg>        <svg aria-hidden="true" x-show="state === 'copied'" style="display: none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></button>
    <span data-slot="copy-button-status" role="status" aria-live="polite" class="sr-only"
        data-copied-label="Copied to clipboard" data-failed-label="Could not copy"
        x-text="state === 'copied' ? $el.dataset.copiedLabel : state === 'failed' ? $el.dataset.failedLabel : ''"></span>
</span>
                                </div>
                                <figure data-slot="code-block" data-language="json" dir="ltr" x-data="nqCodeBlock(JSON.parse('{\u0022code\u0022:\u0022{\\n  \\u0022servers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022type\\u0022: \\u0022http\\u0022,\\n      \\u0022url\\u0022: \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n      \\u0022headers\\u0022: {\\n        \\u0022Authorization\\u0022: \\u0022Bearer nsq_li\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022i9j0\\u0022\\n      }\\n    }\\n  }\\n}\u0022,\u0022language\u0022:\u0022json\u0022,\u0022marked\u0022:[],\u0022lineNumbers\u0022:false}'))" x-bind:data-highlighted="highlighted ? '' : null" x-effect="setCode(shownSnippet(3))"
    class="group/code relative m-0 overflow-hidden border-border bg-nq-surface-soft text-start [--shiki-foreground:var(--nq-fg)] [--shiki-background:transparent] [--shiki-token-comment:var(--nq-fg-muted)] [--shiki-token-keyword:var(--nq-accent-text)] [--shiki-token-string:var(--nq-success-text)] [--shiki-token-string-expression:var(--nq-success-text)] [--shiki-token-constant:var(--nq-warning-text)] [--shiki-token-function:var(--nq-info-text)] [--shiki-token-parameter:var(--nq-fg-body)] [--shiki-token-punctuation:var(--nq-fg-muted)] [--shiki-token-link:var(--nq-info-text)] rounded-none border-0">
        <pre data-slot="code-block-pre" role="region" tabindex="0" aria-label=".vscode/mcp.json"
        class="m-0 overflow-auto bg-transparent py-3 font-mono text-code text-[var(--shiki-foreground)] outline-none focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-nq-focus "><code class="block w-max min-w-full"><span data-line="1"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>{</span></span><span data-line="2"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>  &quot;servers&quot;: {</span></span><span data-line="3"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>    &quot;example&quot;: {</span></span><span data-line="4"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      &quot;type&quot;: &quot;http&quot;,</span></span><span data-line="5"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      &quot;url&quot;: &quot;https://mcp.example.com/mcp&quot;,</span></span><span data-line="6"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      &quot;headers&quot;: {</span></span><span data-line="7"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>        &quot;Authorization&quot;: &quot;Bearer nsq_li••••••••••••i9j0&quot;</span></span><span data-line="8"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      }</span></span><span data-line="9"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>    }</span></span><span data-line="10"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>  }</span></span><span data-line="11"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>}</span></span></code></pre>
</figure>
                            </div>
                                                            <div>
                                    <a data-slot="mcp-deep-link"
     href="vscode:mcp/install?%7B%22name%22%3A%22example%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.example.com%2Fmcp%22%2C%22headers%22%3A%7B%22Authorization%22%3A%22Bearer%20nsq_live_a1b2c3d4e5f6g7h8i9j0%22%7D%7D"                         class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border-border bg-card text-foreground hover:bg-nq-hover h-control-sm px-2.5">
        <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M15 3h6v6"/>
  <path d="M10 14 21 3"/>
  <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>
</svg>                                        Install in VS Code</a>
                                </div>
                                                    </div></div>
                                                        <div data-slot="tabs-panel" x-bind="panel('generic')"
     hidden     class="outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus flex flex-col gap-4"><ol class="flex flex-col gap-1.5 text-body-sm text-foreground">
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">1</span>
                                    <span class="sr-only">Step 1: </span>
                                    <span class="min-w-0">Add this to your client&#039;s MCP configuration.</span>
                                </li>
                                                            <li class="flex gap-2.5">
                                    <span aria-hidden="true" class="mt-0.5 inline-flex size-5 shrink-0 items-center justify-center rounded-full bg-secondary text-caption tabular-nums text-muted-foreground">2</span>
                                    <span class="sr-only">Step 2: </span>
                                    <span class="min-w-0">Clients that read mcpServers use this shape. Rename the root key if yours differs.</span>
                                </li>
                                                    </ol>
                        <div class="flex flex-col gap-3">
                            <div data-slot="mcp-snippet" class="overflow-hidden rounded-surface border border-border" dir="ltr">
                                <div class="flex h-row items-center justify-between gap-2 border-b border-border bg-nq-surface-soft ps-3 pe-1.5 font-mono text-caption text-muted-foreground">
                                    <span class="truncate">mcp.json</span>
                                    <span class="contents" x-data="nqCopyButton('{\n  \u0022mcpServers\u0022: {\n    \u0022example\u0022: {\n      \u0022type\u0022: \u0022http\u0022,\n      \u0022url\u0022: \u0022https:\/\/mcp.example.com\/mcp\u0022,\n      \u0022headers\u0022: {\n        \u0022Authorization\u0022: \u0022Bearer nsq_live_a1b2c3d4e5f6g7h8i9j0\u0022\n      }\n    }\n  }\n}', 1500)">
    <button data-slot="copy-button"
     type="button"                         aria-label="Copy mcp.json" x-on:click="copy()" x-bind:data-copied="state === &#039;copied&#039; ? &#039;&#039; : null" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0 data-copied:text-nq-success-text">
        <svg aria-hidden="true" x-show="state !== 'copied'" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
  <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
</svg>        <svg aria-hidden="true" x-show="state === 'copied'" style="display: none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></button>
    <span data-slot="copy-button-status" role="status" aria-live="polite" class="sr-only"
        data-copied-label="Copied to clipboard" data-failed-label="Could not copy"
        x-text="state === 'copied' ? $el.dataset.copiedLabel : state === 'failed' ? $el.dataset.failedLabel : ''"></span>
</span>
                                </div>
                                <figure data-slot="code-block" data-language="json" dir="ltr" x-data="nqCodeBlock(JSON.parse('{\u0022code\u0022:\u0022{\\n  \\u0022mcpServers\\u0022: {\\n    \\u0022example\\u0022: {\\n      \\u0022type\\u0022: \\u0022http\\u0022,\\n      \\u0022url\\u0022: \\u0022https:\\\/\\\/mcp.example.com\\\/mcp\\u0022,\\n      \\u0022headers\\u0022: {\\n        \\u0022Authorization\\u0022: \\u0022Bearer nsq_li\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022\\u2022i9j0\\u0022\\n      }\\n    }\\n  }\\n}\u0022,\u0022language\u0022:\u0022json\u0022,\u0022marked\u0022:[],\u0022lineNumbers\u0022:false}'))" x-bind:data-highlighted="highlighted ? '' : null" x-effect="setCode(shownSnippet(4))"
    class="group/code relative m-0 overflow-hidden border-border bg-nq-surface-soft text-start [--shiki-foreground:var(--nq-fg)] [--shiki-background:transparent] [--shiki-token-comment:var(--nq-fg-muted)] [--shiki-token-keyword:var(--nq-accent-text)] [--shiki-token-string:var(--nq-success-text)] [--shiki-token-string-expression:var(--nq-success-text)] [--shiki-token-constant:var(--nq-warning-text)] [--shiki-token-function:var(--nq-info-text)] [--shiki-token-parameter:var(--nq-fg-body)] [--shiki-token-punctuation:var(--nq-fg-muted)] [--shiki-token-link:var(--nq-info-text)] rounded-none border-0">
        <pre data-slot="code-block-pre" role="region" tabindex="0" aria-label="mcp.json"
        class="m-0 overflow-auto bg-transparent py-3 font-mono text-code text-[var(--shiki-foreground)] outline-none focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-nq-focus "><code class="block w-max min-w-full"><span data-line="1"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>{</span></span><span data-line="2"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>  &quot;mcpServers&quot;: {</span></span><span data-line="3"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>    &quot;example&quot;: {</span></span><span data-line="4"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      &quot;type&quot;: &quot;http&quot;,</span></span><span data-line="5"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      &quot;url&quot;: &quot;https://mcp.example.com/mcp&quot;,</span></span><span data-line="6"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      &quot;headers&quot;: {</span></span><span data-line="7"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>        &quot;Authorization&quot;: &quot;Bearer nsq_li••••••••••••i9j0&quot;</span></span><span data-line="8"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>      }</span></span><span data-line="9"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>    }</span></span><span data-line="10"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>  }</span></span><span data-line="11"  class="flex min-h-[1lh] border-s-2 border-transparent pe-4 whitespace-pre ps-3"><span data-code-line>}</span></span></code></pre>
</figure>
                            </div>
                                                    </div></div>
</div>
                    <div class="flex flex-col gap-3 border-t border-border pt-4" data-slot="mcp-test" x-bind:data-state="status">
                <div>
                    <button data-slot="button"
     type="button"                         x-bind:disabled="busy" x-bind:aria-busy="String(busy)" x-on:click="run()" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border-border bg-card text-foreground hover:bg-nq-hover h-control px-[var(--nq-control-pad)]">
        <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M12 22v-5"/>
  <path d="M15 8V2"/>
  <path d="M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z"/>
  <path d="M9 8V2"/>
</svg>                        <span x-text="testLabel">Test connection</span></button>
                </div>
                <div role="status" aria-live="polite">
                    <div data-slot="alert" data-tone="success" role="status"
        x-show="okShown" style="display: none" class="relative grid grid-cols-[auto_1fr_auto] items-start gap-x-3 rounded-card border p-3 text-start border-nq-success/30 bg-nq-success-soft">
    <svg aria-hidden="true" data-slot="alert-icon" class="mt-0.5 size-4 text-nq-success-text" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="m9 12 2 2 4-4"/>
</svg>    <div data-slot="alert-body" class="flex min-w-0 flex-col gap-0.5">
                    <div data-slot="alert-title" class="text-label text-foreground">Connected</div>
                            <div data-slot="alert-description" class="text-body-sm text-muted-foreground"><span x-text="detail"></span></div>
            </div>
    </div>
                    <div data-slot="alert" data-tone="danger" role="alert"
        x-show="failShown" style="display: none" class="relative grid grid-cols-[auto_1fr_auto] items-start gap-x-3 rounded-card border p-3 text-start border-nq-danger/30 bg-nq-danger-soft">
    <svg aria-hidden="true" data-slot="alert-icon" class="mt-0.5 size-4 text-nq-danger-text" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="m15 9-6 6"/>
  <path d="m9 9 6 6"/>
</svg>    <div data-slot="alert-body" class="flex min-w-0 flex-col gap-0.5">
                    <div data-slot="alert-title" class="text-label text-foreground">Could not connect</div>
                            <div data-slot="alert-description" class="text-body-sm text-muted-foreground"><span x-text="failure"></span></div>
            </div>
    </div>
                    <div data-slot="alert" data-tone="danger" role="alert"
        x-show="errorShown" style="display: none" class="relative grid grid-cols-[auto_1fr_auto] items-start gap-x-3 rounded-card border p-3 text-start border-nq-danger/30 bg-nq-danger-soft">
    <svg aria-hidden="true" data-slot="alert-icon" class="mt-0.5 size-4 text-nq-danger-text" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="m15 9-6 6"/>
  <path d="m9 9 6 6"/>
</svg>    <div data-slot="alert-body" class="flex min-w-0 flex-col gap-0.5">
                            <div data-slot="alert-description" class="text-body-sm text-foreground">The test could not run. Try again.</div>
            </div>
    </div>
                </div>
            </div></div>
</div>
```
