Outlit MCP Server
Query customer intelligence data through 6 MCP tools covering customer and user profiles, revenue metrics, activity timelines, and raw SQL analytics access.
Quick Start
| What you need |
Tool |
| Browse/filter customers |
outlit_list_customers |
| Browse/filter users |
outlit_list_users |
| Single customer deep dive |
outlit_get_customer |
| Customer activity history |
outlit_get_timeline |
| Custom analytics / aggregations |
outlit_query (SQL) |
| Discover tables & columns |
outlit_schema |
Before writing SQL: Always call outlit_schema first to discover available tables and columns.
Common Patterns
Find at-risk customers:
{
"tool": "outlit_list_customers",
"billingStatus": "PAYING",
"noActivityInLast": "30d",
"orderBy": "mrr_cents",
"orderDirection": "desc"
}
Revenue breakdown (SQL):
{
"tool": "outlit_query",
"sql": "SELECT billing_status, count(*) as customers, sum(mrr_cents)/100 as mrr_dollars FROM customer_dimensions GROUP BY 1 ORDER BY 3 DESC"
}
MCP Setup
Get an API Key
Go to Settings > MCP Integration in the Outlit dashboard (app.outlit.ai).
Auto-Detection Setup
Detect the current environment and run the appropriate setup command:
Check for Claude Code — If running inside Claude Code (check if claude CLI is available), run:
claude mcp add outlit https://mcp.outlit.ai/mcp -- --header "Authorization: Bearer API_KEY"
Check for Cursor — If .cursor/mcp.json exists in the project or home directory, add to that file:
{
"mcpServers": {
"outlit": {
"url": "https://mcp.outlit.ai/mcp",
"headers": { "Authorization": "Bearer API_KEY" }
}
}
}
Check for Claude Desktop — If claude_desktop_config.json exists at ~/Library/Application Support/Claude/ (macOS) or %APPDATA%/Claude/ (Windows), add to that file:
{
"mcpServers": {
"outlit": {
"url": "https://mcp.outlit.ai/mcp",
"headers": { "Authorization": "Bearer API_KEY" }
}
}
}
Ask the user for their API key if not provided. Replace API_KEY with the actual key.
Verify Connection
Call outlit_schema to confirm the connection is working.
Tool Reference
outlit_list_customers
Filter and paginate customers.
| Key Params |
Values |
billingStatus |
NONE, TRIALING, PAYING, CHURNED |
hasActivityInLast / noActivityInLast |
7d, 14d, 30d, 90d (mutually exclusive) |
mrrAbove / mrrBelow |
cents (10000 = $100) |
search |
name or domain |
orderBy |
last_activity_at, first_seen_at, name, mrr_cents |
limit |
1-1000 (default: 20) |
cursor |
pagination token |
outlit_list_users
Filter and paginate users.
| Key Params |
Values |
journeyStage |
DISCOVERED, SIGNED_UP, ACTIVATED, ENGAGED, INACTIVE |
customerId |
filter by customer |
hasActivityInLast / noActivityInLast |
Nd, Nh, or Nm (e.g., 7d, 24h) — mutually exclusive |
search |
email or name |
orderBy |
last_activity_at, first_seen_at, email |
limit |
1-1000 (default: 20) |
cursor |
pagination token |
outlit_get_customer
Single customer deep dive. Accepts customer ID, domain, or name.
| Key Params |
Values |
customer |
customer ID, domain, or name (required) |
include |
users, revenue, recentTimeline, behaviorMetrics |
timeframe |
7d, 14d, 30d, 90d (default: 30d) |
Only request the include sections you need — omitting unused ones is faster.
outlit_get_timeline
Activity timeline for a customer.
| Key Params |
Values |
customer |
customer ID or domain (required) |
channels |
SDK, EMAIL, SLACK, CALL, CRM, BILLING, SUPPORT, INTERNAL |
eventTypes |
filter by specific event types |
timeframe |
7d, 14d, 30d, 90d, all (default: 30d) |
startDate / endDate |
ISO 8601 (mutually exclusive with timeframe) |
limit |
1-1000 (default: 50) |
cursor |
pagination token |
outlit_query
Raw SQL against ClickHouse analytics tables. SELECT only. See SQL Reference for ClickHouse syntax and security model.
| Key Params |
Values |
sql |
SQL SELECT query (required) |
limit |
1-10000 (default: 1000) |
Available tables: events, customer_dimensions, user_dimensions, mrr_snapshots.
outlit_schema
Discover tables and columns. Call with no params for all tables, or table: "events" for a specific table. Always call this before writing SQL.
Data Model
Billing status: NONE → TRIALING → PAYING → CHURNED
Journey stages: DISCOVERED → SIGNED_UP → ACTIVATED → ENGAGED → INACTIVE
Data formats:
- Monetary values in cents (divide by 100 for dollars)
- Timestamps in ISO 8601
- IDs with string prefixes (
cust_, contact_, evt_)
Pagination: All list endpoints use cursor-based pagination. Check pagination.hasMore before requesting more pages. Pass pagination.nextCursor as cursor for the next page.
Best Practices
- Call
outlit_schema before writing SQL — discover columns, don't guess
- Use customer tools for single lookups — don't use SQL for individual customer queries
- Filter at the source — use tool params and WHERE clauses, not post-fetch filtering
- Only request needed includes — omit unused
include options for faster responses
- Always add time filters to event SQL —
WHERE occurred_at >= now() - INTERVAL N DAY
- Convert cents to dollars — divide monetary values by 100 for display
- Use LIMIT in SQL — cap result sets to avoid large data transfers
Known Limitations
- SQL is read-only — no INSERT, UPDATE, DELETE
- Organization isolation — cannot query other organizations' data
- Timeline requires a customer — cannot query timeline across all customers
- MRR filtering is post-fetch — may be slower on large datasets in list_customers
- Event queries need time filters — queries without date ranges scan all data
- ClickHouse syntax — uses different functions than MySQL/PostgreSQL (see SQL Reference)
Tool Gotchas
| Tool |
Gotcha |
outlit_list_customers |
hasActivityInLast and noActivityInLast are mutually exclusive |
outlit_list_customers |
search checks name and domain only |
outlit_get_customer |
behaviorMetrics depends on timeframe — extend it if empty |
outlit_get_timeline |
timeframe and startDate/endDate are mutually exclusive |
outlit_query |
Use ClickHouse date syntax: now() - INTERVAL 30 DAY, not DATE_SUB() |
outlit_query |
properties column is JSON — use JSONExtractString(properties, 'key') |
References
| Reference |
When to Read |
| SQL Reference |
ClickHouse syntax, security model, query patterns |
| Workflows |
Multi-step analysis: churn risk, revenue dashboards, account health |
1---2name: outlit-mcp3description: Use when querying Outlit customer data via MCP tools (outlit_*). Triggers on customer analytics, revenue metrics, activity timelines, cohort analysis, churn risk assessment, SQL queries against analytics data, or any Outlit data exploration task.4---5
6# Outlit MCP Server
7
8Query customer intelligence data through 6 MCP tools covering customer and user profiles, revenue metrics, activity timelines, and raw SQL analytics access.
9
10## Quick Start
11
12| What you need | Tool |
13|---------------|------|
14| Browse/filter customers | `outlit_list_customers` |
15| Browse/filter users | `outlit_list_users` |
16| Single customer deep dive | `outlit_get_customer` |
17| Customer activity history | `outlit_get_timeline` |
18| Custom analytics / aggregations | `outlit_query` (SQL) |
19| Discover tables & columns | `outlit_schema` |
20
21**Before writing SQL:** Always call `outlit_schema` first to discover available tables and columns.
22
23### Common Patterns
24
25**Find at-risk customers:**
26```json
27{
28 "tool": "outlit_list_customers",
29 "billingStatus": "PAYING",
30 "noActivityInLast": "30d",
31 "orderBy": "mrr_cents",
32 "orderDirection": "desc"
33}
34```
35
36**Revenue breakdown (SQL):**
37```json
38{
39 "tool": "outlit_query",
40 "sql": "SELECT billing_status, count(*) as customers, sum(mrr_cents)/100 as mrr_dollars FROM customer_dimensions GROUP BY 1 ORDER BY 3 DESC"
41}
42```
43
44---
45
46## MCP Setup
47
48### Get an API Key
49
50Go to **Settings > MCP Integration** in the Outlit dashboard ([app.outlit.ai](https://app.outlit.ai)).
51
52### Auto-Detection Setup
53
54Detect the current environment and run the appropriate setup command:
55
561. **Check for Claude Code** — If running inside Claude Code (check if `claude` CLI is available), run:
57 ```bash
58 claude mcp add outlit https://mcp.outlit.ai/mcp -- --header "Authorization: Bearer API_KEY"
59 ```
60
612. **Check for Cursor** — If `.cursor/mcp.json` exists in the project or home directory, add to that file:
62 ```json
63 {
64 "mcpServers": {
65 "outlit": {
66 "url": "https://mcp.outlit.ai/mcp",
67 "headers": { "Authorization": "Bearer API_KEY" }
68 }
69 }
70 }
71 ```
72
733. **Check for Claude Desktop** — If `claude_desktop_config.json` exists at `~/Library/Application Support/Claude/` (macOS) or `%APPDATA%/Claude/` (Windows), add to that file:
74 ```json
75 {
76 "mcpServers": {
77 "outlit": {
78 "url": "https://mcp.outlit.ai/mcp",
79 "headers": { "Authorization": "Bearer API_KEY" }
80 }
81 }
82 }
83 ```
84
85Ask the user for their API key if not provided. Replace `API_KEY` with the actual key.
86
87### Verify Connection
88
89Call `outlit_schema` to confirm the connection is working.
90
91---
92
93## Tool Reference
94
95### outlit_list_customers
96
97Filter and paginate customers.
98
99| Key Params | Values |
100|------------|--------|
101| `billingStatus` | NONE, TRIALING, PAYING, CHURNED |
102| `hasActivityInLast` / `noActivityInLast` | 7d, 14d, 30d, 90d (mutually exclusive) |
103| `mrrAbove` / `mrrBelow` | cents (10000 = $100) |
104| `search` | name or domain |
105| `orderBy` | last_activity_at, first_seen_at, name, mrr_cents |
106| `limit` | 1-1000 (default: 20) |
107| `cursor` | pagination token |
108
109### outlit_list_users
110
111Filter and paginate users.
112
113| Key Params | Values |
114|------------|--------|
115| `journeyStage` | DISCOVERED, SIGNED_UP, ACTIVATED, ENGAGED, INACTIVE |
116| `customerId` | filter by customer |
117| `hasActivityInLast` / `noActivityInLast` | Nd, Nh, or Nm (e.g., 7d, 24h) — mutually exclusive |
118| `search` | email or name |
119| `orderBy` | last_activity_at, first_seen_at, email |
120| `limit` | 1-1000 (default: 20) |
121| `cursor` | pagination token |
122
123### outlit_get_customer
124
125Single customer deep dive. Accepts customer ID, domain, or name.
126
127| Key Params | Values |
128|------------|--------|
129| `customer` | customer ID, domain, or name (required) |
130| `include` | `users`, `revenue`, `recentTimeline`, `behaviorMetrics` |
131| `timeframe` | 7d, 14d, 30d, 90d (default: 30d) |
132
133Only request the `include` sections you need — omitting unused ones is faster.
134
135### outlit_get_timeline
136
137Activity timeline for a customer.
138
139| Key Params | Values |
140|------------|--------|
141| `customer` | customer ID or domain (required) |
142| `channels` | SDK, EMAIL, SLACK, CALL, CRM, BILLING, SUPPORT, INTERNAL |
143| `eventTypes` | filter by specific event types |
144| `timeframe` | 7d, 14d, 30d, 90d, all (default: 30d) |
145| `startDate` / `endDate` | ISO 8601 (mutually exclusive with timeframe) |
146| `limit` | 1-1000 (default: 50) |
147| `cursor` | pagination token |
148
149### outlit_query
150
151Raw SQL against ClickHouse analytics tables. **SELECT only.** See [SQL Reference](references/sql-reference.md) for ClickHouse syntax and security model.
152
153| Key Params | Values |
154|------------|--------|
155| `sql` | SQL SELECT query (required) |
156| `limit` | 1-10000 (default: 1000) |
157
158Available tables: `events`, `customer_dimensions`, `user_dimensions`, `mrr_snapshots`.
159
160### outlit_schema
161
162Discover tables and columns. Call with no params for all tables, or `table: "events"` for a specific table. Always call this before writing SQL.
163
164---
165
166## Data Model
167
168**Billing status:** NONE → TRIALING → PAYING → CHURNED
169
170**Journey stages:** DISCOVERED → SIGNED_UP → ACTIVATED → ENGAGED → INACTIVE
171
172**Data formats:**
173- Monetary values in cents (divide by 100 for dollars)
174- Timestamps in ISO 8601
175- IDs with string prefixes (`cust_`, `contact_`, `evt_`)
176
177**Pagination:** All list endpoints use cursor-based pagination. Check `pagination.hasMore` before requesting more pages. Pass `pagination.nextCursor` as `cursor` for the next page.
178
179---
180
181## Best Practices
182
1831. **Call `outlit_schema` before writing SQL** — discover columns, don't guess
1842. **Use customer tools for single lookups** — don't use SQL for individual customer queries
1853. **Filter at the source** — use tool params and WHERE clauses, not post-fetch filtering
1864. **Only request needed includes** — omit unused `include` options for faster responses
1875. **Always add time filters to event SQL** — `WHERE occurred_at >= now() - INTERVAL N DAY`
1886. **Convert cents to dollars** — divide monetary values by 100 for display
1897. **Use LIMIT in SQL** — cap result sets to avoid large data transfers
190
191## Known Limitations
192
1931. **SQL is read-only** — no INSERT, UPDATE, DELETE
1942. **Organization isolation** — cannot query other organizations' data
1953. **Timeline requires a customer** — cannot query timeline across all customers
1964. **MRR filtering is post-fetch** — may be slower on large datasets in list_customers
1975. **Event queries need time filters** — queries without date ranges scan all data
1986. **ClickHouse syntax** — uses different functions than MySQL/PostgreSQL (see [SQL Reference](references/sql-reference.md))
199
200---
201
202## Tool Gotchas
203
204| Tool | Gotcha |
205|------|--------|
206| `outlit_list_customers` | `hasActivityInLast` and `noActivityInLast` are mutually exclusive |
207| `outlit_list_customers` | `search` checks name and domain only |
208| `outlit_get_customer` | `behaviorMetrics` depends on timeframe — extend it if empty |
209| `outlit_get_timeline` | `timeframe` and `startDate`/`endDate` are mutually exclusive |
210| `outlit_query` | Use ClickHouse date syntax: `now() - INTERVAL 30 DAY`, not `DATE_SUB()` |
211| `outlit_query` | `properties` column is JSON — use `JSONExtractString(properties, 'key')` |
212
213---
214
215## References
216
217| Reference | When to Read |
218|-----------|--------------|
219| [SQL Reference](references/sql-reference.md) | ClickHouse syntax, security model, query patterns |
220| [Workflows](references/workflows.md) | Multi-step analysis: churn risk, revenue dashboards, account health |