celavii-mcp 0.1.21 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +122 -22
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1155,10 +1155,11 @@ async function fetchUsage(client) {
|
|
|
1155
1155
|
total_credits_used: Number(usage?.total_credits_used ?? 0),
|
|
1156
1156
|
credits_today: Number(usage?.credits_today ?? 0),
|
|
1157
1157
|
plan: org?.plan ?? null,
|
|
1158
|
-
tier: key?.tier ?? null
|
|
1158
|
+
tier: key?.tier ?? null,
|
|
1159
|
+
allow_overage: Boolean(org?.allow_overage ?? false)
|
|
1159
1160
|
};
|
|
1160
1161
|
} catch {
|
|
1161
|
-
return { total_credits_used: 0, credits_today: 0, plan: null, tier: null };
|
|
1162
|
+
return { total_credits_used: 0, credits_today: 0, plan: null, tier: null, allow_overage: false };
|
|
1162
1163
|
}
|
|
1163
1164
|
}
|
|
1164
1165
|
function formatConfirmation(action, estimatedCredits, usage, dryRunData) {
|
|
@@ -1173,6 +1174,7 @@ function formatConfirmation(action, estimatedCredits, usage, dryRunData) {
|
|
|
1173
1174
|
`Total credits used: ${usage.total_credits_used}`,
|
|
1174
1175
|
...usage.plan ? [`Plan: ${usage.plan}`] : [],
|
|
1175
1176
|
...usage.tier ? [`API tier: ${usage.tier}`] : [],
|
|
1177
|
+
`Overage billing: ${usage.allow_overage ? "enabled" : "disabled"}`,
|
|
1176
1178
|
"",
|
|
1177
1179
|
"\u2500\u2500 Dry-Run Details \u2500\u2500",
|
|
1178
1180
|
JSON.stringify(dryRunData, null, 2),
|
|
@@ -1219,12 +1221,12 @@ function registerEnhanceTools(server, client) {
|
|
|
1219
1221
|
},
|
|
1220
1222
|
async (args) => {
|
|
1221
1223
|
try {
|
|
1222
|
-
const { identifiers, options, confirmed, ...rest } = args;
|
|
1224
|
+
const { identifiers, options, confirmed, authorize_overage, ...rest } = args;
|
|
1223
1225
|
const guard = await creditGuard(
|
|
1224
1226
|
client,
|
|
1225
1227
|
confirmed,
|
|
1226
1228
|
// Only bypass when explicitly confirmed, NOT for dry_run
|
|
1227
|
-
() => client.post("/enhance/profiles", { profiles: identifiers, ...rest, dry_run: true }),
|
|
1229
|
+
() => client.post("/enhance/profiles", { profiles: identifiers, ...rest, authorize_overage, dry_run: true }),
|
|
1228
1230
|
`Enhance ${identifiers.length} profile${identifiers.length !== 1 ? "s" : ""}`
|
|
1229
1231
|
);
|
|
1230
1232
|
if (rest.dry_run) {
|
|
@@ -1234,7 +1236,7 @@ function registerEnhanceTools(server, client) {
|
|
|
1234
1236
|
if (!guard.proceed) {
|
|
1235
1237
|
return { content: [{ type: "text", text: guard.message || "Confirmation required" }] };
|
|
1236
1238
|
}
|
|
1237
|
-
const result = await client.post("/enhance/profiles", { profiles: identifiers, ...rest });
|
|
1239
|
+
const result = await client.post("/enhance/profiles", { profiles: identifiers, ...rest, authorize_overage });
|
|
1238
1240
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
1239
1241
|
} catch (err) {
|
|
1240
1242
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -1272,12 +1274,12 @@ function registerEnhanceTools(server, client) {
|
|
|
1272
1274
|
},
|
|
1273
1275
|
async (args) => {
|
|
1274
1276
|
try {
|
|
1275
|
-
const { confirmed, ...rest } = args;
|
|
1277
|
+
const { confirmed, authorize_overage, ...rest } = args;
|
|
1276
1278
|
const guard = await creditGuard(
|
|
1277
1279
|
client,
|
|
1278
1280
|
confirmed,
|
|
1279
1281
|
// Only bypass when explicitly confirmed, NOT for dry_run
|
|
1280
|
-
() => client.post("/enhance/bulk", { ...rest, dry_run: true }),
|
|
1282
|
+
() => client.post("/enhance/bulk", { ...rest, authorize_overage, dry_run: true }),
|
|
1281
1283
|
`Bulk enhance from ${rest.source.type} source`
|
|
1282
1284
|
);
|
|
1283
1285
|
if (rest.dry_run) {
|
|
@@ -1287,7 +1289,7 @@ function registerEnhanceTools(server, client) {
|
|
|
1287
1289
|
if (!guard.proceed) {
|
|
1288
1290
|
return { content: [{ type: "text", text: guard.message || "Confirmation required" }] };
|
|
1289
1291
|
}
|
|
1290
|
-
const result = await client.post("/enhance/bulk", rest);
|
|
1292
|
+
const result = await client.post("/enhance/bulk", { ...rest, authorize_overage });
|
|
1291
1293
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
1292
1294
|
} catch (err) {
|
|
1293
1295
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -1589,13 +1591,78 @@ function registerRefineTools(server, client) {
|
|
|
1589
1591
|
);
|
|
1590
1592
|
}
|
|
1591
1593
|
|
|
1594
|
+
// src/tools/jobs.ts
|
|
1595
|
+
import { z as z12 } from "zod";
|
|
1596
|
+
function registerJobsTools(server, client) {
|
|
1597
|
+
server.registerTool(
|
|
1598
|
+
"get_job_coverage",
|
|
1599
|
+
{
|
|
1600
|
+
title: "Get Job Coverage",
|
|
1601
|
+
description: "Get aggregate job coverage stats for a list or campaign \u2014 shows how many profiles have been enhanced, refined, or scraped (followers/following) and how many are pending or not started. Provide a list_id or campaign_id. Optionally filter by job_type or platform. Costs 0 credits.",
|
|
1602
|
+
inputSchema: z12.object({
|
|
1603
|
+
list_id: z12.string().optional().describe("List UUID \u2014 get coverage for all members of this list"),
|
|
1604
|
+
campaign_id: z12.string().optional().describe("Campaign UUID \u2014 get coverage for all creators in this campaign"),
|
|
1605
|
+
job_type: z12.enum(["enhance", "refine", "followers_scrape", "following_scrape"]).optional().describe("Filter to a single job type (default: all)"),
|
|
1606
|
+
platform: z12.enum(["instagram", "tiktok"]).optional().describe("Filter by platform (default: all)"),
|
|
1607
|
+
tags: z12.array(z12.string()).optional().describe("Filter by tags (reserved for future use)")
|
|
1608
|
+
})
|
|
1609
|
+
},
|
|
1610
|
+
async (args) => {
|
|
1611
|
+
const params = new URLSearchParams();
|
|
1612
|
+
if (args.list_id) params.set("list_id", args.list_id);
|
|
1613
|
+
if (args.campaign_id) params.set("campaign_id", args.campaign_id);
|
|
1614
|
+
if (args.job_type) params.set("job_type", args.job_type);
|
|
1615
|
+
if (args.platform) params.set("platform", args.platform);
|
|
1616
|
+
if (args.tags?.length) params.set("tags", args.tags.join(","));
|
|
1617
|
+
const result = await client.get(`/jobs/coverage?${params}`);
|
|
1618
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
1619
|
+
}
|
|
1620
|
+
);
|
|
1621
|
+
server.registerTool(
|
|
1622
|
+
"list_jobs",
|
|
1623
|
+
{
|
|
1624
|
+
title: "List Jobs",
|
|
1625
|
+
description: "List all jobs for the organization \u2014 enhancement, refinement, and scrape jobs. Returns a unified view sorted by most recent. Filter by type and/or status. Costs 0 credits.",
|
|
1626
|
+
inputSchema: z12.object({
|
|
1627
|
+
type: z12.enum(["enhance", "refine", "followers_scrape", "following_scrape"]).optional().describe("Filter by job type (default: all)"),
|
|
1628
|
+
status: z12.string().optional().describe("Filter by status (e.g. 'completed', 'failed', 'processing', 'pending', 'queued')"),
|
|
1629
|
+
limit: z12.number().int().min(1).max(100).optional().describe("Results per page (default 25, max 100)"),
|
|
1630
|
+
cursor: z12.string().optional().describe("Pagination cursor")
|
|
1631
|
+
})
|
|
1632
|
+
},
|
|
1633
|
+
async (args) => {
|
|
1634
|
+
const params = new URLSearchParams();
|
|
1635
|
+
if (args.type) params.set("type", args.type);
|
|
1636
|
+
if (args.status) params.set("status", args.status);
|
|
1637
|
+
if (args.limit !== void 0) params.set("limit", String(args.limit));
|
|
1638
|
+
if (args.cursor) params.set("cursor", args.cursor);
|
|
1639
|
+
const qs = params.toString();
|
|
1640
|
+
const result = await client.get(`/jobs${qs ? `?${qs}` : ""}`);
|
|
1641
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
1642
|
+
}
|
|
1643
|
+
);
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1592
1646
|
// src/server.ts
|
|
1647
|
+
var TOOL_GROUPS = [
|
|
1648
|
+
"profiles",
|
|
1649
|
+
"campaigns",
|
|
1650
|
+
"lists",
|
|
1651
|
+
"analytics",
|
|
1652
|
+
"content",
|
|
1653
|
+
"manage",
|
|
1654
|
+
"knowledge",
|
|
1655
|
+
"enhance",
|
|
1656
|
+
"scrape",
|
|
1657
|
+
"refine",
|
|
1658
|
+
"jobs"
|
|
1659
|
+
];
|
|
1593
1660
|
function createServer(options) {
|
|
1594
|
-
const { apiKey, baseUrl } = options;
|
|
1661
|
+
const { apiKey, baseUrl, tools } = options;
|
|
1595
1662
|
const server = new McpServer(
|
|
1596
1663
|
{
|
|
1597
1664
|
name: "celavii",
|
|
1598
|
-
version: "0.1.
|
|
1665
|
+
version: "0.1.22"
|
|
1599
1666
|
},
|
|
1600
1667
|
{
|
|
1601
1668
|
capabilities: {
|
|
@@ -1604,31 +1671,64 @@ function createServer(options) {
|
|
|
1604
1671
|
}
|
|
1605
1672
|
);
|
|
1606
1673
|
const client = new CelaviiClient(apiKey, baseUrl);
|
|
1674
|
+
const enabled = tools && tools.length > 0 ? new Set(tools) : null;
|
|
1675
|
+
const registrars = {
|
|
1676
|
+
profiles: registerProfileTools,
|
|
1677
|
+
campaigns: registerCampaignTools,
|
|
1678
|
+
lists: registerListTools,
|
|
1679
|
+
analytics: registerAnalyticsTools,
|
|
1680
|
+
content: registerContentTools,
|
|
1681
|
+
manage: registerManageTools,
|
|
1682
|
+
knowledge: registerKnowledgeTools,
|
|
1683
|
+
enhance: registerEnhanceTools,
|
|
1684
|
+
scrape: registerScrapeTools,
|
|
1685
|
+
refine: registerRefineTools,
|
|
1686
|
+
jobs: registerJobsTools
|
|
1687
|
+
};
|
|
1607
1688
|
registerMetaTools(server, client);
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
registerManageTools(server, client);
|
|
1614
|
-
registerKnowledgeTools(server, client);
|
|
1615
|
-
registerEnhanceTools(server, client);
|
|
1616
|
-
registerScrapeTools(server, client);
|
|
1617
|
-
registerRefineTools(server, client);
|
|
1689
|
+
for (const [group, register] of Object.entries(registrars)) {
|
|
1690
|
+
if (!enabled || enabled.has(group)) {
|
|
1691
|
+
register(server, client);
|
|
1692
|
+
}
|
|
1693
|
+
}
|
|
1618
1694
|
return server;
|
|
1619
1695
|
}
|
|
1620
1696
|
|
|
1621
1697
|
// src/index.ts
|
|
1698
|
+
function parseToolGroups(env) {
|
|
1699
|
+
if (!env) return void 0;
|
|
1700
|
+
const requested = env.split(",").map((s) => s.trim().toLowerCase());
|
|
1701
|
+
const valid = requested.filter(
|
|
1702
|
+
(g) => TOOL_GROUPS.includes(g)
|
|
1703
|
+
);
|
|
1704
|
+
const invalid = requested.filter((g) => !TOOL_GROUPS.includes(g));
|
|
1705
|
+
if (invalid.length) {
|
|
1706
|
+
console.error(
|
|
1707
|
+
`Warning: Unknown tool groups ignored: ${invalid.join(", ")}
|
|
1708
|
+
Valid groups: ${TOOL_GROUPS.join(", ")}`
|
|
1709
|
+
);
|
|
1710
|
+
}
|
|
1711
|
+
return valid.length > 0 ? valid : void 0;
|
|
1712
|
+
}
|
|
1622
1713
|
async function main() {
|
|
1623
1714
|
const apiKey = process.env.CELAVII_API_KEY;
|
|
1624
1715
|
if (!apiKey) {
|
|
1625
1716
|
console.error(
|
|
1626
|
-
|
|
1717
|
+
`Error: CELAVII_API_KEY environment variable is required.
|
|
1718
|
+
Get your API key at https://www.celavii.com/settings/api-keys
|
|
1719
|
+
|
|
1720
|
+
Usage:
|
|
1721
|
+
CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp
|
|
1722
|
+
|
|
1723
|
+
Optional: Load specific tool groups only:
|
|
1724
|
+
CELAVII_TOOLS=profiles,analytics,campaigns
|
|
1725
|
+
Available groups: ${TOOL_GROUPS.join(", ")}`
|
|
1627
1726
|
);
|
|
1628
1727
|
process.exit(1);
|
|
1629
1728
|
}
|
|
1630
1729
|
const baseUrl = process.env.CELAVII_BASE_URL || void 0;
|
|
1631
|
-
const
|
|
1730
|
+
const tools = parseToolGroups(process.env.CELAVII_TOOLS);
|
|
1731
|
+
const server = createServer({ apiKey, baseUrl, tools });
|
|
1632
1732
|
const transport = new StdioServerTransport();
|
|
1633
1733
|
await server.connect(transport);
|
|
1634
1734
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/client.ts","../src/tools/meta.ts","../src/tools/profiles.ts","../src/tools/campaigns.ts","../src/tools/lists.ts","../src/tools/analytics.ts","../src/tools/content.ts","../src/tools/manage.ts","../src/tools/knowledge.ts","../src/tools/enhance.ts","../src/tools/credit-guard.ts","../src/tools/scrape.ts","../src/tools/refine.ts"],"sourcesContent":["/**\n * Celavii MCP Server — stdio Entry Point\n *\n * Usage:\n * CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp\n *\n * Or in MCP config:\n * {\n * \"mcpServers\": {\n * \"celavii\": {\n * \"command\": \"npx\",\n * \"args\": [\"-y\", \"celavii-mcp@latest\"],\n * \"env\": { \"CELAVII_API_KEY\": \"cvii_live_xxx\" }\n * }\n * }\n * }\n */\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { createServer } from './server.js'\n\nasync function main() {\n const apiKey = process.env.CELAVII_API_KEY\n if (!apiKey) {\n console.error(\n 'Error: CELAVII_API_KEY environment variable is required.\\n' +\n 'Get your API key at https://www.celavii.com/settings/api-keys\\n' +\n '\\nUsage:\\n' +\n ' CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp',\n )\n process.exit(1)\n }\n\n const baseUrl = process.env.CELAVII_BASE_URL || undefined\n\n const server = createServer({ apiKey, baseUrl })\n const transport = new StdioServerTransport()\n\n await server.connect(transport)\n}\n\nmain().catch((err) => {\n console.error('Fatal error:', err)\n process.exit(1)\n})\n","/**\n * Celavii MCP Server — Server Setup & Tool Registration\n *\n * Creates an McpServer instance and registers all tools organized by category.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { CelaviiClient, CelaviiApiError } from './client.js'\nimport { registerMetaTools } from './tools/meta.js'\nimport { registerProfileTools } from './tools/profiles.js'\nimport { registerCampaignTools } from './tools/campaigns.js'\nimport { registerListTools } from './tools/lists.js'\nimport { registerAnalyticsTools } from './tools/analytics.js'\nimport { registerContentTools } from './tools/content.js'\nimport { registerManageTools } from './tools/manage.js'\nimport { registerKnowledgeTools } from './tools/knowledge.js'\nimport { registerEnhanceTools } from './tools/enhance.js'\nimport { registerScrapeTools } from './tools/scrape.js'\nimport { registerRefineTools } from './tools/refine.js'\n\nexport interface CreateServerOptions {\n apiKey: string\n baseUrl?: string\n}\n\nexport function createServer(options: CreateServerOptions): McpServer {\n const { apiKey, baseUrl } = options\n\n const server = new McpServer(\n {\n name: 'celavii',\n version: '0.1.0',\n },\n {\n capabilities: {\n logging: {},\n },\n },\n )\n\n const client = new CelaviiClient(apiKey, baseUrl)\n\n // Register all tool groups\n registerMetaTools(server, client)\n registerProfileTools(server, client)\n registerCampaignTools(server, client)\n registerListTools(server, client)\n registerAnalyticsTools(server, client)\n registerContentTools(server, client)\n registerManageTools(server, client)\n registerKnowledgeTools(server, client)\n registerEnhanceTools(server, client)\n registerScrapeTools(server, client)\n registerRefineTools(server, client)\n\n return server\n}\n\nexport { CelaviiClient, CelaviiApiError }\n","/**\n * Celavii MCP Server — HTTP Client\n *\n * Thin wrapper around fetch that adds Bearer auth, error handling,\n * and structured error responses for MCP tool handlers.\n */\n\nconst DEFAULT_BASE_URL = 'https://www.celavii.com/api/v1'\n\nexport class CelaviiApiError extends Error {\n constructor(\n message: string,\n public code: string,\n public status: number,\n public retryAfter?: number,\n ) {\n super(message)\n this.name = 'CelaviiApiError'\n }\n}\n\nexport class CelaviiClient {\n private baseUrl: string\n private apiKey: string\n\n constructor(apiKey: string, baseUrl?: string) {\n this.apiKey = apiKey\n this.baseUrl = (baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, '')\n }\n\n private async request(path: string, init?: RequestInit): Promise<unknown> {\n const url = `${this.baseUrl}${path}`\n const res = await fetch(url, {\n ...init,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'celavii-mcp/0.1.0',\n ...init?.headers,\n },\n })\n\n let json: unknown\n try {\n json = await res.json()\n } catch {\n throw new CelaviiApiError(\n `HTTP ${res.status}: Failed to parse response`,\n 'INTERNAL_ERROR',\n res.status,\n )\n }\n\n if (!res.ok) {\n const err = json as { error?: { code?: string; message?: string; retry_after?: number } }\n const msg = err?.error?.message || `HTTP ${res.status}`\n const code = err?.error?.code || 'INTERNAL_ERROR'\n throw new CelaviiApiError(msg, code, res.status, err?.error?.retry_after)\n }\n\n return json\n }\n\n async get(path: string): Promise<unknown> {\n return this.request(path)\n }\n\n async post(path: string, body?: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'POST',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n\n async patch(path: string, body: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'PATCH',\n body: JSON.stringify(body),\n })\n }\n\n async put(path: string, body: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'PUT',\n body: JSON.stringify(body),\n })\n }\n\n async delete(path: string, body?: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'DELETE',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n}\n","/**\n * Meta tools — Account info and usage\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerMetaTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_account_info',\n {\n title: 'Get Account Info',\n description:\n 'Get information about the current API key, organization, and usage summary. ' +\n 'Useful to verify API key is working and see available scopes. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/me')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_usage',\n {\n title: 'Get Usage',\n description:\n 'Get credit usage and rate limit status for the current API key. ' +\n 'Shows total requests, credits used, daily breakdown, and rate limit info. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/usage')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Profile tools — Search, details, affinities, posts, network, bulk\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerProfileTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'search_profiles',\n {\n title: 'Search Profiles',\n description:\n 'Search the Celavii creator database. Filter by query text, niche, location, gender, ' +\n 'follower count. Returns matching Instagram profiles with basic stats. ' +\n 'At least one filter is required. Costs 1 credit.',\n inputSchema: z.object({\n query: z.string().optional().describe('Search query — matches username, display name, or bio keywords'),\n niche: z.string().optional().describe(\"Filter by niche/topic (e.g. 'fitness', 'fashion', 'tech')\"),\n location: z.string().optional().describe(\"Filter by location (e.g. 'Miami', 'Los Angeles, California')\"),\n gender: z.enum(['male', 'female', 'non_binary', 'brand']).optional().describe('Filter by gender'),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n has_contact: z.boolean().optional().describe('Only return profiles with email or phone'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor from a previous response'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.query) params.set('query', args.query)\n if (args.niche) params.set('niche', args.niche)\n if (args.location) params.set('location', args.location)\n if (args.gender) params.set('gender', args.gender)\n if (args.min_followers !== undefined) params.set('min_followers', String(args.min_followers))\n if (args.max_followers !== undefined) params.set('max_followers', String(args.max_followers))\n if (args.has_contact) params.set('has_contact', 'true')\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/profiles/search?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'search_profiles_by_affinities',\n {\n title: 'Search Profiles by Affinities',\n description:\n 'Search creators by their AI-analyzed brand or topic affinities. ' +\n 'Find creators who have affinity for specific brands, interests, or topics. Costs 1 credit.',\n inputSchema: z.object({\n affinities: z.array(z.string()).describe(\"Affinity terms to search for (e.g. ['Nike', 'fitness', 'running'])\"),\n match_mode: z.enum(['any', 'all']).optional().describe(\"'any' = match any affinity, 'all' = must match all (default: 'any')\"),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor from a previous response'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('terms', args.affinities.join(','))\n if (args.match_mode) params.set('match_mode', args.match_mode)\n if (args.min_followers !== undefined) params.set('min_followers', String(args.min_followers))\n if (args.max_followers !== undefined) params.set('max_followers', String(args.max_followers))\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/profiles/search/affinities?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profiles_bulk',\n {\n title: 'Get Profiles Bulk',\n description:\n 'Get detailed information for multiple profiles at once by username or profile ID. ' +\n 'Up to 100 profiles per request. Costs 1 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs (max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/profiles/bulk', { profiles: args.identifiers })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile',\n {\n title: 'Get Profile',\n description:\n 'Get detailed information about a single Instagram profile by username or profile ID. ' +\n 'Returns bio, stats, niche, location, job_status (enhance/refine/scrape progress), and more. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username (without @) or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_affinities',\n {\n title: 'Get Profile Affinities',\n description:\n 'Get AI-analyzed brand and topic affinities for a profile. ' +\n 'Shows what brands, interests, and topics a creator is associated with. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/affinities`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_posts',\n {\n title: 'Get Profile Posts',\n description:\n 'Get recent posts for a profile. Returns post content, engagement metrics, ' +\n 'media URLs, and hashtags. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of posts (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/posts${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_network',\n {\n title: 'Get Profile Network',\n description:\n 'Get the social network graph for a profile — mutual connections, ' +\n 'top followers, and following relationships. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/network`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_followers',\n {\n title: 'Get Profile Followers',\n description:\n 'Get the followers list for a profile. Only available if followers have been scraped. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of followers (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/followers${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_following',\n {\n title: 'Get Profile Following',\n description:\n 'Get the accounts a profile is following. Only available if following data has been scraped. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of following (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/following${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_social_links',\n {\n title: 'Get Profile Social Links',\n description:\n 'Get external social media links found in a profile bio (YouTube, TikTok, Twitter, etc.). Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/social-links`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_contact',\n {\n title: 'Get Profile Contact',\n description:\n 'Get contact information (email, phone) for a profile. ' +\n 'Requires the profiles:contact scope. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/contact`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n // ============================================================================\n // Semantic Search Tools (Phase 3 Embeddings)\n // ============================================================================\n\n server.registerTool(\n 'find_similar_profiles',\n {\n title: 'Find Similar Profiles',\n description:\n 'Find profiles semantically similar to a seed profile using AI embeddings. ' +\n 'Uses vector similarity to find creators with similar content, topics, and style. ' +\n 'More powerful than keyword matching — finds conceptually related profiles. Costs 1 credit.',\n inputSchema: z.object({\n profile_id: z.string().describe('Seed profile ID (e.g., ig:123456789) to find similar profiles for'),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n platforms: z.array(z.enum(['instagram', 'tiktok'])).optional().describe('Filter by platforms'),\n limit: z.number().int().min(1).max(100).optional().describe('Results to return (default 20, max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/profiles/search/similar', {\n profile_id: args.profile_id,\n min_followers: args.min_followers,\n max_followers: args.max_followers,\n platforms: args.platforms,\n limit: args.limit,\n })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'find_similar_to_cohort',\n {\n title: 'Find Similar to Cohort',\n description:\n 'Find profiles similar to a GROUP of seed profiles. ' +\n 'Computes a centroid embedding from multiple profiles and finds similar creators. ' +\n 'Use case: \"Find creators like these 5 influencers I already work with\". Costs 1 credit.',\n inputSchema: z.object({\n profile_ids: z.array(z.string()).describe('Array of seed profile IDs (e.g., [\"ig:123\", \"ig:456\"])'),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n platforms: z.array(z.enum(['instagram', 'tiktok'])).optional().describe('Filter by platforms'),\n exclude_seeds: z.boolean().optional().describe('Exclude seed profiles from results (default true)'),\n limit: z.number().int().min(1).max(100).optional().describe('Results to return (default 20, max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/profiles/search/similar/cohort', {\n profile_ids: args.profile_ids,\n min_followers: args.min_followers,\n max_followers: args.max_followers,\n platforms: args.platforms,\n exclude_seeds: args.exclude_seeds,\n limit: args.limit,\n })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Campaign tools — List, metrics, creators, content\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerCampaignTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_campaigns',\n {\n title: 'List Campaigns',\n description:\n 'List all campaigns in the organization. Optionally filter by status. Costs 0 credits.',\n inputSchema: z.object({\n status: z.enum(['active', 'draft', 'completed', 'archived']).optional().describe('Filter by campaign status'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of campaigns (default 25, max 100)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.status) params.set('status', args.status)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const qs = params.toString()\n const result = await client.get(`/campaigns${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_metrics',\n {\n title: 'Get Campaign Metrics',\n description:\n 'Get performance metrics for a specific campaign — total creators, posts, ' +\n 'engagement, reach, and more. Costs 0 credits.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/metrics`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_creators',\n {\n title: 'Get Campaign Creators',\n description:\n 'Get the list of creators assigned to a campaign with their statuses and metrics. Costs 0 credits.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/creators${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_content',\n {\n title: 'Get Campaign Content',\n description:\n 'Get content (posts) associated with a campaign. Includes engagement data ' +\n 'and media. Costs 1 credit.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/content${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * List tools — CRUD + member management\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerListTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_lists',\n {\n title: 'List Lists',\n description: 'Get all creator lists in the organization. Costs 0 credits.',\n inputSchema: z.object({\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/lists${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_list',\n {\n title: 'Create List',\n description: 'Create a new creator list. Costs 1 credit.',\n inputSchema: z.object({\n name: z.string().describe('Name of the list'),\n description: z.string().optional().describe('Optional description'),\n }),\n },\n async (args) => {\n const result = await client.post('/lists', { name: args.name, description: args.description })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_list',\n {\n title: 'Get List',\n description: 'Get details for a specific list by ID. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/lists/${encodeURIComponent(args.list_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'update_list',\n {\n title: 'Update List',\n description: 'Update a list name or description. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n name: z.string().optional().describe('New name'),\n description: z.string().optional().describe('New description'),\n }),\n },\n async (args) => {\n const { list_id, ...body } = args\n const result = await client.patch(`/lists/${encodeURIComponent(list_id)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_list',\n {\n title: 'Delete List',\n description: 'Delete a list. This does not delete the creators in the list. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/lists/${encodeURIComponent(args.list_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_list_members',\n {\n title: 'Get List Members',\n description: 'Get the creator profiles in a list with optional filtering. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n limit: z.number().int().min(1).max(200).optional().describe('Results per page (default 25, max 200)'),\n offset: z.number().int().min(0).optional().describe('Number of results to skip (default 0). Use the offset from the previous response to paginate.'),\n min_followers: z.number().int().optional().describe('Minimum follower count filter'),\n max_followers: z.number().int().optional().describe('Maximum follower count filter'),\n added_after: z.string().optional().describe('Only profiles added after this date (ISO 8601, e.g. 2025-01-01)'),\n enhanced_after: z.string().optional().describe('Only profiles enhanced after this date (ISO 8601)'),\n platform: z.enum(['instagram', 'tiktok']).optional().describe('Filter by platform'),\n has_enhancement: z.boolean().optional().describe('Filter by completed enhancement (true = has, false = missing)'),\n has_refinement: z.boolean().optional().describe('Filter by completed refinement (true = has, false = missing)'),\n has_followers_scrape: z.boolean().optional().describe('Filter by completed followers scrape (true = has, false = missing)'),\n has_following_scrape: z.boolean().optional().describe('Filter by completed following scrape (true = has, false = missing)'),\n tags: z.array(z.string()).optional().describe('Filter by tags — profiles with ANY of these tags'),\n relationship_status: z.string().optional().describe(\"Filter by CRM status (e.g., 'shortlisted', 'outreached', 'negotiating', 'contracted')\"),\n has_notes: z.boolean().optional().describe('Filter by whether profile has notes (true = has notes, false = no notes)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.offset !== undefined) params.set('offset', String(args.offset))\n if (args.min_followers !== undefined) params.set('min_followers', String(args.min_followers))\n if (args.max_followers !== undefined) params.set('max_followers', String(args.max_followers))\n if (args.added_after) params.set('added_after', args.added_after)\n if (args.enhanced_after) params.set('enhanced_after', args.enhanced_after)\n if (args.platform) params.set('platform', args.platform)\n if (args.has_enhancement !== undefined) params.set('has_enhancement', String(args.has_enhancement))\n if (args.has_refinement !== undefined) params.set('has_refinement', String(args.has_refinement))\n if (args.has_followers_scrape !== undefined) params.set('has_followers_scrape', String(args.has_followers_scrape))\n if (args.has_following_scrape !== undefined) params.set('has_following_scrape', String(args.has_following_scrape))\n if (args.tags && args.tags.length > 0) params.set('tags', args.tags.join(','))\n if (args.relationship_status) params.set('relationship_status', args.relationship_status)\n if (args.has_notes !== undefined) params.set('has_notes', String(args.has_notes))\n const qs = params.toString()\n const result = await client.get(`/lists/${encodeURIComponent(args.list_id)}/members${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'add_list_members',\n {\n title: 'Add List Members',\n description: 'Add creators to a list by username or profile ID. Costs 1 credit.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to add'),\n }),\n },\n async (args) => {\n const result = await client.post(\n `/lists/${encodeURIComponent(args.list_id)}/members`,\n { profiles: args.identifiers },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'remove_list_members',\n {\n title: 'Remove List Members',\n description: 'Remove creators from a list. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to remove'),\n }),\n },\n async (args) => {\n const result = await client.delete(\n `/lists/${encodeURIComponent(args.list_id)}/members`,\n { profiles: args.identifiers },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Analytics tools — Demographics, locations, niches, overlap, cohort\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\n/** Schema for endpoints that accept profile_ids + scope (demographics) */\nconst demographicsSchema = z.object({\n profile_ids: z.array(z.string()).optional().describe('Array of usernames or profile IDs to analyze'),\n scope: z.enum(['global', 'org']).optional().describe(\"'global' (default, all profiles) or 'org' (managed only)\"),\n})\n\n/** Schema for endpoints that accept scope + limit only (locations, niches) */\nconst orgLevelSchema = z.object({\n scope: z.enum(['global', 'org']).optional().describe(\"'global' (default, all profiles) or 'org' (managed only)\"),\n limit: z.number().int().min(1).max(100).optional().describe('Max results (default 20, max 100)'),\n})\n\n/** Schema for profile source parameters used by overlap, shared-hashtags, cohort */\nconst profileSourceSchema = z.object({\n identifiers: z.array(z.string()).optional().describe('Array of usernames or profile IDs to analyze'),\n list_id: z.string().optional().describe('List UUID — analyze all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — analyze all creators in this campaign'),\n})\n\n\nexport function registerAnalyticsTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_demographics',\n {\n title: 'Get Demographics',\n description:\n 'Get audience demographics breakdown (age, gender distribution). ' +\n 'Optionally pass profile_ids to analyze a subset, or scope=org for managed profiles only. Costs 1 credit.',\n inputSchema: demographicsSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.profile_ids?.length) params.set('profile_ids', args.profile_ids.join(','))\n if (args.scope) params.set('scope', args.scope)\n const result = await client.get(`/analytics/demographics?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_locations',\n {\n title: 'Get Locations',\n description:\n 'Get location distribution — top cities and countries. ' +\n 'Use scope=org for managed profiles only. Costs 1 credit.',\n inputSchema: orgLevelSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.scope) params.set('scope', args.scope)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/analytics/locations?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_niches',\n {\n title: 'Get Niches',\n description:\n 'Get niche/topic distribution across profiles. ' +\n 'Use scope=org for managed profiles only. Costs 1 credit.',\n inputSchema: orgLevelSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.scope) params.set('scope', args.scope)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/analytics/niches?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_network_overlap',\n {\n title: 'Get Network Overlap',\n description:\n 'Get follower/following overlap between profiles. Shows shared connections. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.identifiers?.length) params.set('profile_ids', args.identifiers.join(','))\n if (args.list_id) params.set('list_id', args.list_id)\n if (args.campaign_id) params.set('campaign_id', args.campaign_id)\n const result = await client.get(`/analytics/network-overlap?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_shared_hashtags',\n {\n title: 'Get Shared Hashtags',\n description:\n 'Get hashtags shared across a set of profiles. Shows common themes and topics. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.identifiers?.length) params.set('usernames', args.identifiers.join(','))\n if (args.list_id) params.set('list_id', args.list_id)\n if (args.campaign_id) params.set('campaign_id', args.campaign_id)\n const result = await client.get(`/analytics/shared-hashtags?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_hashtag_creators',\n {\n title: 'Get Hashtag Creators',\n description:\n 'Find creators who use specific hashtags. Useful for discovering creators by topic. Costs 1 credit.',\n inputSchema: z.object({\n hashtags: z.array(z.string()).describe(\"Hashtags to search for (without #, e.g. ['fitness', 'gym'])\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('hashtags', args.hashtags.join(','))\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/analytics/hashtag-creators?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_affinity_posts',\n {\n title: 'Get Affinity Posts',\n description:\n 'Get posts linked to a brand/topic affinity term. Searches globally across all profiles. Costs 1 credit.',\n inputSchema: z.object({\n affinity: z.string().describe('Affinity term to search for (e.g. \"photography\", \"Nike\", \"fitness\")'),\n affinity_type: z.enum(['all', 'topic', 'brand', 'location', 'category']).optional().describe(\"Filter by affinity type (default: 'all')\"),\n min_engagement: z.number().int().optional().describe('Minimum total engagement'),\n sort: z.enum(['engagement', 'date']).optional().describe(\"Sort order (default: 'engagement')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('affinity', args.affinity)\n if (args.affinity_type) params.set('affinity_type', args.affinity_type)\n if (args.min_engagement !== undefined) params.set('min_engagement', String(args.min_engagement))\n if (args.sort) params.set('sort', args.sort)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/analytics/affinity-posts?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'analyze_cohort',\n {\n title: 'Analyze Cohort',\n description:\n 'Run a full cohort analysis on a set of profiles. Includes demographics, affinities, ' +\n 'hashtag usage, and aggregate stats. Costs 2 credits.',\n inputSchema: z.object({\n profiles: z.array(z.string()).optional().describe('Array of usernames or profile IDs'),\n source: z.object({\n type: z.enum(['followers', 'following']).describe(\"Source type: 'followers' or 'following'\"),\n target: z.string().describe('Username or ig:ID of the seed profile'),\n limit: z.number().int().optional().describe('Max profiles to resolve from network (default 500, max 10000)'),\n }).optional().describe('Alternative: analyze followers/following of a profile'),\n list_id: z.string().optional().describe('List UUID — analyze all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — analyze all creators in this campaign'),\n include: z.array(z.string()).optional().describe(\"Data to include: ['affinities', 'demographics', 'locations', 'niches', 'engagement_stats', 'hashtags', 'account_stats']\"),\n }),\n },\n async (args) => {\n const result = await client.post('/analytics/cohort', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_cohort_stats',\n {\n title: 'Get Cohort Stats',\n description:\n 'Get aggregate statistics for a cohort — average followers, engagement rate, etc. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.identifiers?.length) params.set('profiles', args.identifiers.join(','))\n if (args.list_id) params.set('list_id', args.list_id)\n if (args.campaign_id) params.set('campaign_id', args.campaign_id)\n const result = await client.get(`/analytics/cohort/stats?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'filter_cohort',\n {\n title: 'Filter Cohort',\n description:\n 'Filter a cohort of profiles by advanced criteria — follower range, engagement rate, ' +\n 'niche, location, affinities, and more. Costs 2 credits.',\n inputSchema: z.object({\n profiles: z.array(z.string()).optional().describe('Array of usernames or profile IDs to filter'),\n source: z.object({\n type: z.enum(['followers', 'following']).describe(\"Source type: 'followers' or 'following'\"),\n target: z.string().describe('Username or ig:ID of the seed profile'),\n limit: z.number().int().optional().describe('Max profiles to resolve from network (default 500, max 10000)'),\n }).optional().describe('Alternative: filter followers/following of a profile'),\n list_id: z.string().optional().describe('List UUID — filter all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — filter all creators in this campaign'),\n filters: z.record(z.string(), z.unknown()).optional().describe('Filter criteria (varies by field)'),\n }),\n },\n async (args) => {\n const result = await client.post('/analytics/cohort/filter', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_posting_times',\n {\n title: 'Get Posting Times',\n description:\n 'Get posting time patterns (day-of-week + hour heatmap), content format distribution, and sentiment analysis for a cohort. ' +\n 'Useful for finding optimal posting times. Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).optional().describe('Array of usernames or profile IDs to analyze'),\n list_id: z.string().optional().describe('List UUID — analyze all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — analyze all creators in this campaign'),\n platform: z.enum(['instagram', 'tiktok']).optional().describe(\"Platform to analyze (default: 'instagram')\"),\n days: z.number().int().min(1).max(365).optional().describe('Number of days to look back (default: 90)'),\n sample_max: z.number().int().min(1).max(50000).optional().describe('Max posts to sample (default: 5000)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.identifiers?.length) params.set('profiles', args.identifiers.join(','))\n if (args.list_id) params.set('list_id', args.list_id)\n if (args.campaign_id) params.set('campaign_id', args.campaign_id)\n if (args.platform) params.set('platform', args.platform)\n if (args.days !== undefined) params.set('days', String(args.days))\n if (args.sample_max !== undefined) params.set('sample_max', String(args.sample_max))\n // Call v1 analytics posting-times endpoint\n const result = await client.get(`/analytics/posting-times?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Content tools — Post search\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerContentTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'search_content',\n {\n title: 'Search Content',\n description:\n 'Search posts across the creator database by keywords, hashtags, or mentions. ' +\n 'Returns matching posts with engagement metrics and media. Costs 1 credit.',\n inputSchema: z.object({\n query: z.string().describe('Search query — matches post captions (required)'),\n author: z.string().optional().describe('Filter by creator username'),\n min_engagement: z.number().int().optional().describe('Minimum total engagement (likes + comments)'),\n since: z.string().optional().describe('Only posts after this date (ISO 8601, e.g. 2025-01-01)'),\n sort: z.enum(['relevance', 'engagement', 'date']).optional().describe(\"Sort order (default: 'relevance')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('query', args.query)\n if (args.author) params.set('author', args.author)\n if (args.min_engagement !== undefined) params.set('min_engagement', String(args.min_engagement))\n if (args.since) params.set('since', args.since)\n if (args.sort) params.set('sort', args.sort)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/content/search?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n // ============================================================================\n // Semantic Content Search (Phase 3 Embeddings)\n // ============================================================================\n\n server.registerTool(\n 'semantic_search_content',\n {\n title: 'Semantic Search Content',\n description:\n 'Search posts using AI embeddings for semantic similarity. ' +\n 'Finds conceptually related posts even without exact keyword matches. ' +\n 'Combines full-text search with vector similarity for best results. Costs 1 credit.',\n inputSchema: z.object({\n query: z.string().describe('Search query — finds semantically similar posts'),\n author: z.string().optional().describe('Filter by creator username'),\n min_engagement: z.number().int().optional().describe('Minimum total engagement'),\n since: z.string().optional().describe('Only posts after this date (ISO 8601)'),\n platform: z.enum(['instagram', 'tiktok']).optional().describe('Filter by platform'),\n alpha: z.number().min(0).max(1).optional().describe('Hybrid weight: 0=keyword only, 1=semantic only, 0.6=balanced (default)'),\n sort: z.enum(['relevance', 'engagement', 'date']).optional().describe(\"Sort order (default: 'relevance')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/content/search/semantic', {\n query: args.query,\n author: args.author,\n min_engagement: args.min_engagement,\n since: args.since,\n platform: args.platform,\n alpha: args.alpha,\n sort: args.sort,\n limit: args.limit,\n })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Manage tools — CRM operations\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerManageTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_managed_profiles',\n {\n title: 'Get Managed Profiles',\n description:\n 'Get all profiles in the CRM pipeline with their relationship statuses, ' +\n 'notes, and tags. Costs 0 credits.',\n inputSchema: z.object({\n status: z.string().optional().describe(\"Filter by relationship status (e.g. 'outreached', 'negotiating', 'contracted')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.status) params.set('status', args.status)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/manage/profiles${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_crm_summary',\n {\n title: 'Get CRM Summary',\n description:\n 'Get a summary of the CRM pipeline — counts by status, recent activity, etc. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/manage/summary')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_org_stats',\n {\n title: 'Get Organization Stats',\n description:\n 'Get aggregate statistics for the organization — total profiles, enhanced profiles, ' +\n 'scraped data, and more. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/manage/stats')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'upsert_relationship',\n {\n title: 'Upsert Relationship',\n description:\n 'Create or update a CRM relationship for a creator. Set status, notes, tags. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n status: z.string().optional().describe(\"Relationship status (e.g. 'identified', 'outreached', 'negotiating', 'contracted', 'active', 'paused')\"),\n notes: z.string().optional().describe('Free-text notes about the relationship'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n }),\n },\n async (args) => {\n const { identifier, ...body } = args\n const result = await client.patch(`/manage/profiles/${encodeURIComponent(identifier)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_relationship',\n {\n title: 'Delete Relationship',\n description:\n 'Remove a creator from the CRM pipeline. Does not delete the profile itself. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/manage/profiles/${encodeURIComponent(args.identifier)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'upsert_relationships_bulk',\n {\n title: 'Upsert Relationships Bulk',\n description:\n 'Bulk update notes, tags, or status for multiple CRM profiles in one call. ' +\n 'Creates relationships if they do not exist. Max 100 profiles per request. Costs 0 credits.',\n inputSchema: z.object({\n updates: z.array(z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n status: z.string().optional().describe(\"Relationship status (e.g. 'shortlisted', 'outreached', 'negotiating')\"),\n notes: z.string().optional().describe('Free-text notes about the relationship'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n })).min(1).max(100).describe('Array of profile updates (max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/manage/profiles/bulk', { updates: args.updates })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Knowledge tools — KB folders, entries, context search\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerKnowledgeTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_knowledge_folders',\n {\n title: 'List Knowledge Folders',\n description: 'List all knowledge base folders in the organization. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/knowledge/folders')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_knowledge_folder',\n {\n title: 'Create Knowledge Folder',\n description: 'Create a new knowledge base folder. Costs 0 credits.',\n inputSchema: z.object({\n name: z.string().describe('Folder name'),\n description: z.string().optional().describe('Optional description'),\n folder_type: z.enum(['general', 'brand', 'campaign', 'templates', 'research']).optional().describe(\"Folder type (default: 'general')\"),\n parent_folder_id: z.string().optional().describe('UUID of parent folder for nesting'),\n icon_name: z.string().optional().describe('Lucide icon name'),\n color: z.string().optional().describe('Hex color (e.g. #8b5cf6)'),\n }),\n },\n async (args) => {\n const result = await client.post('/knowledge/folders', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_folder_entries',\n {\n title: 'Get Folder Entries',\n description: 'Get all entries in a knowledge base folder. Costs 0 credits.',\n inputSchema: z.object({\n folder_id: z.string().describe('Folder UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/knowledge/folders/${encodeURIComponent(args.folder_id)}/entries${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_knowledge_entry',\n {\n title: 'Create Knowledge Entry',\n description: 'Create a new knowledge base entry in a folder. Costs 0 credits.',\n inputSchema: z.object({\n folder_id: z.string().describe('Folder UUID to add the entry to'),\n name: z.string().describe('Entry name'),\n content: z.string().optional().describe('Entry content (markdown supported)'),\n description: z.string().optional().describe('Short description'),\n source_url: z.string().optional().describe('Source URL reference'),\n }),\n },\n async (args) => {\n const result = await client.post('/knowledge/entries', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_knowledge_entry',\n {\n title: 'Get Knowledge Entry',\n description: 'Get a specific knowledge base entry by ID. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/knowledge/entries/${encodeURIComponent(args.entry_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'update_knowledge_entry',\n {\n title: 'Update Knowledge Entry',\n description: 'Update a knowledge base entry. At least one field required. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n name: z.string().optional().describe('New name'),\n content: z.string().optional().describe('New content'),\n description: z.string().optional().describe('New description'),\n summary: z.string().optional().describe('New summary'),\n folder_id: z.string().optional().describe('Move to a different folder (UUID)'),\n }),\n },\n async (args) => {\n const { entry_id, ...body } = args\n const result = await client.put(`/knowledge/entries/${encodeURIComponent(entry_id)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_knowledge_entry',\n {\n title: 'Delete Knowledge Entry',\n description: 'Delete a knowledge base entry. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/knowledge/entries/${encodeURIComponent(args.entry_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'search_knowledge',\n {\n title: 'Get Knowledge Context',\n description:\n 'Get aggregated brand context from the knowledge base, organized by folder type. ' +\n 'Returns entries for AI agent consumption. Filter by folder type to get specific context. Costs 0 credits.',\n inputSchema: z.object({\n folder_types: z.array(z.string()).optional().describe(\"Filter by folder types (e.g. ['brand', 'campaign', 'research'])\"),\n max_entries: z.number().int().min(1).max(100).optional().describe('Maximum entries to return (default 20, max 100)'),\n include_summaries: z.boolean().optional().describe('Include entry summaries (default true)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.folder_types?.length) params.set('folder_types', args.folder_types.join(','))\n if (args.max_entries !== undefined) params.set('max_entries', String(args.max_entries))\n if (args.include_summaries === false) params.set('include_summaries', 'false')\n const result = await client.get(`/knowledge/context?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Enhance tools — Profile enhancement triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\nimport { creditGuard } from './credit-guard'\n\nexport function registerEnhanceTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'enhance_profiles',\n {\n title: 'Enhance Profiles',\n description:\n 'Trigger AI enhancement for one or more profiles. Enhancement adds affinities, ' +\n 'demographics, niche analysis, and more. Returns a job ID — poll with ' +\n 'get_enhancement_status to check progress. Costs 1+ credits.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to enhance'),\n mode: z.enum(['basic', 'enhanced']).optional().describe(\"Enhancement mode: 'basic' (1 credit/profile) or 'enhanced' (2 credits/profile). Default: basic\"),\n dry_run: z.boolean().optional().describe('If true, returns cost estimate without triggering enhancement'),\n auto_confirm: z.boolean().optional().describe('If true, auto-confirms the job without a separate confirm step'),\n authorize_overage: z.boolean().optional().describe('If true, allows proceeding even if credits are insufficient'),\n options: z.object({\n force: z.boolean().optional().describe('Re-enhance even if already enhanced'),\n }).optional().describe('Enhancement options'),\n confirmed: z.boolean().optional().describe('Set to true after reviewing the cost estimate to proceed with execution'),\n }),\n },\n async (args) => {\n try {\n const { identifiers, options, confirmed, ...rest } = args\n\n // Credit guard: dry-run first for 100+ credit operations\n const guard = await creditGuard(\n client,\n confirmed, // Only bypass when explicitly confirmed, NOT for dry_run\n () => client.post('/enhance/profiles', { profiles: identifiers, ...rest, dry_run: true }),\n `Enhance ${identifiers.length} profile${identifiers.length !== 1 ? 's' : ''}`,\n )\n\n // For dry_run, always return the dry-run data (guard executes the API call)\n if (rest.dry_run) {\n const text = guard.dryRunData ? JSON.stringify(guard.dryRunData, null, 2) : 'Dry-run failed - no data returned'\n return { content: [{ type: 'text' as const, text }] }\n }\n\n // For non-dry-run, check if confirmation is needed (≥100 credits)\n if (!guard.proceed) {\n return { content: [{ type: 'text' as const, text: guard.message || 'Confirmation required' }] }\n }\n\n const result = await client.post('/enhance/profiles', { profiles: identifiers, ...rest })\n return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text' as const, text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'enhance_bulk',\n {\n title: 'Enhance Bulk',\n description:\n 'Trigger bulk enhancement for a large set of profiles from a network source (followers/following) or search filters. ' +\n 'Returns a job ID. Costs 1+ credits.',\n inputSchema: z.object({\n source: z.object({\n type: z.enum(['followers', 'following', 'both', 'search']).describe(\"Source type: 'followers'/'following'/'both' (network) or 'search' (filter-based)\"),\n target: z.string().optional().describe('Username of the seed profile (required for followers/following/both)'),\n filters: z.object({\n query: z.string().optional().describe('Search query'),\n niche: z.string().optional().describe('Filter by niche'),\n location: z.string().optional().describe('Filter by location'),\n gender: z.enum(['male', 'female', 'non_binary', 'brand']).optional().describe('Filter by gender'),\n min_followers: z.number().int().optional().describe('Minimum followers'),\n max_followers: z.number().int().optional().describe('Maximum followers'),\n has_contact: z.boolean().optional().describe('Only profiles with contact info'),\n }).optional().describe('Search filters (required for search source)'),\n limit: z.number().int().optional().describe('Max profiles to resolve from source'),\n }).describe('Source specification for profiles to enhance'),\n mode: z.enum(['basic', 'enhanced']).optional().describe(\"Enhancement mode: 'basic' (1 credit) or 'enhanced' (2 credits). Default: basic\"),\n dry_run: z.boolean().optional().describe('If true, returns cost estimate without triggering enhancement'),\n skip_already_enhanced: z.boolean().optional().describe('Skip profiles that are already enhanced'),\n auto_confirm: z.boolean().optional().describe('Auto-confirm the job without a separate confirm step'),\n authorize_overage: z.boolean().optional().describe('Allow proceeding even if credits are insufficient'),\n confirmed: z.boolean().optional().describe('Set to true after reviewing the cost estimate to proceed with execution'),\n }),\n },\n async (args) => {\n try {\n const { confirmed, ...rest } = args\n\n // Credit guard: dry-run first for 100+ credit operations\n const guard = await creditGuard(\n client,\n confirmed, // Only bypass when explicitly confirmed, NOT for dry_run\n () => client.post('/enhance/bulk', { ...rest, dry_run: true }),\n `Bulk enhance from ${rest.source.type} source`,\n )\n\n // For dry_run, always return the dry-run data (guard executes the API call)\n if (rest.dry_run) {\n const text = guard.dryRunData ? JSON.stringify(guard.dryRunData, null, 2) : 'Dry-run failed - no data returned'\n return { content: [{ type: 'text' as const, text }] }\n }\n\n // For non-dry-run, check if confirmation is needed (≥100 credits)\n if (!guard.proceed) {\n return { content: [{ type: 'text' as const, text: guard.message || 'Confirmation required' }] }\n }\n\n const result = await client.post('/enhance/bulk', rest)\n return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text' as const, text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'confirm_enhancement',\n {\n title: 'Confirm Enhancement',\n description:\n 'Confirm and start a pending enhancement job. Some jobs require confirmation ' +\n 'before processing begins (e.g. large batches). Costs 0 credits (charged at creation).',\n inputSchema: z.object({\n job_id: z.string().describe('Enhancement job ID'),\n authorize_overage: z.boolean().optional().describe('Authorize credit overage if needed'),\n }),\n },\n async (args) => {\n const result = await client.post(\n `/enhance/${encodeURIComponent(args.job_id)}/confirm`,\n { authorize_overage: args.authorize_overage },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_enhancement_status',\n {\n title: 'Get Enhancement Status',\n description:\n 'Check the status of an enhancement job. Returns progress, completed count, ' +\n 'and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Enhancement job ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/enhance/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Credit Guard — Pre-execution cost check for expensive MCP tool calls.\n *\n * For operations estimated at ≥100 credits the guard performs a dry-run,\n * fetches the account's current usage, and returns a human-readable\n * confirmation prompt instead of executing the operation.\n *\n * The calling tool adds a `confirmed` boolean parameter. When `confirmed`\n * is true the guard is bypassed and the real request fires immediately.\n */\n\nimport type { CelaviiClient } from '../client.js'\n\nconst CREDIT_THRESHOLD = 100\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface UsageSnapshot {\n total_credits_used: number\n credits_today: number\n plan: string | null\n tier: string | null\n}\n\nexport interface CreditGuardResult {\n /** true → proceed with execution */\n proceed: boolean\n /** If proceed is false, this is the confirmation message to show */\n message?: string\n /** Raw dry-run response (forwarded when proceed is true too) */\n dryRunData?: unknown\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nasync function fetchUsage(client: CelaviiClient): Promise<UsageSnapshot> {\n try {\n const raw = (await client.get('/me')) as {\n data?: {\n usage?: { total_credits_used?: number; credits_today?: number }\n organization?: { plan?: string }\n api_key?: { tier?: string }\n }\n }\n const d = raw?.data ?? (raw as Record<string, unknown>)\n const usage = (d as Record<string, unknown>)?.usage as Record<string, unknown> | undefined\n const org = (d as Record<string, unknown>)?.organization as Record<string, unknown> | undefined\n const key = (d as Record<string, unknown>)?.api_key as Record<string, unknown> | undefined\n return {\n total_credits_used: Number(usage?.total_credits_used ?? 0),\n credits_today: Number(usage?.credits_today ?? 0),\n plan: (org?.plan as string) ?? null,\n tier: (key?.tier as string) ?? null,\n }\n } catch {\n return { total_credits_used: 0, credits_today: 0, plan: null, tier: null }\n }\n}\n\nfunction formatConfirmation(\n action: string,\n estimatedCredits: number,\n usage: UsageSnapshot,\n dryRunData: unknown,\n): string {\n const lines: string[] = [\n '⚠️ Credit Authorization Required',\n '',\n `Action: ${action}`,\n `Estimated cost: ~${estimatedCredits} credits`,\n '',\n '── Current Account Usage ──',\n `Credits used today: ${usage.credits_today}`,\n `Total credits used: ${usage.total_credits_used}`,\n ...(usage.plan ? [`Plan: ${usage.plan}`] : []),\n ...(usage.tier ? [`API tier: ${usage.tier}`] : []),\n '',\n '── Dry-Run Details ──',\n JSON.stringify(dryRunData, null, 2),\n '',\n 'To proceed, call this tool again with confirmed: true.',\n ]\n return lines.join('\\n')\n}\n\n// ---------------------------------------------------------------------------\n// Guard\n// ---------------------------------------------------------------------------\n\n/**\n * Run the credit guard for a tool call that supports `dry_run`.\n *\n * @param client Celavii API client\n * @param confirmed Whether the user has already confirmed\n * @param dryRunFn A function that calls the API with dry_run: true and\n * returns the raw response. The guard will extract\n * `estimated_cost.credits` from `data` or from the root.\n * @param action Human-readable description of the operation\n */\nexport async function creditGuard(\n client: CelaviiClient,\n confirmed: boolean | undefined,\n dryRunFn: () => Promise<unknown>,\n action: string,\n): Promise<CreditGuardResult> {\n // Bypass when already confirmed\n if (confirmed) {\n return { proceed: true }\n }\n\n // Execute dry-run\n const dryResult = await dryRunFn()\n\n // Extract estimated credits from common response shapes\n const root = dryResult as Record<string, unknown>\n const data = (root?.data ?? root) as Record<string, unknown>\n const estCost = data?.estimated_cost as Record<string, unknown> | undefined\n const estimatedCredits = Number(estCost?.credits ?? data?.eligible ?? 0)\n\n // If below threshold, proceed without confirmation\n if (estimatedCredits < CREDIT_THRESHOLD) {\n return { proceed: true, dryRunData: dryResult }\n }\n\n // Above threshold → fetch usage and build confirmation prompt\n const usage = await fetchUsage(client)\n const message = formatConfirmation(action, estimatedCredits, usage, data)\n\n return { proceed: false, message, dryRunData: dryResult }\n}\n","/**\n * Scrape tools — Data collection triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerScrapeTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'scrape_followers',\n {\n title: 'Scrape Followers',\n description:\n 'Trigger a follower scrape for a profile. Collects the full follower list. ' +\n 'Returns a job ID — poll with get_scrape_status. Costs 2 credits.',\n inputSchema: z.object({\n username: z.string().describe('Instagram username to scrape followers for'),\n limit: z.number().int().optional().describe('Max followers to scrape (default: all)'),\n }),\n },\n async (args) => {\n try {\n const { limit, ...rest } = args\n const result = await client.post('/scrape/followers', { ...rest, ...(limit !== undefined && { max_results: limit }) })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_following',\n {\n title: 'Scrape Following',\n description:\n 'Trigger a following scrape for a profile. Collects who they follow. ' +\n 'Returns a job ID — poll with get_scrape_status. Costs 2 credits.',\n inputSchema: z.object({\n username: z.string().describe('Instagram username to scrape following for'),\n limit: z.number().int().optional().describe('Max following to scrape (default: all)'),\n }),\n },\n async (args) => {\n try {\n const { limit, ...rest } = args\n const result = await client.post('/scrape/following', { ...rest, ...(limit !== undefined && { max_results: limit }) })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_followers_bulk',\n {\n title: 'Bulk Scrape Followers',\n description:\n 'Trigger a follower scrape for multiple profiles in a single Apify run. ' +\n 'Much more efficient than calling scrape_followers repeatedly — uses 1 API call, ' +\n '1 DB connection, and 1 Apify run instead of N. Max 50 profiles per request. ' +\n 'Returns a single job ID — poll with get_scrape_status. Costs 2 credits + processing. ' +\n 'IMPORTANT: TikTok bulk scrapes limited to 10 profiles per request due to rate limiting.',\n inputSchema: z.object({\n usernames: z.array(z.string()).max(50).optional()\n .describe('Array of usernames to scrape followers for (max 50 for Instagram, max 10 for TikTok)'),\n profile_ids: z.array(z.string()).max(50).optional()\n .describe('Array of profile IDs (ig:XXX or tt:XXX) to scrape followers for (max 50 for Instagram, max 10 for TikTok)'),\n limit: z.number().int().optional()\n .describe('Max followers to scrape per profile (default: 10000)'),\n platform: z.enum(['instagram', 'tiktok']).optional()\n .describe('Platform override — auto-detected from profiles if not specified'),\n dry_run: z.boolean().optional()\n .describe('If true, returns cost estimate without triggering the scrape'),\n }),\n },\n async (args) => {\n try {\n const body: Record<string, unknown> = {}\n if (args.usernames) body.usernames = args.usernames\n if (args.profile_ids) body.profile_ids = args.profile_ids\n if (args.limit !== undefined) body.max_results_per_profile = args.limit\n if (args.platform) body.platform = args.platform\n if (args.dry_run !== undefined) body.dry_run = args.dry_run\n const result = await client.post('/scrape/followers/bulk', body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_following_bulk',\n {\n title: 'Bulk Scrape Following',\n description:\n 'Trigger a following scrape for multiple profiles in a single Apify run. ' +\n 'Much more efficient than calling scrape_following repeatedly — uses 1 API call, ' +\n '1 DB connection, and 1 Apify run instead of N. Max 50 profiles per request. ' +\n 'Returns a single job ID — poll with get_scrape_status. Costs 2 credits + processing. ' +\n 'IMPORTANT: TikTok bulk scrapes limited to 10 profiles per request due to rate limiting.',\n inputSchema: z.object({\n usernames: z.array(z.string()).max(50).optional()\n .describe('Array of usernames to scrape following for (max 50 for Instagram, max 10 for TikTok)'),\n profile_ids: z.array(z.string()).max(50).optional()\n .describe('Array of profile IDs (ig:XXX or tt:XXX) to scrape following for (max 50 for Instagram, max 10 for TikTok)'),\n limit: z.number().int().optional()\n .describe('Max following to scrape per profile (default: 10000)'),\n platform: z.enum(['instagram', 'tiktok']).optional()\n .describe('Platform override — auto-detected from profiles if not specified'),\n dry_run: z.boolean().optional()\n .describe('If true, returns cost estimate without triggering the scrape'),\n }),\n },\n async (args) => {\n try {\n const body: Record<string, unknown> = {}\n if (args.usernames) body.usernames = args.usernames\n if (args.profile_ids) body.profile_ids = args.profile_ids\n if (args.limit !== undefined) body.max_results_per_profile = args.limit\n if (args.platform) body.platform = args.platform\n if (args.dry_run !== undefined) body.dry_run = args.dry_run\n const result = await client.post('/scrape/following/bulk', body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_locations',\n {\n title: 'Scrape Locations',\n description:\n 'Scrape posts from a specific Instagram location/place. ' +\n 'Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n location_id: z.string().optional().describe('Instagram location ID'),\n location_name: z.string().optional().describe('Location name to search for'),\n limit: z.number().int().optional().describe('Max posts to scrape'),\n }),\n },\n async (args) => {\n try {\n const body: Record<string, unknown> = {}\n if (args.location_id) body.location_ids = [args.location_id]\n if (args.location_name) body.start_urls = [`https://www.instagram.com/explore/locations/${args.location_name}/`]\n if (args.limit !== undefined) body.max_items = args.limit\n const result = await client.post('/scrape/locations', body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_hashtags',\n {\n title: 'Scrape Hashtags',\n description:\n 'Scrape posts from a specific hashtag. Collects recent posts using that hashtag. ' +\n 'Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n hashtag: z.string().describe('Hashtag to scrape (without #)'),\n limit: z.number().int().optional().describe('Max posts to scrape'),\n }),\n },\n async (args) => {\n try {\n const result = await client.post('/scrape/hashtags', {\n hashtags: [args.hashtag],\n ...(args.limit !== undefined && { max_items: args.limit }),\n })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_urls',\n {\n title: 'Scrape URLs',\n description:\n 'Scrape specific Instagram post or reel URLs. Extracts engagement data, ' +\n 'comments, and media. Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n urls: z.array(z.string()).describe('Array of Instagram post/reel URLs'),\n }),\n },\n async (args) => {\n try {\n const result = await client.post('/scrape/urls', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'get_scrape_status',\n {\n title: 'Get Scrape Status',\n description:\n 'Check the status of a scrape job. Returns progress and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Scrape job ID'),\n }),\n },\n async (args) => {\n try {\n const result = await client.get(`/scrape/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n}\n","/**\n * Refine tools — AI refinement triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\nimport { creditGuard } from './credit-guard'\n\nexport function registerRefineTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'refine_profiles',\n {\n title: 'Refine Profiles',\n description:\n 'Trigger AI refinement for one or more profiles. Refinement uses AI to ' +\n 'improve and enrich profile data — better niche classification, bio analysis, ' +\n 'content themes, etc. Returns a job ID — poll with get_refinement_status. Costs 1+ credits.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).optional().describe('Array of usernames or profile IDs to refine'),\n list_id: z.string().optional().describe('List UUID — refine all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — refine all creators in this campaign'),\n dry_run: z.boolean().optional().describe('If true, returns cost estimate without triggering refinement'),\n skip_already_refined: z.boolean().optional().describe('Skip profiles that have already been refined'),\n confirmed: z.boolean().optional().describe('Set to true after reviewing the cost estimate to proceed with execution'),\n }),\n },\n async (args) => {\n try {\n const { identifiers, list_id, campaign_id, confirmed, ...rest } = args\n\n // Build request body based on input mode\n const bodyBase: Record<string, unknown> = { ...rest }\n if (identifiers && identifiers.length > 0) {\n bodyBase.profiles = identifiers\n } else if (list_id) {\n bodyBase.list_id = list_id\n } else if (campaign_id) {\n bodyBase.campaign_id = campaign_id\n } else {\n return { content: [{ type: 'text' as const, text: 'Error: Provide identifiers, list_id, or campaign_id' }] }\n }\n\n // Determine label for credit guard\n const label = list_id\n ? `Refine list ${list_id}`\n : campaign_id\n ? `Refine campaign ${campaign_id}`\n : `Refine ${identifiers?.length || 0} profile${(identifiers?.length || 0) !== 1 ? 's' : ''}`\n\n // Credit guard: dry-run first for 100+ credit operations\n const guard = await creditGuard(\n client,\n confirmed, // Only bypass when explicitly confirmed, NOT for dry_run\n () => client.post('/refine/profiles', { ...bodyBase, dry_run: true }),\n label,\n )\n\n // For dry_run, always return the dry-run data (guard executes the API call)\n if (rest.dry_run) {\n const text = guard.dryRunData ? JSON.stringify(guard.dryRunData, null, 2) : 'Dry-run failed - no data returned'\n return { content: [{ type: 'text' as const, text }] }\n }\n\n // For non-dry-run, check if confirmation is needed (≥100 credits)\n if (!guard.proceed) {\n return { content: [{ type: 'text' as const, text: guard.message || 'Confirmation required' }] }\n }\n\n const result = await client.post('/refine/profiles', bodyBase)\n return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text' as const, text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'get_refinement_status',\n {\n title: 'Get Refinement Status',\n description:\n 'Check the status of a refinement job. Returns progress and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Refinement job ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/refine/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/client.ts","../src/tools/meta.ts","../src/tools/profiles.ts","../src/tools/campaigns.ts","../src/tools/lists.ts","../src/tools/analytics.ts","../src/tools/content.ts","../src/tools/manage.ts","../src/tools/knowledge.ts","../src/tools/enhance.ts","../src/tools/credit-guard.ts","../src/tools/scrape.ts","../src/tools/refine.ts","../src/tools/jobs.ts"],"sourcesContent":["/**\n * Celavii MCP Server — stdio Entry Point\n *\n * Usage:\n * CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp\n *\n * Or in MCP config:\n * {\n * \"mcpServers\": {\n * \"celavii\": {\n * \"command\": \"npx\",\n * \"args\": [\"-y\", \"celavii-mcp@latest\"],\n * \"env\": { \"CELAVII_API_KEY\": \"cvii_live_xxx\" }\n * }\n * }\n * }\n */\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { createServer, TOOL_GROUPS, type ToolGroup } from './server.js'\n\nfunction parseToolGroups(env: string | undefined): ToolGroup[] | undefined {\n if (!env) return undefined\n const requested = env.split(',').map((s) => s.trim().toLowerCase())\n const valid = requested.filter((g): g is ToolGroup =>\n (TOOL_GROUPS as readonly string[]).includes(g),\n )\n const invalid = requested.filter((g) => !(TOOL_GROUPS as readonly string[]).includes(g))\n if (invalid.length) {\n console.error(\n `Warning: Unknown tool groups ignored: ${invalid.join(', ')}\\n` +\n `Valid groups: ${TOOL_GROUPS.join(', ')}`,\n )\n }\n return valid.length > 0 ? valid : undefined\n}\n\nasync function main() {\n const apiKey = process.env.CELAVII_API_KEY\n if (!apiKey) {\n console.error(\n 'Error: CELAVII_API_KEY environment variable is required.\\n' +\n 'Get your API key at https://www.celavii.com/settings/api-keys\\n' +\n '\\nUsage:\\n' +\n ' CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp\\n' +\n '\\nOptional: Load specific tool groups only:\\n' +\n ` CELAVII_TOOLS=profiles,analytics,campaigns\\n` +\n ` Available groups: ${TOOL_GROUPS.join(', ')}`,\n )\n process.exit(1)\n }\n\n const baseUrl = process.env.CELAVII_BASE_URL || undefined\n const tools = parseToolGroups(process.env.CELAVII_TOOLS)\n\n const server = createServer({ apiKey, baseUrl, tools })\n const transport = new StdioServerTransport()\n\n await server.connect(transport)\n}\n\nmain().catch((err) => {\n console.error('Fatal error:', err)\n process.exit(1)\n})\n","/**\n * Celavii MCP Server — Server Setup & Tool Registration\n *\n * Creates an McpServer instance and registers all tools organized by category.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { CelaviiClient, CelaviiApiError } from './client.js'\nimport { registerMetaTools } from './tools/meta.js'\nimport { registerProfileTools } from './tools/profiles.js'\nimport { registerCampaignTools } from './tools/campaigns.js'\nimport { registerListTools } from './tools/lists.js'\nimport { registerAnalyticsTools } from './tools/analytics.js'\nimport { registerContentTools } from './tools/content.js'\nimport { registerManageTools } from './tools/manage.js'\nimport { registerKnowledgeTools } from './tools/knowledge.js'\nimport { registerEnhanceTools } from './tools/enhance.js'\nimport { registerScrapeTools } from './tools/scrape.js'\nimport { registerRefineTools } from './tools/refine.js'\nimport { registerJobsTools } from './tools/jobs.js'\n\n/**\n * Available tool groups that can be selectively loaded via CELAVII_TOOLS env var.\n * 'meta' is always loaded (account info + usage).\n */\nexport const TOOL_GROUPS = [\n 'profiles',\n 'campaigns',\n 'lists',\n 'analytics',\n 'content',\n 'manage',\n 'knowledge',\n 'enhance',\n 'scrape',\n 'refine',\n 'jobs',\n] as const\n\nexport type ToolGroup = (typeof TOOL_GROUPS)[number]\n\nexport interface CreateServerOptions {\n apiKey: string\n baseUrl?: string\n /** Tool groups to register. If omitted or empty, all groups are registered. */\n tools?: ToolGroup[]\n}\n\nexport function createServer(options: CreateServerOptions): McpServer {\n const { apiKey, baseUrl, tools } = options\n\n const server = new McpServer(\n {\n name: 'celavii',\n version: '0.1.22',\n },\n {\n capabilities: {\n logging: {},\n },\n },\n )\n\n const client = new CelaviiClient(apiKey, baseUrl)\n\n const enabled = tools && tools.length > 0 ? new Set(tools) : null\n\n const registrars: Record<ToolGroup, (s: McpServer, c: CelaviiClient) => void> = {\n profiles: registerProfileTools,\n campaigns: registerCampaignTools,\n lists: registerListTools,\n analytics: registerAnalyticsTools,\n content: registerContentTools,\n manage: registerManageTools,\n knowledge: registerKnowledgeTools,\n enhance: registerEnhanceTools,\n scrape: registerScrapeTools,\n refine: registerRefineTools,\n jobs: registerJobsTools,\n }\n\n // Meta tools (account info, usage) are always registered\n registerMetaTools(server, client)\n\n for (const [group, register] of Object.entries(registrars)) {\n if (!enabled || enabled.has(group as ToolGroup)) {\n register(server, client)\n }\n }\n\n return server\n}\n\nexport { CelaviiClient, CelaviiApiError }\n","/**\n * Celavii MCP Server — HTTP Client\n *\n * Thin wrapper around fetch that adds Bearer auth, error handling,\n * and structured error responses for MCP tool handlers.\n */\n\nconst DEFAULT_BASE_URL = 'https://www.celavii.com/api/v1'\n\nexport class CelaviiApiError extends Error {\n constructor(\n message: string,\n public code: string,\n public status: number,\n public retryAfter?: number,\n ) {\n super(message)\n this.name = 'CelaviiApiError'\n }\n}\n\nexport class CelaviiClient {\n private baseUrl: string\n private apiKey: string\n\n constructor(apiKey: string, baseUrl?: string) {\n this.apiKey = apiKey\n this.baseUrl = (baseUrl || DEFAULT_BASE_URL).replace(/\\/$/, '')\n }\n\n private async request(path: string, init?: RequestInit): Promise<unknown> {\n const url = `${this.baseUrl}${path}`\n const res = await fetch(url, {\n ...init,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'celavii-mcp/0.1.0',\n ...init?.headers,\n },\n })\n\n let json: unknown\n try {\n json = await res.json()\n } catch {\n throw new CelaviiApiError(\n `HTTP ${res.status}: Failed to parse response`,\n 'INTERNAL_ERROR',\n res.status,\n )\n }\n\n if (!res.ok) {\n const err = json as { error?: { code?: string; message?: string; retry_after?: number } }\n const msg = err?.error?.message || `HTTP ${res.status}`\n const code = err?.error?.code || 'INTERNAL_ERROR'\n throw new CelaviiApiError(msg, code, res.status, err?.error?.retry_after)\n }\n\n return json\n }\n\n async get(path: string): Promise<unknown> {\n return this.request(path)\n }\n\n async post(path: string, body?: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'POST',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n\n async patch(path: string, body: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'PATCH',\n body: JSON.stringify(body),\n })\n }\n\n async put(path: string, body: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'PUT',\n body: JSON.stringify(body),\n })\n }\n\n async delete(path: string, body?: unknown): Promise<unknown> {\n return this.request(path, {\n method: 'DELETE',\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n }\n}\n","/**\n * Meta tools — Account info and usage\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerMetaTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_account_info',\n {\n title: 'Get Account Info',\n description:\n 'Get information about the current API key, organization, and usage summary. ' +\n 'Useful to verify API key is working and see available scopes. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/me')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_usage',\n {\n title: 'Get Usage',\n description:\n 'Get credit usage and rate limit status for the current API key. ' +\n 'Shows total requests, credits used, daily breakdown, and rate limit info. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/usage')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Profile tools — Search, details, affinities, posts, network, bulk\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerProfileTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'search_profiles',\n {\n title: 'Search Profiles',\n description:\n 'Search the Celavii creator database. Filter by query text, niche, location, gender, ' +\n 'follower count. Returns matching Instagram profiles with basic stats. ' +\n 'At least one filter is required. Costs 1 credit.',\n inputSchema: z.object({\n query: z.string().optional().describe('Search query — matches username, display name, or bio keywords'),\n niche: z.string().optional().describe(\"Filter by niche/topic (e.g. 'fitness', 'fashion', 'tech')\"),\n location: z.string().optional().describe(\"Filter by location (e.g. 'Miami', 'Los Angeles, California')\"),\n gender: z.enum(['male', 'female', 'non_binary', 'brand']).optional().describe('Filter by gender'),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n has_contact: z.boolean().optional().describe('Only return profiles with email or phone'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor from a previous response'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.query) params.set('query', args.query)\n if (args.niche) params.set('niche', args.niche)\n if (args.location) params.set('location', args.location)\n if (args.gender) params.set('gender', args.gender)\n if (args.min_followers !== undefined) params.set('min_followers', String(args.min_followers))\n if (args.max_followers !== undefined) params.set('max_followers', String(args.max_followers))\n if (args.has_contact) params.set('has_contact', 'true')\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/profiles/search?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'search_profiles_by_affinities',\n {\n title: 'Search Profiles by Affinities',\n description:\n 'Search creators by their AI-analyzed brand or topic affinities. ' +\n 'Find creators who have affinity for specific brands, interests, or topics. Costs 1 credit.',\n inputSchema: z.object({\n affinities: z.array(z.string()).describe(\"Affinity terms to search for (e.g. ['Nike', 'fitness', 'running'])\"),\n match_mode: z.enum(['any', 'all']).optional().describe(\"'any' = match any affinity, 'all' = must match all (default: 'any')\"),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor from a previous response'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('terms', args.affinities.join(','))\n if (args.match_mode) params.set('match_mode', args.match_mode)\n if (args.min_followers !== undefined) params.set('min_followers', String(args.min_followers))\n if (args.max_followers !== undefined) params.set('max_followers', String(args.max_followers))\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/profiles/search/affinities?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profiles_bulk',\n {\n title: 'Get Profiles Bulk',\n description:\n 'Get detailed information for multiple profiles at once by username or profile ID. ' +\n 'Up to 100 profiles per request. Costs 1 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs (max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/profiles/bulk', { profiles: args.identifiers })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile',\n {\n title: 'Get Profile',\n description:\n 'Get detailed information about a single Instagram profile by username or profile ID. ' +\n 'Returns bio, stats, niche, location, job_status (enhance/refine/scrape progress), and more. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username (without @) or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_affinities',\n {\n title: 'Get Profile Affinities',\n description:\n 'Get AI-analyzed brand and topic affinities for a profile. ' +\n 'Shows what brands, interests, and topics a creator is associated with. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/affinities`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_posts',\n {\n title: 'Get Profile Posts',\n description:\n 'Get recent posts for a profile. Returns post content, engagement metrics, ' +\n 'media URLs, and hashtags. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of posts (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/posts${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_network',\n {\n title: 'Get Profile Network',\n description:\n 'Get the social network graph for a profile — mutual connections, ' +\n 'top followers, and following relationships. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/network`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_followers',\n {\n title: 'Get Profile Followers',\n description:\n 'Get the followers list for a profile. Only available if followers have been scraped. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of followers (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/followers${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_following',\n {\n title: 'Get Profile Following',\n description:\n 'Get the accounts a profile is following. Only available if following data has been scraped. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of following (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/following${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_social_links',\n {\n title: 'Get Profile Social Links',\n description:\n 'Get external social media links found in a profile bio (YouTube, TikTok, Twitter, etc.). Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/social-links`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_profile_contact',\n {\n title: 'Get Profile Contact',\n description:\n 'Get contact information (email, phone) for a profile. ' +\n 'Requires the profiles:contact scope. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/profiles/${encodeURIComponent(args.identifier)}/contact`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n // ============================================================================\n // Semantic Search Tools (Phase 3 Embeddings)\n // ============================================================================\n\n server.registerTool(\n 'find_similar_profiles',\n {\n title: 'Find Similar Profiles',\n description:\n 'Find profiles semantically similar to a seed profile using AI embeddings. ' +\n 'Uses vector similarity to find creators with similar content, topics, and style. ' +\n 'More powerful than keyword matching — finds conceptually related profiles. Costs 1 credit.',\n inputSchema: z.object({\n profile_id: z.string().describe('Seed profile ID (e.g., ig:123456789) to find similar profiles for'),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n platforms: z.array(z.enum(['instagram', 'tiktok'])).optional().describe('Filter by platforms'),\n limit: z.number().int().min(1).max(100).optional().describe('Results to return (default 20, max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/profiles/search/similar', {\n profile_id: args.profile_id,\n min_followers: args.min_followers,\n max_followers: args.max_followers,\n platforms: args.platforms,\n limit: args.limit,\n })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'find_similar_to_cohort',\n {\n title: 'Find Similar to Cohort',\n description:\n 'Find profiles similar to a GROUP of seed profiles. ' +\n 'Computes a centroid embedding from multiple profiles and finds similar creators. ' +\n 'Use case: \"Find creators like these 5 influencers I already work with\". Costs 1 credit.',\n inputSchema: z.object({\n profile_ids: z.array(z.string()).describe('Array of seed profile IDs (e.g., [\"ig:123\", \"ig:456\"])'),\n min_followers: z.number().int().optional().describe('Minimum follower count'),\n max_followers: z.number().int().optional().describe('Maximum follower count'),\n platforms: z.array(z.enum(['instagram', 'tiktok'])).optional().describe('Filter by platforms'),\n exclude_seeds: z.boolean().optional().describe('Exclude seed profiles from results (default true)'),\n limit: z.number().int().min(1).max(100).optional().describe('Results to return (default 20, max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/profiles/search/similar/cohort', {\n profile_ids: args.profile_ids,\n min_followers: args.min_followers,\n max_followers: args.max_followers,\n platforms: args.platforms,\n exclude_seeds: args.exclude_seeds,\n limit: args.limit,\n })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Campaign tools — List, metrics, creators, content\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerCampaignTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_campaigns',\n {\n title: 'List Campaigns',\n description:\n 'List all campaigns in the organization. Optionally filter by status. Costs 0 credits.',\n inputSchema: z.object({\n status: z.enum(['active', 'draft', 'completed', 'archived']).optional().describe('Filter by campaign status'),\n limit: z.number().int().min(1).max(100).optional().describe('Number of campaigns (default 25, max 100)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.status) params.set('status', args.status)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const qs = params.toString()\n const result = await client.get(`/campaigns${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_metrics',\n {\n title: 'Get Campaign Metrics',\n description:\n 'Get performance metrics for a specific campaign — total creators, posts, ' +\n 'engagement, reach, and more. Costs 0 credits.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/metrics`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_creators',\n {\n title: 'Get Campaign Creators',\n description:\n 'Get the list of creators assigned to a campaign with their statuses and metrics. Costs 0 credits.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/creators${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_campaign_content',\n {\n title: 'Get Campaign Content',\n description:\n 'Get content (posts) associated with a campaign. Includes engagement data ' +\n 'and media. Costs 1 credit.',\n inputSchema: z.object({\n campaign_id: z.string().describe('Campaign UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/campaigns/${encodeURIComponent(args.campaign_id)}/content${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * List tools — CRUD + member management\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerListTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_lists',\n {\n title: 'List Lists',\n description: 'Get all creator lists in the organization. Costs 0 credits.',\n inputSchema: z.object({\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/lists${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_list',\n {\n title: 'Create List',\n description: 'Create a new creator list. Costs 1 credit.',\n inputSchema: z.object({\n name: z.string().describe('Name of the list'),\n description: z.string().optional().describe('Optional description'),\n }),\n },\n async (args) => {\n const result = await client.post('/lists', { name: args.name, description: args.description })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_list',\n {\n title: 'Get List',\n description: 'Get details for a specific list by ID. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/lists/${encodeURIComponent(args.list_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'update_list',\n {\n title: 'Update List',\n description: 'Update a list name or description. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n name: z.string().optional().describe('New name'),\n description: z.string().optional().describe('New description'),\n }),\n },\n async (args) => {\n const { list_id, ...body } = args\n const result = await client.patch(`/lists/${encodeURIComponent(list_id)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_list',\n {\n title: 'Delete List',\n description: 'Delete a list. This does not delete the creators in the list. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/lists/${encodeURIComponent(args.list_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_list_members',\n {\n title: 'Get List Members',\n description: 'Get the creator profiles in a list with optional filtering. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n limit: z.number().int().min(1).max(200).optional().describe('Results per page (default 25, max 200)'),\n offset: z.number().int().min(0).optional().describe('Number of results to skip (default 0). Use the offset from the previous response to paginate.'),\n min_followers: z.number().int().optional().describe('Minimum follower count filter'),\n max_followers: z.number().int().optional().describe('Maximum follower count filter'),\n added_after: z.string().optional().describe('Only profiles added after this date (ISO 8601, e.g. 2025-01-01)'),\n enhanced_after: z.string().optional().describe('Only profiles enhanced after this date (ISO 8601)'),\n platform: z.enum(['instagram', 'tiktok']).optional().describe('Filter by platform'),\n has_enhancement: z.boolean().optional().describe('Filter by completed enhancement (true = has, false = missing)'),\n has_refinement: z.boolean().optional().describe('Filter by completed refinement (true = has, false = missing)'),\n has_followers_scrape: z.boolean().optional().describe('Filter by completed followers scrape (true = has, false = missing)'),\n has_following_scrape: z.boolean().optional().describe('Filter by completed following scrape (true = has, false = missing)'),\n tags: z.array(z.string()).optional().describe('Filter by tags — profiles with ANY of these tags'),\n relationship_status: z.string().optional().describe(\"Filter by CRM status (e.g., 'shortlisted', 'outreached', 'negotiating', 'contracted')\"),\n has_notes: z.boolean().optional().describe('Filter by whether profile has notes (true = has notes, false = no notes)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.offset !== undefined) params.set('offset', String(args.offset))\n if (args.min_followers !== undefined) params.set('min_followers', String(args.min_followers))\n if (args.max_followers !== undefined) params.set('max_followers', String(args.max_followers))\n if (args.added_after) params.set('added_after', args.added_after)\n if (args.enhanced_after) params.set('enhanced_after', args.enhanced_after)\n if (args.platform) params.set('platform', args.platform)\n if (args.has_enhancement !== undefined) params.set('has_enhancement', String(args.has_enhancement))\n if (args.has_refinement !== undefined) params.set('has_refinement', String(args.has_refinement))\n if (args.has_followers_scrape !== undefined) params.set('has_followers_scrape', String(args.has_followers_scrape))\n if (args.has_following_scrape !== undefined) params.set('has_following_scrape', String(args.has_following_scrape))\n if (args.tags && args.tags.length > 0) params.set('tags', args.tags.join(','))\n if (args.relationship_status) params.set('relationship_status', args.relationship_status)\n if (args.has_notes !== undefined) params.set('has_notes', String(args.has_notes))\n const qs = params.toString()\n const result = await client.get(`/lists/${encodeURIComponent(args.list_id)}/members${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'add_list_members',\n {\n title: 'Add List Members',\n description: 'Add creators to a list by username or profile ID. Costs 1 credit.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to add'),\n }),\n },\n async (args) => {\n const result = await client.post(\n `/lists/${encodeURIComponent(args.list_id)}/members`,\n { profiles: args.identifiers },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'remove_list_members',\n {\n title: 'Remove List Members',\n description: 'Remove creators from a list. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List UUID'),\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to remove'),\n }),\n },\n async (args) => {\n const result = await client.delete(\n `/lists/${encodeURIComponent(args.list_id)}/members`,\n { profiles: args.identifiers },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Analytics tools — Demographics, locations, niches, overlap, cohort\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\n/** Schema for endpoints that accept profile_ids + scope (demographics) */\nconst demographicsSchema = z.object({\n profile_ids: z.array(z.string()).optional().describe('Array of usernames or profile IDs to analyze'),\n scope: z.enum(['global', 'org']).optional().describe(\"'global' (default, all profiles) or 'org' (managed only)\"),\n})\n\n/** Schema for endpoints that accept scope + limit only (locations, niches) */\nconst orgLevelSchema = z.object({\n scope: z.enum(['global', 'org']).optional().describe(\"'global' (default, all profiles) or 'org' (managed only)\"),\n limit: z.number().int().min(1).max(100).optional().describe('Max results (default 20, max 100)'),\n})\n\n/** Schema for profile source parameters used by overlap, shared-hashtags, cohort */\nconst profileSourceSchema = z.object({\n identifiers: z.array(z.string()).optional().describe('Array of usernames or profile IDs to analyze'),\n list_id: z.string().optional().describe('List UUID — analyze all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — analyze all creators in this campaign'),\n})\n\n\nexport function registerAnalyticsTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_demographics',\n {\n title: 'Get Demographics',\n description:\n 'Get audience demographics breakdown (age, gender distribution). ' +\n 'Optionally pass profile_ids to analyze a subset, or scope=org for managed profiles only. Costs 1 credit.',\n inputSchema: demographicsSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.profile_ids?.length) params.set('profile_ids', args.profile_ids.join(','))\n if (args.scope) params.set('scope', args.scope)\n const result = await client.get(`/analytics/demographics?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_locations',\n {\n title: 'Get Locations',\n description:\n 'Get location distribution — top cities and countries. ' +\n 'Use scope=org for managed profiles only. Costs 1 credit.',\n inputSchema: orgLevelSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.scope) params.set('scope', args.scope)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/analytics/locations?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_niches',\n {\n title: 'Get Niches',\n description:\n 'Get niche/topic distribution across profiles. ' +\n 'Use scope=org for managed profiles only. Costs 1 credit.',\n inputSchema: orgLevelSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.scope) params.set('scope', args.scope)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/analytics/niches?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_network_overlap',\n {\n title: 'Get Network Overlap',\n description:\n 'Get follower/following overlap between profiles. Shows shared connections. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.identifiers?.length) params.set('profile_ids', args.identifiers.join(','))\n if (args.list_id) params.set('list_id', args.list_id)\n if (args.campaign_id) params.set('campaign_id', args.campaign_id)\n const result = await client.get(`/analytics/network-overlap?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_shared_hashtags',\n {\n title: 'Get Shared Hashtags',\n description:\n 'Get hashtags shared across a set of profiles. Shows common themes and topics. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.identifiers?.length) params.set('usernames', args.identifiers.join(','))\n if (args.list_id) params.set('list_id', args.list_id)\n if (args.campaign_id) params.set('campaign_id', args.campaign_id)\n const result = await client.get(`/analytics/shared-hashtags?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_hashtag_creators',\n {\n title: 'Get Hashtag Creators',\n description:\n 'Find creators who use specific hashtags. Useful for discovering creators by topic. Costs 1 credit.',\n inputSchema: z.object({\n hashtags: z.array(z.string()).describe(\"Hashtags to search for (without #, e.g. ['fitness', 'gym'])\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('hashtags', args.hashtags.join(','))\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const result = await client.get(`/analytics/hashtag-creators?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_affinity_posts',\n {\n title: 'Get Affinity Posts',\n description:\n 'Get posts linked to a brand/topic affinity term. Searches globally across all profiles. Costs 1 credit.',\n inputSchema: z.object({\n affinity: z.string().describe('Affinity term to search for (e.g. \"photography\", \"Nike\", \"fitness\")'),\n affinity_type: z.enum(['all', 'topic', 'brand', 'location', 'category']).optional().describe(\"Filter by affinity type (default: 'all')\"),\n min_engagement: z.number().int().optional().describe('Minimum total engagement'),\n sort: z.enum(['engagement', 'date']).optional().describe(\"Sort order (default: 'engagement')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('affinity', args.affinity)\n if (args.affinity_type) params.set('affinity_type', args.affinity_type)\n if (args.min_engagement !== undefined) params.set('min_engagement', String(args.min_engagement))\n if (args.sort) params.set('sort', args.sort)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/analytics/affinity-posts?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'analyze_cohort',\n {\n title: 'Analyze Cohort',\n description:\n 'Run a full cohort analysis on a set of profiles. Includes demographics, affinities, ' +\n 'hashtag usage, and aggregate stats. Costs 2 credits.',\n inputSchema: z.object({\n profiles: z.array(z.string()).optional().describe('Array of usernames or profile IDs'),\n source: z.object({\n type: z.enum(['followers', 'following']).describe(\"Source type: 'followers' or 'following'\"),\n target: z.string().describe('Username or ig:ID of the seed profile'),\n limit: z.number().int().optional().describe('Max profiles to resolve from network (default 500, max 10000)'),\n }).optional().describe('Alternative: analyze followers/following of a profile'),\n list_id: z.string().optional().describe('List UUID — analyze all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — analyze all creators in this campaign'),\n include: z.array(z.string()).optional().describe(\"Data to include: ['affinities', 'demographics', 'locations', 'niches', 'engagement_stats', 'hashtags', 'account_stats']\"),\n }),\n },\n async (args) => {\n const result = await client.post('/analytics/cohort', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_cohort_stats',\n {\n title: 'Get Cohort Stats',\n description:\n 'Get aggregate statistics for a cohort — average followers, engagement rate, etc. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.identifiers?.length) params.set('profiles', args.identifiers.join(','))\n if (args.list_id) params.set('list_id', args.list_id)\n if (args.campaign_id) params.set('campaign_id', args.campaign_id)\n const result = await client.get(`/analytics/cohort/stats?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'filter_cohort',\n {\n title: 'Filter Cohort',\n description:\n 'Filter a cohort of profiles by advanced criteria — follower range, engagement rate, ' +\n 'niche, location, affinities, and more. Costs 2 credits.',\n inputSchema: z.object({\n profiles: z.array(z.string()).optional().describe('Array of usernames or profile IDs to filter'),\n source: z.object({\n type: z.enum(['followers', 'following']).describe(\"Source type: 'followers' or 'following'\"),\n target: z.string().describe('Username or ig:ID of the seed profile'),\n limit: z.number().int().optional().describe('Max profiles to resolve from network (default 500, max 10000)'),\n }).optional().describe('Alternative: filter followers/following of a profile'),\n list_id: z.string().optional().describe('List UUID — filter all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — filter all creators in this campaign'),\n filters: z.record(z.string(), z.unknown()).optional().describe('Filter criteria (varies by field)'),\n }),\n },\n async (args) => {\n const result = await client.post('/analytics/cohort/filter', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_posting_times',\n {\n title: 'Get Posting Times',\n description:\n 'Get posting time patterns (day-of-week + hour heatmap), content format distribution, and sentiment analysis for a cohort. ' +\n 'Useful for finding optimal posting times. Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).optional().describe('Array of usernames or profile IDs to analyze'),\n list_id: z.string().optional().describe('List UUID — analyze all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — analyze all creators in this campaign'),\n platform: z.enum(['instagram', 'tiktok']).optional().describe(\"Platform to analyze (default: 'instagram')\"),\n days: z.number().int().min(1).max(365).optional().describe('Number of days to look back (default: 90)'),\n sample_max: z.number().int().min(1).max(50000).optional().describe('Max posts to sample (default: 5000)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.identifiers?.length) params.set('profiles', args.identifiers.join(','))\n if (args.list_id) params.set('list_id', args.list_id)\n if (args.campaign_id) params.set('campaign_id', args.campaign_id)\n if (args.platform) params.set('platform', args.platform)\n if (args.days !== undefined) params.set('days', String(args.days))\n if (args.sample_max !== undefined) params.set('sample_max', String(args.sample_max))\n // Call v1 analytics posting-times endpoint\n const result = await client.get(`/analytics/posting-times?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Content tools — Post search\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerContentTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'search_content',\n {\n title: 'Search Content',\n description:\n 'Search posts across the creator database by keywords, hashtags, or mentions. ' +\n 'Returns matching posts with engagement metrics and media. Costs 1 credit.',\n inputSchema: z.object({\n query: z.string().describe('Search query — matches post captions (required)'),\n author: z.string().optional().describe('Filter by creator username'),\n min_engagement: z.number().int().optional().describe('Minimum total engagement (likes + comments)'),\n since: z.string().optional().describe('Only posts after this date (ISO 8601, e.g. 2025-01-01)'),\n sort: z.enum(['relevance', 'engagement', 'date']).optional().describe(\"Sort order (default: 'relevance')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('query', args.query)\n if (args.author) params.set('author', args.author)\n if (args.min_engagement !== undefined) params.set('min_engagement', String(args.min_engagement))\n if (args.since) params.set('since', args.since)\n if (args.sort) params.set('sort', args.sort)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n const result = await client.get(`/content/search?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n // ============================================================================\n // Semantic Content Search (Phase 3 Embeddings)\n // ============================================================================\n\n server.registerTool(\n 'semantic_search_content',\n {\n title: 'Semantic Search Content',\n description:\n 'Search posts using AI embeddings for semantic similarity. ' +\n 'Finds conceptually related posts even without exact keyword matches. ' +\n 'Combines full-text search with vector similarity for best results. Costs 1 credit.',\n inputSchema: z.object({\n query: z.string().describe('Search query — finds semantically similar posts'),\n author: z.string().optional().describe('Filter by creator username'),\n min_engagement: z.number().int().optional().describe('Minimum total engagement'),\n since: z.string().optional().describe('Only posts after this date (ISO 8601)'),\n platform: z.enum(['instagram', 'tiktok']).optional().describe('Filter by platform'),\n alpha: z.number().min(0).max(1).optional().describe('Hybrid weight: 0=keyword only, 1=semantic only, 0.6=balanced (default)'),\n sort: z.enum(['relevance', 'engagement', 'date']).optional().describe(\"Sort order (default: 'relevance')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/content/search/semantic', {\n query: args.query,\n author: args.author,\n min_engagement: args.min_engagement,\n since: args.since,\n platform: args.platform,\n alpha: args.alpha,\n sort: args.sort,\n limit: args.limit,\n })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Manage tools — CRM operations\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerManageTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_managed_profiles',\n {\n title: 'Get Managed Profiles',\n description:\n 'Get all profiles in the CRM pipeline with their relationship statuses, ' +\n 'notes, and tags. Costs 0 credits.',\n inputSchema: z.object({\n status: z.string().optional().describe(\"Filter by relationship status (e.g. 'outreached', 'negotiating', 'contracted')\"),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.status) params.set('status', args.status)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/manage/profiles${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_crm_summary',\n {\n title: 'Get CRM Summary',\n description:\n 'Get a summary of the CRM pipeline — counts by status, recent activity, etc. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/manage/summary')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_org_stats',\n {\n title: 'Get Organization Stats',\n description:\n 'Get aggregate statistics for the organization — total profiles, enhanced profiles, ' +\n 'scraped data, and more. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/manage/stats')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'upsert_relationship',\n {\n title: 'Upsert Relationship',\n description:\n 'Create or update a CRM relationship for a creator. Set status, notes, tags. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n status: z.string().optional().describe(\"Relationship status (e.g. 'identified', 'outreached', 'negotiating', 'contracted', 'active', 'paused')\"),\n notes: z.string().optional().describe('Free-text notes about the relationship'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n }),\n },\n async (args) => {\n const { identifier, ...body } = args\n const result = await client.patch(`/manage/profiles/${encodeURIComponent(identifier)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_relationship',\n {\n title: 'Delete Relationship',\n description:\n 'Remove a creator from the CRM pipeline. Does not delete the profile itself. Costs 0 credits.',\n inputSchema: z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/manage/profiles/${encodeURIComponent(args.identifier)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'upsert_relationships_bulk',\n {\n title: 'Upsert Relationships Bulk',\n description:\n 'Bulk update notes, tags, or status for multiple CRM profiles in one call. ' +\n 'Creates relationships if they do not exist. Max 100 profiles per request. Costs 0 credits.',\n inputSchema: z.object({\n updates: z.array(z.object({\n identifier: z.string().describe('Instagram username or profile ID'),\n status: z.string().optional().describe(\"Relationship status (e.g. 'shortlisted', 'outreached', 'negotiating')\"),\n notes: z.string().optional().describe('Free-text notes about the relationship'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n })).min(1).max(100).describe('Array of profile updates (max 100)'),\n }),\n },\n async (args) => {\n const result = await client.post('/manage/profiles/bulk', { updates: args.updates })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Knowledge tools — KB folders, entries, context search\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerKnowledgeTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'list_knowledge_folders',\n {\n title: 'List Knowledge Folders',\n description: 'List all knowledge base folders in the organization. Costs 0 credits.',\n inputSchema: z.object({}),\n },\n async () => {\n const result = await client.get('/knowledge/folders')\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_knowledge_folder',\n {\n title: 'Create Knowledge Folder',\n description: 'Create a new knowledge base folder. Costs 0 credits.',\n inputSchema: z.object({\n name: z.string().describe('Folder name'),\n description: z.string().optional().describe('Optional description'),\n folder_type: z.enum(['general', 'brand', 'campaign', 'templates', 'research']).optional().describe(\"Folder type (default: 'general')\"),\n parent_folder_id: z.string().optional().describe('UUID of parent folder for nesting'),\n icon_name: z.string().optional().describe('Lucide icon name'),\n color: z.string().optional().describe('Hex color (e.g. #8b5cf6)'),\n }),\n },\n async (args) => {\n const result = await client.post('/knowledge/folders', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_folder_entries',\n {\n title: 'Get Folder Entries',\n description: 'Get all entries in a knowledge base folder. Costs 0 credits.',\n inputSchema: z.object({\n folder_id: z.string().describe('Folder UUID'),\n limit: z.number().int().min(1).max(100).optional().describe('Results per page'),\n cursor: z.string().optional().describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/knowledge/folders/${encodeURIComponent(args.folder_id)}/entries${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'create_knowledge_entry',\n {\n title: 'Create Knowledge Entry',\n description: 'Create a new knowledge base entry in a folder. Costs 0 credits.',\n inputSchema: z.object({\n folder_id: z.string().describe('Folder UUID to add the entry to'),\n name: z.string().describe('Entry name'),\n content: z.string().optional().describe('Entry content (markdown supported)'),\n description: z.string().optional().describe('Short description'),\n source_url: z.string().optional().describe('Source URL reference'),\n }),\n },\n async (args) => {\n const result = await client.post('/knowledge/entries', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_knowledge_entry',\n {\n title: 'Get Knowledge Entry',\n description: 'Get a specific knowledge base entry by ID. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/knowledge/entries/${encodeURIComponent(args.entry_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'update_knowledge_entry',\n {\n title: 'Update Knowledge Entry',\n description: 'Update a knowledge base entry. At least one field required. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n name: z.string().optional().describe('New name'),\n content: z.string().optional().describe('New content'),\n description: z.string().optional().describe('New description'),\n summary: z.string().optional().describe('New summary'),\n folder_id: z.string().optional().describe('Move to a different folder (UUID)'),\n }),\n },\n async (args) => {\n const { entry_id, ...body } = args\n const result = await client.put(`/knowledge/entries/${encodeURIComponent(entry_id)}`, body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'delete_knowledge_entry',\n {\n title: 'Delete Knowledge Entry',\n description: 'Delete a knowledge base entry. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n }),\n },\n async (args) => {\n const result = await client.delete(`/knowledge/entries/${encodeURIComponent(args.entry_id)}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'search_knowledge',\n {\n title: 'Get Knowledge Context',\n description:\n 'Get aggregated brand context from the knowledge base, organized by folder type. ' +\n 'Returns entries for AI agent consumption. Filter by folder type to get specific context. Costs 0 credits.',\n inputSchema: z.object({\n folder_types: z.array(z.string()).optional().describe(\"Filter by folder types (e.g. ['brand', 'campaign', 'research'])\"),\n max_entries: z.number().int().min(1).max(100).optional().describe('Maximum entries to return (default 20, max 100)'),\n include_summaries: z.boolean().optional().describe('Include entry summaries (default true)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.folder_types?.length) params.set('folder_types', args.folder_types.join(','))\n if (args.max_entries !== undefined) params.set('max_entries', String(args.max_entries))\n if (args.include_summaries === false) params.set('include_summaries', 'false')\n const result = await client.get(`/knowledge/context?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Enhance tools — Profile enhancement triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\nimport { creditGuard } from './credit-guard'\n\nexport function registerEnhanceTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'enhance_profiles',\n {\n title: 'Enhance Profiles',\n description:\n 'Trigger AI enhancement for one or more profiles. Enhancement adds affinities, ' +\n 'demographics, niche analysis, and more. Returns a job ID — poll with ' +\n 'get_enhancement_status to check progress. Costs 1+ credits.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to enhance'),\n mode: z.enum(['basic', 'enhanced']).optional().describe(\"Enhancement mode: 'basic' (1 credit/profile) or 'enhanced' (2 credits/profile). Default: basic\"),\n dry_run: z.boolean().optional().describe('If true, returns cost estimate without triggering enhancement'),\n auto_confirm: z.boolean().optional().describe('If true, auto-confirms the job without a separate confirm step'),\n authorize_overage: z.boolean().optional().describe('If true, allows proceeding even if credits are insufficient'),\n options: z.object({\n force: z.boolean().optional().describe('Re-enhance even if already enhanced'),\n }).optional().describe('Enhancement options'),\n confirmed: z.boolean().optional().describe('Set to true after reviewing the cost estimate to proceed with execution'),\n }),\n },\n async (args) => {\n try {\n const { identifiers, options, confirmed, authorize_overage, ...rest } = args\n\n // Credit guard: dry-run first for 100+ credit operations\n const guard = await creditGuard(\n client,\n confirmed, // Only bypass when explicitly confirmed, NOT for dry_run\n () => client.post('/enhance/profiles', { profiles: identifiers, ...rest, authorize_overage, dry_run: true }),\n `Enhance ${identifiers.length} profile${identifiers.length !== 1 ? 's' : ''}`,\n )\n\n // For dry_run, always return the dry-run data (guard executes the API call)\n if (rest.dry_run) {\n const text = guard.dryRunData ? JSON.stringify(guard.dryRunData, null, 2) : 'Dry-run failed - no data returned'\n return { content: [{ type: 'text' as const, text }] }\n }\n\n // For non-dry-run, check if confirmation is needed (≥100 credits)\n if (!guard.proceed) {\n return { content: [{ type: 'text' as const, text: guard.message || 'Confirmation required' }] }\n }\n\n const result = await client.post('/enhance/profiles', { profiles: identifiers, ...rest, authorize_overage })\n return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text' as const, text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'enhance_bulk',\n {\n title: 'Enhance Bulk',\n description:\n 'Trigger bulk enhancement for a large set of profiles from a network source (followers/following) or search filters. ' +\n 'Returns a job ID. Costs 1+ credits.',\n inputSchema: z.object({\n source: z.object({\n type: z.enum(['followers', 'following', 'both', 'search']).describe(\"Source type: 'followers'/'following'/'both' (network) or 'search' (filter-based)\"),\n target: z.string().optional().describe('Username of the seed profile (required for followers/following/both)'),\n filters: z.object({\n query: z.string().optional().describe('Search query'),\n niche: z.string().optional().describe('Filter by niche'),\n location: z.string().optional().describe('Filter by location'),\n gender: z.enum(['male', 'female', 'non_binary', 'brand']).optional().describe('Filter by gender'),\n min_followers: z.number().int().optional().describe('Minimum followers'),\n max_followers: z.number().int().optional().describe('Maximum followers'),\n has_contact: z.boolean().optional().describe('Only profiles with contact info'),\n }).optional().describe('Search filters (required for search source)'),\n limit: z.number().int().optional().describe('Max profiles to resolve from source'),\n }).describe('Source specification for profiles to enhance'),\n mode: z.enum(['basic', 'enhanced']).optional().describe(\"Enhancement mode: 'basic' (1 credit) or 'enhanced' (2 credits). Default: basic\"),\n dry_run: z.boolean().optional().describe('If true, returns cost estimate without triggering enhancement'),\n skip_already_enhanced: z.boolean().optional().describe('Skip profiles that are already enhanced'),\n auto_confirm: z.boolean().optional().describe('Auto-confirm the job without a separate confirm step'),\n authorize_overage: z.boolean().optional().describe('Allow proceeding even if credits are insufficient'),\n confirmed: z.boolean().optional().describe('Set to true after reviewing the cost estimate to proceed with execution'),\n }),\n },\n async (args) => {\n try {\n const { confirmed, authorize_overage, ...rest } = args\n\n // Credit guard: dry-run first for 100+ credit operations\n const guard = await creditGuard(\n client,\n confirmed, // Only bypass when explicitly confirmed, NOT for dry_run\n () => client.post('/enhance/bulk', { ...rest, authorize_overage, dry_run: true }),\n `Bulk enhance from ${rest.source.type} source`,\n )\n\n // For dry_run, always return the dry-run data (guard executes the API call)\n if (rest.dry_run) {\n const text = guard.dryRunData ? JSON.stringify(guard.dryRunData, null, 2) : 'Dry-run failed - no data returned'\n return { content: [{ type: 'text' as const, text }] }\n }\n\n // For non-dry-run, check if confirmation is needed (≥100 credits)\n if (!guard.proceed) {\n return { content: [{ type: 'text' as const, text: guard.message || 'Confirmation required' }] }\n }\n\n const result = await client.post('/enhance/bulk', { ...rest, authorize_overage })\n return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text' as const, text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'confirm_enhancement',\n {\n title: 'Confirm Enhancement',\n description:\n 'Confirm and start a pending enhancement job. Some jobs require confirmation ' +\n 'before processing begins (e.g. large batches). Costs 0 credits (charged at creation).',\n inputSchema: z.object({\n job_id: z.string().describe('Enhancement job ID'),\n authorize_overage: z.boolean().optional().describe('Authorize credit overage if needed'),\n }),\n },\n async (args) => {\n const result = await client.post(\n `/enhance/${encodeURIComponent(args.job_id)}/confirm`,\n { authorize_overage: args.authorize_overage },\n )\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'get_enhancement_status',\n {\n title: 'Get Enhancement Status',\n description:\n 'Check the status of an enhancement job. Returns progress, completed count, ' +\n 'and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Enhancement job ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/enhance/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Credit Guard — Pre-execution cost check for expensive MCP tool calls.\n *\n * For operations estimated at ≥100 credits the guard performs a dry-run,\n * fetches the account's current usage, and returns a human-readable\n * confirmation prompt instead of executing the operation.\n *\n * The calling tool adds a `confirmed` boolean parameter. When `confirmed`\n * is true the guard is bypassed and the real request fires immediately.\n */\n\nimport type { CelaviiClient } from '../client.js'\n\nconst CREDIT_THRESHOLD = 100\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface UsageSnapshot {\n total_credits_used: number\n credits_today: number\n plan: string | null\n tier: string | null\n allow_overage: boolean\n}\n\nexport interface CreditGuardResult {\n /** true → proceed with execution */\n proceed: boolean\n /** If proceed is false, this is the confirmation message to show */\n message?: string\n /** Raw dry-run response (forwarded when proceed is true too) */\n dryRunData?: unknown\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nasync function fetchUsage(client: CelaviiClient): Promise<UsageSnapshot> {\n try {\n const raw = (await client.get('/me')) as {\n data?: {\n usage?: { total_credits_used?: number; credits_today?: number }\n organization?: { plan?: string; allow_overage?: boolean }\n api_key?: { tier?: string }\n }\n }\n const d = raw?.data ?? (raw as Record<string, unknown>)\n const usage = (d as Record<string, unknown>)?.usage as Record<string, unknown> | undefined\n const org = (d as Record<string, unknown>)?.organization as Record<string, unknown> | undefined\n const key = (d as Record<string, unknown>)?.api_key as Record<string, unknown> | undefined\n return {\n total_credits_used: Number(usage?.total_credits_used ?? 0),\n credits_today: Number(usage?.credits_today ?? 0),\n plan: (org?.plan as string) ?? null,\n tier: (key?.tier as string) ?? null,\n allow_overage: Boolean(org?.allow_overage ?? false),\n }\n } catch {\n return { total_credits_used: 0, credits_today: 0, plan: null, tier: null, allow_overage: false }\n }\n}\n\nfunction formatConfirmation(\n action: string,\n estimatedCredits: number,\n usage: UsageSnapshot,\n dryRunData: unknown,\n): string {\n const lines: string[] = [\n '⚠️ Credit Authorization Required',\n '',\n `Action: ${action}`,\n `Estimated cost: ~${estimatedCredits} credits`,\n '',\n '── Current Account Usage ──',\n `Credits used today: ${usage.credits_today}`,\n `Total credits used: ${usage.total_credits_used}`,\n ...(usage.plan ? [`Plan: ${usage.plan}`] : []),\n ...(usage.tier ? [`API tier: ${usage.tier}`] : []),\n `Overage billing: ${usage.allow_overage ? 'enabled' : 'disabled'}`,\n '',\n '── Dry-Run Details ──',\n JSON.stringify(dryRunData, null, 2),\n '',\n 'To proceed, call this tool again with confirmed: true.',\n ]\n return lines.join('\\n')\n}\n\n// ---------------------------------------------------------------------------\n// Guard\n// ---------------------------------------------------------------------------\n\n/**\n * Run the credit guard for a tool call that supports `dry_run`.\n *\n * @param client Celavii API client\n * @param confirmed Whether the user has already confirmed\n * @param dryRunFn A function that calls the API with dry_run: true and\n * returns the raw response. The guard will extract\n * `estimated_cost.credits` from `data` or from the root.\n * @param action Human-readable description of the operation\n */\nexport async function creditGuard(\n client: CelaviiClient,\n confirmed: boolean | undefined,\n dryRunFn: () => Promise<unknown>,\n action: string,\n): Promise<CreditGuardResult> {\n // Bypass when already confirmed\n if (confirmed) {\n return { proceed: true }\n }\n\n // Execute dry-run\n const dryResult = await dryRunFn()\n\n // Extract estimated credits from common response shapes\n const root = dryResult as Record<string, unknown>\n const data = (root?.data ?? root) as Record<string, unknown>\n const estCost = data?.estimated_cost as Record<string, unknown> | undefined\n const estimatedCredits = Number(estCost?.credits ?? data?.eligible ?? 0)\n\n // If below threshold, proceed without confirmation\n if (estimatedCredits < CREDIT_THRESHOLD) {\n return { proceed: true, dryRunData: dryResult }\n }\n\n // Above threshold → fetch usage and build confirmation prompt\n const usage = await fetchUsage(client)\n const message = formatConfirmation(action, estimatedCredits, usage, data)\n\n return { proceed: false, message, dryRunData: dryResult }\n}\n","/**\n * Scrape tools — Data collection triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerScrapeTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'scrape_followers',\n {\n title: 'Scrape Followers',\n description:\n 'Trigger a follower scrape for a profile. Collects the full follower list. ' +\n 'Returns a job ID — poll with get_scrape_status. Costs 2 credits.',\n inputSchema: z.object({\n username: z.string().describe('Instagram username to scrape followers for'),\n limit: z.number().int().optional().describe('Max followers to scrape (default: all)'),\n }),\n },\n async (args) => {\n try {\n const { limit, ...rest } = args\n const result = await client.post('/scrape/followers', { ...rest, ...(limit !== undefined && { max_results: limit }) })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_following',\n {\n title: 'Scrape Following',\n description:\n 'Trigger a following scrape for a profile. Collects who they follow. ' +\n 'Returns a job ID — poll with get_scrape_status. Costs 2 credits.',\n inputSchema: z.object({\n username: z.string().describe('Instagram username to scrape following for'),\n limit: z.number().int().optional().describe('Max following to scrape (default: all)'),\n }),\n },\n async (args) => {\n try {\n const { limit, ...rest } = args\n const result = await client.post('/scrape/following', { ...rest, ...(limit !== undefined && { max_results: limit }) })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_followers_bulk',\n {\n title: 'Bulk Scrape Followers',\n description:\n 'Trigger a follower scrape for multiple profiles in a single Apify run. ' +\n 'Much more efficient than calling scrape_followers repeatedly — uses 1 API call, ' +\n '1 DB connection, and 1 Apify run instead of N. Max 50 profiles per request. ' +\n 'Returns a single job ID — poll with get_scrape_status. Costs 2 credits + processing. ' +\n 'IMPORTANT: TikTok bulk scrapes limited to 10 profiles per request due to rate limiting.',\n inputSchema: z.object({\n usernames: z.array(z.string()).max(50).optional()\n .describe('Array of usernames to scrape followers for (max 50 for Instagram, max 10 for TikTok)'),\n profile_ids: z.array(z.string()).max(50).optional()\n .describe('Array of profile IDs (ig:XXX or tt:XXX) to scrape followers for (max 50 for Instagram, max 10 for TikTok)'),\n limit: z.number().int().optional()\n .describe('Max followers to scrape per profile (default: 10000)'),\n platform: z.enum(['instagram', 'tiktok']).optional()\n .describe('Platform override — auto-detected from profiles if not specified'),\n dry_run: z.boolean().optional()\n .describe('If true, returns cost estimate without triggering the scrape'),\n }),\n },\n async (args) => {\n try {\n const body: Record<string, unknown> = {}\n if (args.usernames) body.usernames = args.usernames\n if (args.profile_ids) body.profile_ids = args.profile_ids\n if (args.limit !== undefined) body.max_results_per_profile = args.limit\n if (args.platform) body.platform = args.platform\n if (args.dry_run !== undefined) body.dry_run = args.dry_run\n const result = await client.post('/scrape/followers/bulk', body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_following_bulk',\n {\n title: 'Bulk Scrape Following',\n description:\n 'Trigger a following scrape for multiple profiles in a single Apify run. ' +\n 'Much more efficient than calling scrape_following repeatedly — uses 1 API call, ' +\n '1 DB connection, and 1 Apify run instead of N. Max 50 profiles per request. ' +\n 'Returns a single job ID — poll with get_scrape_status. Costs 2 credits + processing. ' +\n 'IMPORTANT: TikTok bulk scrapes limited to 10 profiles per request due to rate limiting.',\n inputSchema: z.object({\n usernames: z.array(z.string()).max(50).optional()\n .describe('Array of usernames to scrape following for (max 50 for Instagram, max 10 for TikTok)'),\n profile_ids: z.array(z.string()).max(50).optional()\n .describe('Array of profile IDs (ig:XXX or tt:XXX) to scrape following for (max 50 for Instagram, max 10 for TikTok)'),\n limit: z.number().int().optional()\n .describe('Max following to scrape per profile (default: 10000)'),\n platform: z.enum(['instagram', 'tiktok']).optional()\n .describe('Platform override — auto-detected from profiles if not specified'),\n dry_run: z.boolean().optional()\n .describe('If true, returns cost estimate without triggering the scrape'),\n }),\n },\n async (args) => {\n try {\n const body: Record<string, unknown> = {}\n if (args.usernames) body.usernames = args.usernames\n if (args.profile_ids) body.profile_ids = args.profile_ids\n if (args.limit !== undefined) body.max_results_per_profile = args.limit\n if (args.platform) body.platform = args.platform\n if (args.dry_run !== undefined) body.dry_run = args.dry_run\n const result = await client.post('/scrape/following/bulk', body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_locations',\n {\n title: 'Scrape Locations',\n description:\n 'Scrape posts from a specific Instagram location/place. ' +\n 'Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n location_id: z.string().optional().describe('Instagram location ID'),\n location_name: z.string().optional().describe('Location name to search for'),\n limit: z.number().int().optional().describe('Max posts to scrape'),\n }),\n },\n async (args) => {\n try {\n const body: Record<string, unknown> = {}\n if (args.location_id) body.location_ids = [args.location_id]\n if (args.location_name) body.start_urls = [`https://www.instagram.com/explore/locations/${args.location_name}/`]\n if (args.limit !== undefined) body.max_items = args.limit\n const result = await client.post('/scrape/locations', body)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_hashtags',\n {\n title: 'Scrape Hashtags',\n description:\n 'Scrape posts from a specific hashtag. Collects recent posts using that hashtag. ' +\n 'Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n hashtag: z.string().describe('Hashtag to scrape (without #)'),\n limit: z.number().int().optional().describe('Max posts to scrape'),\n }),\n },\n async (args) => {\n try {\n const result = await client.post('/scrape/hashtags', {\n hashtags: [args.hashtag],\n ...(args.limit !== undefined && { max_items: args.limit }),\n })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'scrape_urls',\n {\n title: 'Scrape URLs',\n description:\n 'Scrape specific Instagram post or reel URLs. Extracts engagement data, ' +\n 'comments, and media. Returns a job ID. Costs 1 credit.',\n inputSchema: z.object({\n urls: z.array(z.string()).describe('Array of Instagram post/reel URLs'),\n }),\n },\n async (args) => {\n try {\n const result = await client.post('/scrape/urls', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'get_scrape_status',\n {\n title: 'Get Scrape Status',\n description:\n 'Check the status of a scrape job. Returns progress and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Scrape job ID'),\n }),\n },\n async (args) => {\n try {\n const result = await client.get(`/scrape/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text', text: `Error: ${message}` }] }\n }\n },\n )\n}\n","/**\n * Refine tools — AI refinement triggers + status\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\nimport { creditGuard } from './credit-guard'\n\nexport function registerRefineTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'refine_profiles',\n {\n title: 'Refine Profiles',\n description:\n 'Trigger AI refinement for one or more profiles. Refinement uses AI to ' +\n 'improve and enrich profile data — better niche classification, bio analysis, ' +\n 'content themes, etc. Returns a job ID — poll with get_refinement_status. Costs 1+ credits.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).optional().describe('Array of usernames or profile IDs to refine'),\n list_id: z.string().optional().describe('List UUID — refine all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — refine all creators in this campaign'),\n dry_run: z.boolean().optional().describe('If true, returns cost estimate without triggering refinement'),\n skip_already_refined: z.boolean().optional().describe('Skip profiles that have already been refined'),\n confirmed: z.boolean().optional().describe('Set to true after reviewing the cost estimate to proceed with execution'),\n }),\n },\n async (args) => {\n try {\n const { identifiers, list_id, campaign_id, confirmed, ...rest } = args\n\n // Build request body based on input mode\n const bodyBase: Record<string, unknown> = { ...rest }\n if (identifiers && identifiers.length > 0) {\n bodyBase.profiles = identifiers\n } else if (list_id) {\n bodyBase.list_id = list_id\n } else if (campaign_id) {\n bodyBase.campaign_id = campaign_id\n } else {\n return { content: [{ type: 'text' as const, text: 'Error: Provide identifiers, list_id, or campaign_id' }] }\n }\n\n // Determine label for credit guard\n const label = list_id\n ? `Refine list ${list_id}`\n : campaign_id\n ? `Refine campaign ${campaign_id}`\n : `Refine ${identifiers?.length || 0} profile${(identifiers?.length || 0) !== 1 ? 's' : ''}`\n\n // Credit guard: dry-run first for 100+ credit operations\n const guard = await creditGuard(\n client,\n confirmed, // Only bypass when explicitly confirmed, NOT for dry_run\n () => client.post('/refine/profiles', { ...bodyBase, dry_run: true }),\n label,\n )\n\n // For dry_run, always return the dry-run data (guard executes the API call)\n if (rest.dry_run) {\n const text = guard.dryRunData ? JSON.stringify(guard.dryRunData, null, 2) : 'Dry-run failed - no data returned'\n return { content: [{ type: 'text' as const, text }] }\n }\n\n // For non-dry-run, check if confirmation is needed (≥100 credits)\n if (!guard.proceed) {\n return { content: [{ type: 'text' as const, text: guard.message || 'Confirmation required' }] }\n }\n\n const result = await client.post('/refine/profiles', bodyBase)\n return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }] }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { content: [{ type: 'text' as const, text: `Error: ${message}` }] }\n }\n },\n )\n\n server.registerTool(\n 'get_refinement_status',\n {\n title: 'Get Refinement Status',\n description:\n 'Check the status of a refinement job. Returns progress and results when done. Costs 0 credits.',\n inputSchema: z.object({\n job_id: z.string().describe('Refinement job ID'),\n }),\n },\n async (args) => {\n const result = await client.get(`/refine/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n","/**\n * Jobs tools — Job coverage and status tracking\n */\n\nimport { z } from 'zod'\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { CelaviiClient } from '../client.js'\n\nexport function registerJobsTools(server: McpServer, client: CelaviiClient) {\n server.registerTool(\n 'get_job_coverage',\n {\n title: 'Get Job Coverage',\n description:\n 'Get aggregate job coverage stats for a list or campaign — shows how many profiles have been enhanced, refined, ' +\n 'or scraped (followers/following) and how many are pending or not started. ' +\n 'Provide a list_id or campaign_id. Optionally filter by job_type or platform. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().optional().describe('List UUID — get coverage for all members of this list'),\n campaign_id: z.string().optional().describe('Campaign UUID — get coverage for all creators in this campaign'),\n job_type: z.enum(['enhance', 'refine', 'followers_scrape', 'following_scrape']).optional()\n .describe(\"Filter to a single job type (default: all)\"),\n platform: z.enum(['instagram', 'tiktok']).optional()\n .describe(\"Filter by platform (default: all)\"),\n tags: z.array(z.string()).optional().describe('Filter by tags (reserved for future use)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.list_id) params.set('list_id', args.list_id)\n if (args.campaign_id) params.set('campaign_id', args.campaign_id)\n if (args.job_type) params.set('job_type', args.job_type)\n if (args.platform) params.set('platform', args.platform)\n if (args.tags?.length) params.set('tags', args.tags.join(','))\n const result = await client.get(`/jobs/coverage?${params}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n\n server.registerTool(\n 'list_jobs',\n {\n title: 'List Jobs',\n description:\n 'List all jobs for the organization — enhancement, refinement, and scrape jobs. ' +\n 'Returns a unified view sorted by most recent. Filter by type and/or status. Costs 0 credits.',\n inputSchema: z.object({\n type: z.enum(['enhance', 'refine', 'followers_scrape', 'following_scrape']).optional()\n .describe('Filter by job type (default: all)'),\n status: z.string().optional()\n .describe(\"Filter by status (e.g. 'completed', 'failed', 'processing', 'pending', 'queued')\"),\n limit: z.number().int().min(1).max(100).optional()\n .describe('Results per page (default 25, max 100)'),\n cursor: z.string().optional()\n .describe('Pagination cursor'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n if (args.type) params.set('type', args.type)\n if (args.status) params.set('status', args.status)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\n if (args.cursor) params.set('cursor', args.cursor)\n const qs = params.toString()\n const result = await client.get(`/jobs${qs ? `?${qs}` : ''}`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\n },\n )\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","z","z"]}
|
package/package.json
CHANGED