> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cekura.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Set up Skills + MCP manually

> For clients without a native Cekura plugin: install Cekura Skills, then connect the MCP server separately.

export const CopyPageButton = () => {
  if (typeof window !== 'undefined') {
    setTimeout(function () {
      if (document.getElementById('ck-tools')) return;
      var anchor = document.getElementById('content-area') || document.querySelector('.mdx-content');
      if (!anchor) return;
      if (!document.getElementById('ck-style')) {
        var s = document.createElement('style');
        s.id = 'ck-style';
        s.textContent = '#ck-tools{position:absolute;top:6px;right:0;z-index:100;font-family:inherit;}' + '.ck-row{display:inline-flex;align-items:stretch;border:1px solid rgba(0,0,0,0.15);border-radius:8px;overflow:hidden;background:#fff;}' + ':root.dark .ck-row{background:rgba(255,255,255,0.06);border-color:rgba(255,255,255,0.12);}' + '.ck-btn{padding:5px 12px;border:none;background:none;cursor:pointer;font-size:13px;font-weight:500;font-family:inherit;color:#374151;}' + ':root.dark .ck-btn{color:#d1d5db;}' + '.ck-btn:hover{background:rgba(0,0,0,0.04);}' + ':root.dark .ck-btn:hover{background:rgba(255,255,255,0.06);}' + '.ck-chevron{padding:5px 8px;border:none;background:none;cursor:pointer;font-size:14px;font-family:inherit;color:#374151;}' + ':root.dark .ck-chevron{color:#d1d5db;}' + '.ck-chevron:hover{background:rgba(0,0,0,0.04);}' + ':root.dark .ck-chevron:hover{background:rgba(255,255,255,0.06);}' + '.ck-divider{width:1px;background:rgba(0,0,0,0.12);flex-shrink:0;}' + ':root.dark .ck-divider{background:rgba(255,255,255,0.12);}' + '.ck-dd{position:absolute;top:calc(100% + 4px);right:0;min-width:180px;background:#fff;border:1px solid rgba(0,0,0,0.12);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,0.1);padding:4px;display:none;z-index:200;}' + ':root.dark .ck-dd{background:#1f2937;border-color:rgba(255,255,255,0.1);box-shadow:0 4px 16px rgba(0,0,0,0.35);}' + '.ck-item{display:block;width:100%;padding:7px 12px;border:none;background:none;border-radius:6px;cursor:pointer;font-size:13px;font-family:inherit;text-align:left;color:#374151;}' + ':root.dark .ck-item{color:#d1d5db;}' + '.ck-item:hover{background:rgba(0,0,0,0.05);}' + ':root.dark .ck-item:hover{background:rgba(255,255,255,0.07);}';
        document.head.appendChild(s);
      }
      var wrap = document.createElement('div');
      wrap.id = 'ck-tools';
      var row = document.createElement('div');
      row.className = 'ck-row';
      var mainBtn = document.createElement('button');
      mainBtn.className = 'ck-btn';
      mainBtn.textContent = 'Copy page';
      var divider = document.createElement('span');
      divider.className = 'ck-divider';
      var chevron = document.createElement('button');
      chevron.className = 'ck-chevron';
      chevron.textContent = '▾';
      var dd = document.createElement('div');
      dd.className = 'ck-dd';
      function closeDD() {
        dd.style.display = 'none';
      }
      function openDD() {
        dd.style.display = 'block';
      }
      chevron.onclick = function (e) {
        e.stopPropagation();
        if (dd.style.display === 'block') {
          closeDD();
        } else {
          openDD();
        }
      };
      document.addEventListener('click', function (e) {
        if (!e.target.closest('#ck-tools')) {
          closeDD();
        }
      });
      document.addEventListener('keydown', function (e) {
        if (e.key === 'Escape') {
          closeDD();
        }
      });
      function makeItem(label, fn) {
        var b = document.createElement('button');
        b.className = 'ck-item';
        b.textContent = label;
        b.onclick = function () {
          fn();
          closeDD();
        };
        return b;
      }
      function getMarkdown() {
        var walk = function (node) {
          if (!node) return '';
          if (node.nodeType === 3) return node.textContent || '';
          if (node.nodeType !== 1) return '';
          var tag = node.tagName.toLowerCase();
          var skip = ['script', 'style', 'svg', 'noscript', 'button', 'iframe'];
          if (skip.indexOf(tag) !== -1) return '';
          if (node.id === 'ck-tools') return '';
          var ch = Array.from(node.childNodes).map(walk).join('');
          if (tag === 'h1') return '\n# ' + ch.trim() + '\n\n';
          if (tag === 'h2') return '\n## ' + ch.trim() + '\n\n';
          if (tag === 'h3') return '\n### ' + ch.trim() + '\n\n';
          if (tag === 'p') return '\n' + ch.trim() + '\n\n';
          if (tag === 'pre') return '\n```\n' + node.textContent.trim() + '\n```\n\n';
          if (tag === 'li') return '- ' + ch.trim() + '\n';
          if (tag === 'code') return '`' + ch.trim() + '`';
          return ch;
        };
        var content = document.querySelector('.mdx-content') || document.getElementById('content-area') || document.body;
        return walk(content).replace(/\n\n\n+/g, '\n\n').trim();
      }
      function copyMd() {
        var md = getMarkdown();
        navigator.clipboard.writeText(md).then(function () {
          mainBtn.textContent = 'Copied!';
          setTimeout(function () {
            mainBtn.textContent = 'Copy page';
          }, 2000);
        });
      }
      function viewMd() {
        var md = getMarkdown();
        var safe = md.split('&').join('&amp;').split('<').join('&lt;').split('>').join('&gt;');
        var html = '<!DOCTYPE html><html><head><meta charset="utf-8"><style>body{font-family:monospace;max-width:860px;margin:40px auto;padding:0 24px;line-height:1.7;white-space:pre-wrap;word-wrap:break-word}</style></head><body>' + safe + '</body></html>';
        window.open(URL.createObjectURL(new Blob([html], {
          type: 'text/html'
        })), '_blank');
      }
      function openClaude() {
        var prompt = 'Can you read this Cekura docs page ' + window.location.href + ' so I can ask you questions?';
        window.open('https://claude.ai/new?q=' + encodeURIComponent(prompt), '_blank');
      }
      mainBtn.onclick = copyMd;
      dd.appendChild(makeItem('Copy page', copyMd));
      dd.appendChild(makeItem('View as Markdown', viewMd));
      dd.appendChild(makeItem('Open in Claude', openClaude));
      row.appendChild(mainBtn);
      row.appendChild(divider);
      row.appendChild(chevron);
      wrap.appendChild(row);
      wrap.appendChild(dd);
      anchor.style.position = 'relative';
      anchor.insertBefore(wrap, anchor.firstChild);
    }, 50);
  }
  return null;
};

