---
name: backlight-mcp
description: How to use the public Backlight.ai MCP server (mcp.backlight.ai) to query Backlight.ai's case portfolio, service docs, and FAQ, and to submit a proposal request. Covers tool selection (search_cases, get_case, search_docs, search_faq, search_faq_vectors, semantic_search, query_case_graph, list_terms, search_pois, set_map_pin, submit_feedback, request_proposal), the case resources, example queries, and the proposal-intake flow. Use when asked about Backlight.ai's portfolio/cases, services/pricing/methodology, FAQ, wants a proposal/offerte, or references the backlight MCP.
---

# backlight-mcp - using the public Backlight.ai MCP server

Backlight.ai runs a public MCP server that any MCP-aware client can register. It
exposes Backlight.ai's case portfolio, service/methodology docs, and FAQ, plus a
proposal-intake tool. It is read-mostly: two write tools (`request_proposal`,
`submit_feedback`); everything else is retrieval over Backlight.ai's own content.

## Connect

Easiest path, if your client has a CLI (e.g. Claude Code):

```bash
claude mcp add --transport http backlight https://mcp.backlight.ai/mcp/
```

Both URL spellings work: `https://mcp.backlight.ai/mcp` and
`https://mcp.backlight.ai/mcp/` resolve identically (the backend registers an
explicit `_McpNoTrailingSlash` route for the bare form). Prefer the
trailing-slash form in new config; it is the canonical form other MCP servers
expect.

- **Native HTTP-MCP clients** (Claude Code, Claude Desktop via the `+` >
  Connectors menu, Cursor, Windsurf): add the URL as an `http` MCP server.
  Tools then surface as `search_cases`, `get_case`, etc.
- **stdio-only clients**: bridge with the `mcp-remote` proxy:
  ```json
  {
    "mcpServers": {
      "backlight": {
        "command": "npx",
        "args": ["-y", "mcp-remote", "https://mcp.backlight.ai/mcp/"]
      }
    }
  }
  ```
- **Inspect / debug**: `npx @modelcontextprotocol/inspector https://mcp.backlight.ai/mcp/`

Public integration guide: https://backlight.ai/mcp. Discovery file:
`https://backlight.ai/.well-known/mcp.json`.

Every tool's exact input schema, required arguments, and the injected `purpose`
field are discoverable from the standard MCP `tools/list` handshake call, and
statically from `https://backlight.ai/.well-known/mcp.json`. This skill only
covers tool SELECTION (which tool for which question) and call ORDERING, since
that is judgment the schema itself does not carry; follow whatever the live
schema says for exact parameters.

## Tool selection

| Question type | Tool |
|---|---|
| Portfolio/case/sector/client query ("welke overheidscases", "cases in transcriptie") | `search_cases` -- one call returns all matches, do not loop per sector/year |
| Full content of one named case, slug known | `get_case` |
| Structured filter by typed criteria (technique, sector, orgtype, tier) + semantics ("show me government LLM cases") | `query_case_graph` |
| Free-text question about services, pricing, methodology, terms, privacy | `search_docs` |
| Conceptual/paraphrased query, exact-term overlap unlikely | `semantic_search` |
| Common short question about Backlight.ai as a company | `search_faq` |
| FAQ-only, paraphrased, multi-query (1-5 variants) | `search_faq_vectors` |
| Vocabulary unclear before calling `search_docs` | `list_terms` (disambiguation only, not a content tool) |
| Submit feedback about the current conversation | `submit_feedback` |
| Map-pin/route confirmation | `set_map_pin` (returns a confirmation only; no map UI on Backlight.ai's own surfaces) |
| Points-of-interest search | `search_pois` (returns results only when the serving agent has a POI catalogue configured) |
| User explicitly wants to start a project / request a quote / be contacted | `request_proposal` -- ONLY on explicit intent, never speculatively |

Case resources (URI `@`-mentions, not tool calls):

| URI | Returns |
|---|---|
| `case://{slug}` | full markdown body of one published case |
| `cases://index` | `[{slug, title}, ...]` for all published cases -- quick overview before fetching bodies |

## Example queries

Illustrative tool-selection examples (see the live schema for exact arguments):

```
search_cases(query="transcriptie")

# query is the only required arg; sector/year/limit are optional:
search_cases(query="", sector="overheid")              # all government cases
search_cases(query="", year=2026)                      # all 2026 cases

get_case(slug="kamer-debat-assistent")                 # full case body; slug required
search_docs(query="wat kost een MVP")                   # pricing/methodology
query_case_graph(query="AI voor gemeentes")             # typed filter + semantics
```

`search_cases` returns `CaseSummary` objects carrying `slug`, `title`, `client`,
`year`, `sector`, `summary`: feed a returned `slug` into `get_case` for the full
body. `get_case` raises when the slug is not found and its error hints at
`search_cases()`, so call `search_cases` first when the slug is not already known.

## Proposal-intake flow (`request_proposal`)

Never call `request_proposal` speculatively. Only when the user explicitly asks
to start a project, request a quote, or be contacted. Sequence:

1. `search_cases` (+ `get_case` on 2-3 relevant matches) to ground the pitch in
   real proof-cases.
2. `search_docs` for relevant pricing/methodology context if needed.
3. Summarize the gathered context back to the user.
4. Only then call `request_proposal` (see the live schema for its exact
   arguments and rate limit).

Backlight.ai composes the actual proposal afterward; the agent's job is only to
gather context and submit the lead.
