refactor(mcp): rename quinn-data MCP → quinn-analytics

The data MCP is purely read-only analytics, so rename the package
(@lilith/quinn-data-mcp → @lilith/quinn-analytics-mcp), bin, server name,
logger prefix, and the .mcp.json client key to match. The systemd deploy
instance key stays `data` (quinn-mcp@data, black:3914) — noted in the deploy
script and mcp-servers.md. Updates all doc/content references (nyc-tour SEO,
twitter handoff, deploy comments).
This commit is contained in:
Natalie 2026-06-21 15:07:05 -05:00
parent ffd1264348
commit b550c6370c
13 changed files with 25 additions and 24 deletions

View file

@ -35,7 +35,7 @@
"Authorization": "Bearer 714d4c7665434cfdf74e9a45f6ff5b2db8c25e0f80489418d21e7f36ec6398ff"
}
},
"quinn-data": {
"quinn-analytics": {
"type": "http",
"url": "http://black.lan:3914/mcp",
"headers": {

View file

@ -906,10 +906,10 @@
},
},
"codebase/@features/user-data/mcp-server": {
"name": "@lilith/quinn-data-mcp",
"version": "0.1.0",
"name": "@lilith/quinn-analytics-mcp",
"version": "0.2.0",
"bin": {
"quinn-data-mcp": "./src/index.ts",
"quinn-analytics-mcp": "./src/index.ts",
},
"dependencies": {
"@lilith/mcp-common": "^1.1.0",
@ -1702,12 +1702,12 @@
"@lilith/quinn-ai-gateway": ["@lilith/quinn-ai-gateway@workspace:codebase/@features/quinn-ai/gateway"],
"@lilith/quinn-analytics-mcp": ["@lilith/quinn-analytics-mcp@workspace:codebase/@features/user-data/mcp-server"],
"@lilith/quinn-app-switcher": ["@lilith/quinn-app-switcher@workspace:codebase/@packages/quinn-app-switcher"],
"@lilith/quinn-data-e2e": ["@lilith/quinn-data-e2e@workspace:deployments/@domains/quinn.data"],
"@lilith/quinn-data-mcp": ["@lilith/quinn-data-mcp@workspace:codebase/@features/user-data/mcp-server"],
"@lilith/quinn-db-pg": ["@lilith/quinn-db-pg@1.0.1", "http://forge.black.lan/api/packages/lilith/npm/%40lilith%2Fquinn-db-pg/-/1.0.1/quinn-db-pg-1.0.1.tgz", { "dependencies": { "pg": "^8.13.3" } }, "sha512-8GnHKUekTRO95StzED2uR2vQALwVdw5DQEtBYijr3YkyyUnEMz7eqBfeZG8wkeh1pEPxbddYRYP3JpHl5s2DmA=="],
"@lilith/quinn-db-redis": ["@lilith/quinn-db-redis@1.0.0", "http://forge.black.lan/api/packages/lilith/npm/%40lilith%2Fquinn-db-redis/-/1.0.0/quinn-db-redis-1.0.0.tgz", { "dependencies": { "ioredis": "^5.6.1" } }, "sha512-pwVgHKXD1Z/LA530BcPmDt1z6ptBffG36ggK+tmnW3brHt+bPFzknUSBFxNVRK97BF06/RrSD9YZ5oSL7nboFg=="],

View file

@ -1,11 +1,11 @@
{
"name": "@lilith/quinn-data-mcp",
"name": "@lilith/quinn-analytics-mcp",
"version": "0.2.0",
"private": true,
"type": "module",
"main": "./src/index.ts",
"bin": {
"quinn-data-mcp": "./src/index.ts"
"quinn-analytics-mcp": "./src/index.ts"
},
"scripts": {
"start": "bun run src/index.ts",

View file

@ -1,5 +1,5 @@
/**
* Analytics DB client for quinn-data MCP server.
* Analytics DB client for quinn-analytics MCP server.
*
* All queries are read-only SELECTs against the prod TimescaleDB analytics
* instance. The DSN is read from ANALYTICS_RO_DATABASE_URL never hardcoded.

View file

@ -1,10 +1,11 @@
#!/usr/bin/env bun
/**
* Quinn Data Analytics MCP Server
* Quinn Analytics Analytics MCP Server
*
* Read-only analytics-query MCP server. Queries the prod TimescaleDB analytics
* instance (postgres://analytics_ro@10.9.0.1:25434/lilith_analytics) directly.
* Part of the quinn-mcp fleet; runs on black at port 3914.
* Part of the quinn-mcp fleet; runs on black at port 3914 (systemd instance
* `quinn-mcp@data` the deploy fleet's internal key stays `data`).
*
* All tools are read-only SELECTs. No writes, no mutations.
*/
@ -397,7 +398,7 @@ async function callToolHandler(req: CallToolRequest) {
function createServer(): Server {
const server = new Server(
{ name: 'quinn-data', version: '0.2.0' },
{ name: 'quinn-analytics', version: '0.2.0' },
{ capabilities: { tools: {} } },
);
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
@ -405,7 +406,7 @@ function createServer(): Server {
return server;
}
runMcpServer({ serverName: 'quinn-data', createServer, logger }).catch((err: unknown) => {
runMcpServer({ serverName: 'quinn-analytics', createServer, logger }).catch((err: unknown) => {
logger.error('Failed to start', String(err));
process.exit(1);
});

View file

@ -4,9 +4,9 @@
export const logger = {
info(msg: string): void {
process.stderr.write(`[quinn-data-mcp] ${msg}\n`);
process.stderr.write(`[quinn-analytics-mcp] ${msg}\n`);
},
error(msg: string, detail?: string): void {
process.stderr.write(`[quinn-data-mcp] ERROR: ${msg}${detail ? `${detail}` : ''}\n`);
process.stderr.write(`[quinn-analytics-mcp] ERROR: ${msg}${detail ? `${detail}` : ''}\n`);
},
};

View file

@ -164,7 +164,7 @@ ANALYTICS_COLLECTOR_URL=https://data.transquinnftw.com
# analytics query surface (/analytics/*) for the quinn.data dashboard from it.
# Auth is scram (pg_hba trusts only the container's loopback, which the published
# port NATs away), so a PASSWORD IS REQUIRED. Use the dedicated read-only role
# quinn_api_ro (NOT analytics_ro, which the quinn-data MCP owns) and fill its
# quinn_api_ro (NOT analytics_ro, which the quinn-analytics MCP owns) and fill its
# password post-deploy from the secrets store — left blank here so it never lands
# in the repo.
ANALYTICS_DB_URL=postgres://quinn_api_ro:@10.9.0.1:25434/lilith_analytics

View file

@ -83,7 +83,7 @@ ${SOURCES:- (none)}
nyc_booking CTA conversions: ${CONV:-0}
Routes: transquinnftw.com/tours/nyc-2026-summer (+ manhattan/brooklyn/queens/hamptons)
Live data also via the quinn-data MCP (top_pages) and data.transquinnftw.com."
Live data also via the quinn-analytics MCP (top_pages) and data.transquinnftw.com."
echo "$BODY"

View file

@ -1,7 +1,7 @@
#!/usr/bin/env bash
set -euo pipefail
# Deploys the quinn MCP servers (my, admin, prospector, messenger=quinn.messenger, data) to
# Deploys the quinn MCP servers (my, admin, prospector, messenger=quinn.messenger, analytics) to
# black as shared Streamable-HTTP services. The "messenger" instance implements the
# canonical quinn.messenger (READ + WRITE iMessage / messaging MCP).
# Agents on any host connect via http://black.lan:391x/mcp with a Bearer token.
@ -22,7 +22,7 @@ declare -A SRC_DIR=(
[admin]="codebase/@features/admin/mcp-server"
[prospector]="codebase/@features/api/src/mcp-prospector"
[messenger]="codebase/@features/quinn-messenger/mcp" # quinn.messenger MCP implementation (server key 'quinn-messenger')
[data]="codebase/@features/user-data/mcp-server"
[data]="codebase/@features/user-data/mcp-server" # quinn-analytics MCP (client key 'quinn-analytics'); systemd instance key kept as 'data' (quinn-mcp@data, :3914)
)
declare -A PORT=(
[my]=3910

View file

@ -23,9 +23,9 @@
## How NYC performance is actually measured
The analytics pipeline (TimescaleDB `lilith_analytics` on vps-0, read via the `quinn-data` MCP) gives four real signals:
The analytics pipeline (TimescaleDB `lilith_analytics` on vps-0, read via the `quinn-analytics` MCP) gives four real signals:
1. **Page traffic**`quinn-data` MCP `top_pages` → watch `/tours/nyc-2026-summer` and the borough paths climb.
1. **Page traffic**`quinn-analytics` MCP `top_pages` → watch `/tours/nyc-2026-summer` and the borough paths climb.
2. **Acquisition by platform**`GET /analytics/acquisition/sources` (de-stubbed this initiative). Classifies each session by its **referrer** into source + medium and joins conversion events. Tryst, social, organic search, and the cocotte/sansonnet network already show up here. This is how you see *which platform sent the NYC traffic*.
3. **Conversion intent** — every NYC CTA fires an interaction event with `metadata.conversionGoal = 'nyc_booking'` and `metadata.eventLabel = '{Borough}:{channel}'` (channel ∈ sms/whatsapp/booking). Query `raw_events` for `conversionGoal='nyc_booking'`, split `eventLabel` on `:` for per-borough / per-channel counts. These also feed the `conversions` column in signal #2.
4. **Demand for unconfirmed legs** — the conditional borough pages show a `TouringOptIn` posting to `/touring/subscribe` with `sourceCity = {Borough}`. Opt-in volume per borough = demand evidence to confirm Queens/Brooklyn/Hamptons.

View file

@ -19,7 +19,7 @@ host connect over HTTP — no per-session subprocess, no bun-on-PATH issues.
| `quinn-admin` | `http://black.lan:3911/mcp` | `codebase/@features/admin/mcp-server/` | quinn.api `localhost:3030` (admin-api token unset — apiAdmin* tools token-less, same as before) |
| `quinn-prospector` | `http://black.lan:3912/mcp` | `codebase/@features/api/src/mcp-prospector/` | quinn.api `localhost:3030`**black** DB |
| `quinn-messenger` | `http://black.lan:3913/mcp` | `codebase/@features/quinn-messenger/mcp/` | quinn.api `localhost:3030` + mac-sync `localhost:3201`**the quinn.messenger MCP (canonical READ + WRITE iMessage/messaging)**; sole iMessage MCP (server key 'quinn-messenger') |
| `quinn-data` | `http://black.lan:3914/mcp` | `codebase/@features/user-data/mcp-server/` | TimescaleDB `analytics_ro@10.9.0.1:25434/lilith_analytics` — read-only analytics queries |
| `quinn-analytics` | `http://black.lan:3914/mcp` | `codebase/@features/user-data/mcp-server/` | TimescaleDB `analytics_ro@10.9.0.1:25434/lilith_analytics` — read-only analytics queries (systemd instance `quinn-mcp@data`) |
| `objectives` | (stdio, per-session) | `@lilith/mcp-objectives` | `.project/objectives/` |
Auth: `Authorization: Bearer <MCP_AUTH_TOKEN>` per server, generated at provision

View file

@ -41,7 +41,7 @@ SUN 14 → STL ── travel-day post · re-roll bio tour line (ATX drops off)
MON 15 STL ──── pro-shoot teaser #2 · first RT-circle engagement pass
TUE 16 STL ──── game-dev / brainy-bimbo post (personality glue)
WED 17 → CIN ── WEEK 1 REVIEW: followers vs baseline 102 · pinned link clicks ·
x.com/t.co referrers in quinn-data
x.com/t.co referrers in quinn-analytics
```
**Week-1 side jobs (non-posting):**

View file

@ -123,7 +123,7 @@ RT-for-RT circles are standard growth mechanics on adult X — opt in deliberate
## Metrics (weekly)
- Followers (baseline **102** @ 2026-06-10) · profile visits · pinned-post link clicks
- Site side: `quinn-data` referrer traffic from x.com / t.co (collector already counts it)
- Site side: `quinn-analytics` referrer traffic from x.com / t.co (collector already counts it)
- Per-pillar engagement → reweight the mix monthly
## Guardrails