<CopyPageButton />

<Note>
  Most clients — Claude Code, Cursor, Codex, Gemini CLI — have a [native plugin](/mcp/overview#set-up) that installs Skills **and** MCP in one step. Use this page only if your client has no plugin. You'll set up the two pieces separately: **Skills first, then MCP.**
</Note>

## What MCP gives you

Cekura's MCP server exposes documentation search and Cekura API operations through one endpoint:

```plaintext theme={null}
https://api.cekura.ai/mcp
```

Your assistant can search docs, list agents, create metrics, generate evaluators, run tests, inspect results, and analyze call logs through typed tools.

## Prerequisites

* Access to the [Cekura Dashboard](https://dashboard.cekura.ai)
* Node.js 20.18.1 or higher if your client uses the `mcp-remote` shim
* No Node.js requirement for Claude Code's native HTTP transport, Claude Desktop connectors, or Codex native HTTP config

## Install Skills

Install Cekura Skills first, so your assistant knows Cekura workflows — not just raw tools:

```bash theme={null}
npx skills add cekura-ai/cekura-skills --all
```

If your assistant doesn't load Agent Skills, use the portable [behavior preset](/mcp/other-agents) instead. (Only need raw tools, e.g. for CI? Skip ahead to Connect MCP.)

## Connect MCP

Then connect the MCP server. OAuth is recommended; use an API key only for CI or project-scoped credentials.

### OAuth setup

Your MCP client opens a browser, you sign into Cekura, and the client manages the session token.

<Tabs>
  <Tab title="Claude Code">
    ```bash theme={null}
    claude mcp add --transport http cekura --scope user https://api.cekura.ai/mcp
    ```

    Verify:

    ```bash theme={null}
    claude mcp list
    ```
  </Tab>

  <Tab title="Claude Desktop">
    1. Open Claude Desktop.
    2. Go to **Settings > Connectors**.
    3. Click **Add custom connector**.
    4. Set **Name** to `Cekura`.
    5. Set **URL** to `https://api.cekura.ai/mcp`.
    6. Save, then finish the browser authorization flow.

    This connector gives MCP only. To get Cekura Skills too, install the plugin instead — see the [Claude Desktop guide](/mcp/claude-desktop-guide).
  </Tab>

  <Tab title="Cursor / VS Code">
    Add this to your Cursor MCP config or `.vscode/mcp.json`:

    ```json theme={null}
    {
      "mcpServers": {
        "cekura": {
          "command": "npx",
          "args": ["-y", "mcp-remote", "https://api.cekura.ai/mcp"]
        }
      }
    }
    ```
  </Tab>

  <Tab title="Codex">
    Add this to `~/.codex/config.toml`. The `mcp-remote` shim handles the OAuth browser sign-in (needs Node.js 20.18.1+):

    ```toml theme={null}
    [mcp_servers.cekura]
    command = "npx"
    args = ["-y", "mcp-remote", "https://api.cekura.ai/mcp"]
    ```
  </Tab>
</Tabs>

### API-key setup

Use an API key only when you need a project-scoped credential, a shared service credential, or a client that cannot complete OAuth. Create keys in **Settings > API Keys** in the Cekura dashboard.

<Tabs>
  <Tab title="Claude Code">
    ```bash theme={null}
    claude mcp add --transport http cekura --scope user https://api.cekura.ai/mcp --header "X-CEKURA-API-KEY:YOUR_API_KEY_HERE"
    ```

    Verify:

    ```bash theme={null}
    claude mcp list
    ```
  </Tab>

  <Tab title="Claude Desktop">
    Claude Desktop's connector UI is best with OAuth. Use the OAuth flow above unless your workspace specifically requires an API key.

    If your workspace requires API-key auth, use Claude Code or another MCP client that supports custom headers.
  </Tab>

  <Tab title="Cursor / VS Code">
    ```json theme={null}
    {
      "mcpServers": {
        "cekura": {
          "command": "npx",
          "args": [
            "-y",
            "mcp-remote",
            "https://api.cekura.ai/mcp",
            "--header",
            "X-CEKURA-API-KEY:${CEKURA_API_KEY}"
          ],
          "env": {
            "CEKURA_API_KEY": "YOUR_API_KEY_HERE"
          }
        }
      }
    }
    ```
  </Tab>

  <Tab title="Codex">
    Native HTTP config:

    ```toml theme={null}
    [mcp_servers.cekura]
    url = "https://api.cekura.ai/mcp"
    http_headers = { "X-CEKURA-API-KEY" = "YOUR_API_KEY_HERE" }
    ```

    CLI form:

    ```bash theme={null}
    codex mcp add cekura --env CEKURA_API_KEY=YOUR_API_KEY_HERE -- sh -c 'npx -y mcp-remote https://api.cekura.ai/mcp --header "X-CEKURA-API-KEY:$CEKURA_API_KEY"'
    ```
  </Tab>
</Tabs>

## Verify the connection

Restart your assistant and ask:

```plaintext theme={null}
List my Cekura agents.
```

If configured correctly, your assistant returns agents from your Cekura workspace.

## Request headers

| Header                           | Used by      | Description                                        |
| -------------------------------- | ------------ | -------------------------------------------------- |
| `Authorization: Bearer <token>`  | OAuth        | Set automatically by your MCP client after sign-in |
| `X-CEKURA-API-KEY`               | API-key path | Required when using an API key                     |
| `Content-Type: application/json` | Both         | Request payload format                             |

## Available tool areas

<CardGroup cols={2}>
  <Card title="Documentation Search" icon="magnifying-glass" color="#A6A7EA">
    Search integration guides, schemas, examples, and workflow docs.
  </Card>

  <Card title="Testing" icon="flask" color="#A6A7EA">
    Create agents, create evaluators, define metrics, run tests, and inspect results.
  </Card>

  <Card title="Observability" icon="eye" color="#A6A7EA">
    List call logs, evaluate production calls, and analyze call performance.
  </Card>

  <Card title="Automation" icon="clock" color="#A6A7EA">
    Create scheduled jobs, recurring tests, and metric-improvement workflows.
  </Card>
</CardGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Auth failed">
    A `401 Unauthorized` usually means the OAuth session expired or the API key is invalid.

    For OAuth, reconnect from your client and confirm you are signed into the right Cekura account. For API keys, confirm the header name is exactly `X-CEKURA-API-KEY` and the key is active.
  </Accordion>

  <Accordion title="Tools are not showing up">
    Restart your assistant after changing MCP config. Confirm the URL is exactly `https://api.cekura.ai/mcp`, check JSON or TOML syntax, and inspect your assistant's MCP logs.
  </Accordion>

  <Accordion title="Node.js version errors">
    If `mcp-remote` fails with an engine or `File is not defined` error, upgrade Node.js to 20.18.1 or higher and make sure your client is using that Node.js version.
  </Accordion>

  <Accordion title="Rate limits">
    If you hit `429 Too Many Requests`, reduce concurrency, narrow the request, or check usage in **Settings > API Usage**.
  </Accordion>
</AccordionGroup>

## Next step

If your client turns out to have a native plugin, switch to it — it bundles Skills + MCP and keeps both updated. See the [setup overview](/mcp/overview#set-up). Browse the [Skills catalog](/mcp/skills) for what the Skills cover.
