# Quick Start

> From nothing to an agent answering questions about your documentation — Docker Compose, one project, one connected client, about ten minutes end to end.

- Updated: 2026-09-21
- Source: https://contextator.com/en/docs/quick-start/
- Language: en-US
- Author: Muhammet Şafak

---
Budget about ten minutes for this, most of which is the one-time embedding-model download.

**You need:** Docker with Compose, and a folder of Markdown files. That is all — the database ships
inside the container.

## 1. Start the server

No repository clone needed — this pulls the published image, `contextator/contextator`:

```bash
mkdir contextator && cd contextator
curl -fsSLO https://raw.githubusercontent.com/Contextator/Contextator/main/docker-compose.yml
curl -fsSLO https://raw.githubusercontent.com/Contextator/Contextator/main/.env.example
cp .env.example .env
docker compose up -d
docker compose logs -f          # wait for "embedding model ready"
```

The first start does two slow things once: it initialises the database, and it downloads the embedding
model (~470 MB by default; see [Embedding Models](/en/docs/embedding-models/) for the smaller option).
Both are stored in Docker volumes, so every later start takes seconds.

By default the folder `./docs` is mounted read-only into the container at `/docs`; it is created empty
if it does not exist yet. Point it at your own documentation instead by setting it in `.env` before
starting:

```bash
DOCS_HOST_PATH=/path/to/your/docs
```

## 2. Create your account

The dashboard needs an account, and a new instance has none, so it starts by asking for a one-time
**setup code**. While no account exists the server prints it at every start — it is in the log you are
already following:

```
┌─ Contextator first-run setup ───────────────────────────────────────────┐
│ No user accounts exist yet; the dashboard is waiting for its first one. │
│                                                                         │
│   Open   http://localhost:3444/setup                                    │
│   Code   KRTW-9MHD-2PQF                                                 │
│                                                                         │
│ A new code is printed on every start until that first account exists.   │
└─────────────────────────────────────────────────────────────────────────┘
```

Open **http://localhost:3444/** — it sends you to `/setup` — and fill in the code, a username and a
password of at least 12 characters. Case and dashes in the code do not matter. **Create the root
account** signs you in, and the code stops working for good.

:::note
Prefer to choose the code yourself? Put `SETUP_CODE=something-you-remember` in `.env` before the
first start. Lost it? Restart the server; a new one is printed. Everything else about accounts is on
[Accounts and Permissions](/en/docs/accounts-and-permissions/).
:::

## 3. Create a project

Press **New project** (or just type `n`).

| Field | What to enter |
|-------|---------------|
| **Project name** | `demo` — lowercase letters, digits, `-` and `_`. This becomes your URL: `/mcp/demo` |
| **Documentation directory** | Point at one of your own subfolders under `/docs` — the host folder from `DOCS_HOST_PATH` is mounted there, so `docs/handbook` on the host is `/docs/handbook` here |
| **Index now** | Leave it checked |

Press **Create project**. The project appears in the list and its status moves through
`queued → syncing → embedding → idle`. A few hundred Markdown files take a minute or two on the first
run; later runs only touch what changed.

A new project requires a token by default: creation hands you the first one — `ctxm_…` — shown once,
in the dialog. **Copy it now**; it is not shown again. Skip the copy and you have not lost access — you
can mint another token from **MCP access** on the project page at any time.

:::tip
Leaving the directory empty is fine too — you can add git repositories, uploads or Notion afterwards
with **Add source**. See [Document Sources](/en/docs/document-sources/).
:::

## 4. Connect your agent

Select the project and find the **Connect an agent** panel. The creation dialog showed the snippets
with your new token filled in; the panel shows the same snippets again, with `<your token>` in its
place — paste in the token you copied. For Claude Code:

```bash
claude mcp add --transport http demo-docs http://localhost:3444/mcp/demo \
  --header "Authorization: Bearer ctxm_9f3a…"
```

For Cursor, put this in `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (per repository):

```json
{
  "mcpServers": {
    "demo-docs": {
      "url": "http://localhost:3444/mcp/demo",
      "headers": { "Authorization": "Bearer ctxm_9f3a…" }
    }
  }
}
```

Claude Desktop needs a stdio bridge; the snippet is on the
[Connecting AI Clients](/en/docs/connecting-ai-clients/) page along with everything else.

## 5. Ask a question

Ask your agent something your documentation answers:

> How do I re-index a project?

The agent calls `search_docs`, gets back the most relevant excerpts with their file paths and heading
breadcrumbs, and answers from them. If it needs the whole file it calls `read_document`. If it wants to
know what exists at all, it calls `list_topics`. You do not have to tell it which tool to use — the
server describes itself.

You can verify the endpoint without an agent at all — but only for a project whose **MCP access** is
**open**, since `npm run smoke` does not send a token. From a source checkout:

```bash
npm install && npm run smoke -- http://localhost:3444/mcp/demo "how do I re-index"
```

## What next

- **Add more documentation.** A project can hold several sources at once — see
  [Document Sources](/en/docs/document-sources/).
- **Keep it in sync automatically.** A push webhook re-indexes the moment someone merges:
  [Push Webhooks](/en/docs/push-webhooks/).
- **Give the rest of the team accounts.** **Users** in the top-right menu creates them; a `member`
  account reaches only the projects you add it to under **Members** on the project page — see
  [Accounts and Permissions](/en/docs/accounts-and-permissions/).
- **Mint more tokens, or open the endpoint, as the project needs.** A new project is already
  **token required** — the first token was minted and shown once when you created it — with **open**
  and **account required** the other two settings under **MCP access**; **account required** checks the
  project's own memberships through OAuth 2.1. See [Projects](/en/docs/projects/).
- **Tune retrieval.** `CHUNK_MAX_TOKENS` defaults to `96` because that is what measured best, not
  because it fits the model's window; see [Indexing](/en/docs/indexing/).
