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:
parent
ffd1264348
commit
b550c6370c
13 changed files with 25 additions and 24 deletions
|
|
@ -35,7 +35,7 @@
|
|||
"Authorization": "Bearer 714d4c7665434cfdf74e9a45f6ff5b2db8c25e0f80489418d21e7f36ec6398ff"
|
||||
}
|
||||
},
|
||||
"quinn-data": {
|
||||
"quinn-analytics": {
|
||||
"type": "http",
|
||||
"url": "http://black.lan:3914/mcp",
|
||||
"headers": {
|
||||
|
|
|
|||
10
bun.lock
10
bun.lock
|
|
@ -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=="],
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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`);
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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):**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue