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

# Vertical (market intelligence)

> Watch Market Intelligence: the federated vertical layer. All 16 tools — live market feed, brand/model cards, search, compare, benchmarks, market density, know-how and lookups.

## What Vertical is

**Vertical** is a curated, benchmarked market-intelligence layer sitting on top of the public signals of one business vertical. Where your own data tables hold *your* orders, customers, and leads, the Vertical layer holds the **market around you** — the entities that matter in your industry (brands, models, channels), the signals attached to them, and the benchmarks that let you read one number against the whole field.

For this tenant the vertical is the **watch market** — *Watch Market Intelligence* — whose entities are watch *brands*. Each vertical connection ships a **manifest** (the entity label, the channels it tracks, the benchmarks and lookups it offers) that templates every tool, so the same tools describe themselves in the language of whatever vertical you are connected to.

It is built for the people and agents who need market context around a decision: which brands are moving, how a competitor compares, what "normal" looks like as a benchmark, and the editorial know-how that explains the numbers. The surface is **read-only** — there are no write tools, and compliance filtering (insights only) is applied server-side.

## How it is accessed

Vertical is a **federated MCP surface**: its tools are namespaced `vertical__*` and reachable two ways.

1. **Federated on the main server** (`https://app.concierca.ch/api/mcp/v1`) under namespaced names: `vertical__vertical_card`, `vertical__vertical_search`, … This is the normal path — one connector covers everything, and the tools show up in the server's `tools/list` alongside your other tools.
2. **Standalone vertical endpoint** — `https://app.concierca.ch/api/mcp/watchinside` (the watch-market vertical; alias "Vertical") or the generic `https://app.concierca.ch/api/mcp/vertical/<slug>` — where the tools carry their **bare** names (`vertical_card`, …).

Access follows the vertical connection your tenant/user holds. To discover what is available at runtime, call `tools/list` on the endpoint, then `vertical_legend` for the live data catalog.

<Note>
  **Common parameter:** every tool accepts an optional `vertical` (string) — the vertical slug; it defaults to the connection's own vertical. **Periods** are quarters, expressed as the quarter start: `period_key` = `YYYY-MM-01`.
</Note>

## Feed (live market feed)

The **feed** is the live stream of curated market signals. These five `feed_*` names are the original feed tools — still fully callable — and each maps 1:1 to a `vertical_*` tool documented below (identical parameters). Prefer the `vertical_*` names in new integrations; reach for the `feed_*` names when an existing setup already uses them.

| Feed tool            | Maps to            | Purpose                                                                            |
| -------------------- | ------------------ | ---------------------------------------------------------------------------------- |
| `feed_index_list`    | `vertical_legend`  | The feed index/legend — what data exists, which channels and signal types are live |
| `feed_search`        | `vertical_search`  | Filtered cross-entity search over the live feed                                    |
| `feed_card`          | `vertical_card`    | One entity's insight card from the feed                                            |
| `feed_compare`       | `vertical_compare` | Side-by-side feed cards for 2–6 entities                                           |
| `feed_brand_resolve` | `vertical_resolve` | Resolve a free-text name (e.g. a brand) to a canonical entity id                   |

## Vertical intelligence

The canonical tool set. The eight `vertical_*` tools below are the ones to build against; three more legacy aliases (`list_lookups`, `market_density`, `read_know_how`) map onto them and are listed at the end of this section.

### `vertical_legend`

The legend of the insight feed: manifest (channels, benchmarks, lookups), the full signal catalog (what each signal means, how to read it, example questions) and live counts. **Call this first** when unsure what data exists or which `signal_type` to filter on.

| Name       | Type   | Required | Description                                 |
| ---------- | ------ | -------- | ------------------------------------------- |
| `vertical` | string | no       | Vertical slug (defaults to this connection) |

**Returns:** `{ manifest, entity_label, entity_label_plural, signal_catalog, live, hint }`. `signal_catalog` is the full signal definition list (channel, meaning, how-to-read, example questions, first/last period); `live` is `{ insight_rows, entities, channels, signal_types, period_range: {from, to} | null }` derived from the current data.

### `vertical_resolve`

Resolve a free-text entity name to the canonical `entity_id`. Returns candidates with display name, match score and attributes — master data only. Use the returned `entity_id` with `vertical_card` or `vertical_search`.

| Name       | Type   | Required | Description                                |
| ---------- | ------ | -------- | ------------------------------------------ |
| `query`    | string | yes      | Entity name or fragment (case-insensitive) |
| `limit`    | number | no       | Max candidates (default 10, max 25)        |
| `vertical` | string | no       | Vertical slug                              |

**Returns:** `{ candidates, total, hint }`. Each candidate: `{entity_id, display_name, match_score, attributes}` (`match_score` 1.0 exact / 0.8 prefix / 0.6 substring). Empty/failed query → `{ candidates: [], error }`.

```json theme={null}
{ "method": "tools/call", "params": { "name": "vertical__vertical_resolve", "arguments": { "query": "omega" } } }
```

### `vertical_card`

One entity's complete insight card for one period: curated snippets (headline + metric) across all channels, plus entity attributes. **Start here for any "tell me about one entity" question** — for 2+ entities call `vertical_compare` instead. Defaults to each channel's newest period. Responses are lean by default.

| Name              | Type    | Required | Description                                                   |
| ----------------- | ------- | -------- | ------------------------------------------------------------- |
| `entity_id`       | string  | yes      | Entity id (or free-text name)                                 |
| `period`          | string  | no       | `YYYY-MM` or `YYYY-MM-01` (default: newest)                   |
| `channel`         | string  | no       | Restrict to one channel (see `vertical_legend`)               |
| `include_details` | boolean | no       | Include details + source refs payloads (large; default false) |
| `vertical`        | string  | no       | Vertical slug                                                 |

**Returns:** `{ entity_id, display_name, attributes, periods, total, snippets }`. `periods` is the per-channel period actually used; `snippets` are the curated insight rows (headline + metric per channel/signal\_type/period — details + source refs included only when `include_details:true`). An entity with no data → `{ entity_id, snippets: [], total: 0, note }`.

### `vertical_search`

Filtered cross-entity search over the curated insight feed. Filter by channel, signal type (see `vertical_legend` for valid values), entity, period range, or free text on headlines.

| Name              | Type    | Required | Description                                          |
| ----------------- | ------- | -------- | ---------------------------------------------------- |
| `entity_id`       | string  | no       | Entity id or name                                    |
| `channel`         | string  | no       | One channel                                          |
| `signal_type`     | string  | no       | Signal type filter                                   |
| `period_from`     | string  | no       | Earliest period `YYYY-MM-01`, inclusive              |
| `period_to`       | string  | no       | Latest period `YYYY-MM-01`, inclusive                |
| `text`            | string  | no       | Free-text match on snippet headlines                 |
| `limit`           | number  | no       | Max snippets (default 50, max 200)                   |
| `include_details` | boolean | no       | Include details + source refs (large; default false) |
| `vertical`        | string  | no       | Vertical slug                                        |

**Returns:** `{ total, snippets }` — the matching curated insight rows across entities (details + source refs only when `include_details:true`). An unknown `signal_type` → `{ snippets: [], error }`.

### `vertical_compare`

Competitive pack in one call: lean insight cards (headline + metric) for **2–6 entities** side by side. Always use this for multi-entity comparisons — never loop `vertical_card` per entity.

| Name           | Type      | Required | Description                                              |
| -------------- | --------- | -------- | -------------------------------------------------------- |
| `entity_ids`   | string\[] | yes      | 2–6 entity ids or names                                  |
| `signal_types` | string\[] | no       | Restrict to these signal types                           |
| `channel`      | string    | no       | One channel                                              |
| `period`       | string    | no       | Fixed period `YYYY-MM-01` for all (default: each newest) |
| `vertical`     | string    | no       | Vertical slug                                            |

```json theme={null}
{ "method": "tools/call", "params": { "name": "vertical__vertical_compare", "arguments": {
  "entity_ids": ["rolex", "omega", "tudor"], "channel": "social"
} } }
```

**Returns:** `{ entities, unresolved, truncated? }`. `entities` is one lean card per resolved entity (`{input, entity_id, display_name?, periods, total, snippets}`); `unresolved` lists names that did not resolve; `truncated` lists any names dropped beyond the 6-entity cap.

### `vertical_benchmark`

Non-entity market aggregates (benchmarks) — the "what is normal" numbers you read a single entity against. Filter by dimension (e.g. `{"country":"DE"}`) and period range. An unknown benchmark name returns an error listing the available names (see `vertical_legend`).

| Name               | Type   | Required | Description                                           |
| ------------------ | ------ | -------- | ----------------------------------------------------- |
| `name`             | string | yes      | Benchmark name (see `vertical_legend`)                |
| `dimension_filter` | object | no       | Dimension containment filter, e.g. `{"country":"DE"}` |
| `period_from`      | string | no       | Earliest period `YYYY-MM-01`, inclusive               |
| `period_to`        | string | no       | Latest period `YYYY-MM-01`, inclusive                 |
| `limit`            | number | no       | Max rows (default 60, max 200)                        |
| `vertical`         | string | no       | Vertical slug                                         |

**Returns:** `{ total, rows }` — benchmark aggregate rows. No match → `{ rows: [], total: 0, note }`; an unknown benchmark `name` → `{ rows: [], error, available }` where `available` lists the valid benchmark names.

### `vertical_knowhow`

Read the vertical's knowledge-base articles (editorial content, not feed data) — the write-ups that explain the market and how to read the signals.

| Name         | Type   | Required | Description                                 |
| ------------ | ------ | -------- | ------------------------------------------- |
| `query`      | string | no       | Keyword to filter articles by title/content |
| `article_id` | string | no       | Fetch one article by id                     |
| `vertical`   | string | no       | Vertical slug                               |

**Returns:** `{ articles, total }` — knowledge-base articles (a single-element array when `article_id` is given).

### `vertical_lookups`

List reference/lookup values, grouped by lookup name — the controlled vocabularies (channels, signal types, dimensions) the rest of the surface uses.

| Name          | Type   | Required | Description            |
| ------------- | ------ | -------- | ---------------------- |
| `lookup_name` | string | no       | Restrict to one lookup |
| `vertical`    | string | no       | Vertical slug          |

**Returns:** `{ lookups, lookup_names }` — `lookups` is an object keyed by lookup name, each holding its reference values; `lookup_names` is the list of keys present.

### More legacy aliases

Three further legacy names remain callable and map 1:1 to the canonical tools above (identical parameters):

| Legacy tool      | Maps to              | Purpose                                                                                          |
| ---------------- | -------------------- | ------------------------------------------------------------------------------------------------ |
| `list_lookups`   | `vertical_lookups`   | List reference/lookup values grouped by name                                                     |
| `market_density` | `vertical_benchmark` | Market density / benchmark aggregates (the original density tool, generalized to all benchmarks) |
| `read_know_how`  | `vertical_knowhow`   | Read knowledge-base articles                                                                     |
