celavii-mcp 0.1.0 → 0.1.3

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/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # Celavii MCP Server
2
2
 
3
- Connect your [Celavii](https://celavii.com) account to AI-powered IDEs and assistants — Windsurf, Cursor, Claude Code, Claude.ai, VS Code + Copilot, Cline, Zed, and more.
3
+ Connect your [Celavii](https://www.celavii.com) account to AI-powered IDEs and assistants — Windsurf, Cursor, Claude Code, Claude.ai, VS Code + Copilot, Cline, Zed, and more.
4
4
 
5
5
  ## Quick Start
6
6
 
7
7
  ### 1. Get your API key
8
8
 
9
- Go to [celavii.com/settings/api-keys](https://celavii.com/settings/api-keys) and create an API key.
9
+ Go to [celavii.com/settings/api-keys](https://www.celavii.com/settings/api-keys) and create an API key.
10
10
 
11
11
  ### 2. Add to your IDE
12
12
 
@@ -77,7 +77,7 @@ Ask your AI assistant things like:
77
77
  | Variable | Required | Description |
78
78
  |----------|----------|-------------|
79
79
  | `CELAVII_API_KEY` | **Yes** | Your Celavii API key (`cvii_live_...`) |
80
- | `CELAVII_BASE_URL` | No | Override the API base URL (default: `https://celavii.com/api/v1`) |
80
+ | `CELAVII_BASE_URL` | No | Override the API base URL (default: `https://www.celavii.com/api/v1`) |
81
81
 
82
82
  ## Credits & Rate Limits
83
83
 
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
7
7
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
8
 
9
9
  // src/client.ts
10
- var DEFAULT_BASE_URL = "https://celavii.com/api/v1";
10
+ var DEFAULT_BASE_URL = "https://www.celavii.com/api/v1";
11
11
  var CelaviiApiError = class extends Error {
12
12
  constructor(message, code, status, retryAfter) {
13
13
  super(message);
@@ -162,7 +162,7 @@ function registerProfileTools(server, client) {
162
162
  },
163
163
  async (args) => {
164
164
  const params = new URLSearchParams();
165
- params.set("affinities", args.affinities.join(","));
165
+ params.set("terms", args.affinities.join(","));
166
166
  if (args.match_mode) params.set("match_mode", args.match_mode);
167
167
  if (args.min_followers !== void 0) params.set("min_followers", String(args.min_followers));
168
168
  if (args.max_followers !== void 0) params.set("max_followers", String(args.max_followers));
@@ -182,7 +182,7 @@ function registerProfileTools(server, client) {
182
182
  })
183
183
  },
184
184
  async (args) => {
185
- const result = await client.post("/profiles/bulk", { identifiers: args.identifiers });
185
+ const result = await client.post("/profiles/bulk", { profiles: args.identifiers });
186
186
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
187
187
  }
188
188
  );
@@ -492,7 +492,7 @@ function registerListTools(server, client) {
492
492
  async (args) => {
493
493
  const params = new URLSearchParams();
494
494
  if (args.limit !== void 0) params.set("limit", String(args.limit));
495
- if (args.cursor) params.set("cursor", args.cursor);
495
+ if (args.cursor) params.set("offset", args.cursor);
496
496
  const qs = params.toString();
497
497
  const result = await client.get(`/lists/${encodeURIComponent(args.list_id)}/members${qs ? `?${qs}` : ""}`);
498
498
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
@@ -511,7 +511,7 @@ function registerListTools(server, client) {
511
511
  async (args) => {
512
512
  const result = await client.post(
513
513
  `/lists/${encodeURIComponent(args.list_id)}/members`,
514
- { identifiers: args.identifiers }
514
+ { profiles: args.identifiers }
515
515
  );
516
516
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
517
517
  }
@@ -529,7 +529,7 @@ function registerListTools(server, client) {
529
529
  async (args) => {
530
530
  const result = await client.delete(
531
531
  `/lists/${encodeURIComponent(args.list_id)}/members`,
532
- { identifiers: args.identifiers }
532
+ { profiles: args.identifiers }
533
533
  );
534
534
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
535
535
  }
@@ -538,28 +538,43 @@ function registerListTools(server, client) {
538
538
 
539
539
  // src/tools/analytics.ts
540
540
  import { z as z5 } from "zod";
541
+ var demographicsSchema = z5.object({
542
+ profile_ids: z5.array(z5.string()).optional().describe("Array of usernames or profile IDs to analyze"),
543
+ scope: z5.enum(["global", "org"]).optional().describe("'global' (default, all profiles) or 'org' (managed only)")
544
+ });
545
+ var orgLevelSchema = z5.object({
546
+ scope: z5.enum(["global", "org"]).optional().describe("'global' (default, all profiles) or 'org' (managed only)"),
547
+ limit: z5.number().int().min(1).max(100).optional().describe("Max results (default 20, max 100)")
548
+ });
541
549
  var profileSourceSchema = z5.object({
542
550
  identifiers: z5.array(z5.string()).optional().describe("Array of usernames or profile IDs to analyze"),
543
551
  list_id: z5.string().optional().describe("List UUID \u2014 analyze all members of this list"),
544
552
  campaign_id: z5.string().optional().describe("Campaign UUID \u2014 analyze all creators in this campaign")
545
553
  });
546
- function buildSourceParams(args) {
547
- const params = new URLSearchParams();
548
- if (args.identifiers?.length) params.set("identifiers", args.identifiers.join(","));
549
- if (args.list_id) params.set("list_id", args.list_id);
550
- if (args.campaign_id) params.set("campaign_id", args.campaign_id);
551
- return params;
554
+ async function resolveIdentifiers(client, args) {
555
+ if (args.identifiers?.length) return args.identifiers;
556
+ if (args.list_id) {
557
+ const resp = await client.get(`/lists/${args.list_id}/members?limit=100`);
558
+ return (resp.data || []).map((m) => m.username || m.profile_id || "").filter(Boolean);
559
+ }
560
+ if (args.campaign_id) {
561
+ const resp = await client.get(`/campaigns/${args.campaign_id}/creators?limit=100`);
562
+ return (resp.data || []).map((m) => m.username || m.profile_id || "").filter(Boolean);
563
+ }
564
+ return [];
552
565
  }
553
566
  function registerAnalyticsTools(server, client) {
554
567
  server.registerTool(
555
568
  "get_demographics",
556
569
  {
557
570
  title: "Get Demographics",
558
- description: "Get audience demographics breakdown (age, gender distribution) for a set of profiles. Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.",
559
- inputSchema: profileSourceSchema
571
+ description: "Get audience demographics breakdown (age, gender distribution). Optionally pass profile_ids to analyze a subset, or scope=org for managed profiles only. Costs 1 credit.",
572
+ inputSchema: demographicsSchema
560
573
  },
561
574
  async (args) => {
562
- const params = buildSourceParams(args);
575
+ const params = new URLSearchParams();
576
+ if (args.profile_ids?.length) params.set("profile_ids", args.profile_ids.join(","));
577
+ if (args.scope) params.set("scope", args.scope);
563
578
  const result = await client.get(`/analytics/demographics?${params}`);
564
579
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
565
580
  }
@@ -568,11 +583,13 @@ function registerAnalyticsTools(server, client) {
568
583
  "get_locations",
569
584
  {
570
585
  title: "Get Locations",
571
- description: "Get location distribution for a set of profiles \u2014 top cities and countries. Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.",
572
- inputSchema: profileSourceSchema
586
+ description: "Get location distribution \u2014 top cities and countries. Use scope=org for managed profiles only. Costs 1 credit.",
587
+ inputSchema: orgLevelSchema
573
588
  },
574
589
  async (args) => {
575
- const params = buildSourceParams(args);
590
+ const params = new URLSearchParams();
591
+ if (args.scope) params.set("scope", args.scope);
592
+ if (args.limit !== void 0) params.set("limit", String(args.limit));
576
593
  const result = await client.get(`/analytics/locations?${params}`);
577
594
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
578
595
  }
@@ -581,11 +598,13 @@ function registerAnalyticsTools(server, client) {
581
598
  "get_niches",
582
599
  {
583
600
  title: "Get Niches",
584
- description: "Get niche/topic distribution for a set of profiles. Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.",
585
- inputSchema: profileSourceSchema
601
+ description: "Get niche/topic distribution across profiles. Use scope=org for managed profiles only. Costs 1 credit.",
602
+ inputSchema: orgLevelSchema
586
603
  },
587
604
  async (args) => {
588
- const params = buildSourceParams(args);
605
+ const params = new URLSearchParams();
606
+ if (args.scope) params.set("scope", args.scope);
607
+ if (args.limit !== void 0) params.set("limit", String(args.limit));
589
608
  const result = await client.get(`/analytics/niches?${params}`);
590
609
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
591
610
  }
@@ -598,7 +617,9 @@ function registerAnalyticsTools(server, client) {
598
617
  inputSchema: profileSourceSchema
599
618
  },
600
619
  async (args) => {
601
- const params = buildSourceParams(args);
620
+ const ids = await resolveIdentifiers(client, args);
621
+ const params = new URLSearchParams();
622
+ if (ids.length) params.set("profile_ids", ids.join(","));
602
623
  const result = await client.get(`/analytics/network-overlap?${params}`);
603
624
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
604
625
  }
@@ -611,7 +632,9 @@ function registerAnalyticsTools(server, client) {
611
632
  inputSchema: profileSourceSchema
612
633
  },
613
634
  async (args) => {
614
- const params = buildSourceParams(args);
635
+ const ids = await resolveIdentifiers(client, args);
636
+ const params = new URLSearchParams();
637
+ if (ids.length) params.set("usernames", ids.join(","));
615
638
  const result = await client.get(`/analytics/shared-hashtags?${params}`);
616
639
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
617
640
  }
@@ -640,17 +663,21 @@ function registerAnalyticsTools(server, client) {
640
663
  "get_affinity_posts",
641
664
  {
642
665
  title: "Get Affinity Posts",
643
- description: "Get posts that demonstrate brand/topic affinities for specific creators. Costs 1 credit.",
666
+ description: "Get posts linked to a brand/topic affinity term. Searches globally across all profiles. Costs 1 credit.",
644
667
  inputSchema: z5.object({
645
- identifiers: z5.array(z5.string()).describe("Array of usernames or profile IDs"),
646
- affinity: z5.string().optional().describe("Filter to a specific affinity term"),
668
+ affinity: z5.string().describe('Affinity term to search for (e.g. "photography", "Nike", "fitness")'),
669
+ affinity_type: z5.enum(["all", "topic", "brand", "location", "category"]).optional().describe("Filter by affinity type (default: 'all')"),
670
+ min_engagement: z5.number().int().optional().describe("Minimum total engagement"),
671
+ sort: z5.enum(["engagement", "date"]).optional().describe("Sort order (default: 'engagement')"),
647
672
  limit: z5.number().int().min(1).max(100).optional().describe("Results per page (default 25, max 100)")
648
673
  })
649
674
  },
650
675
  async (args) => {
651
676
  const params = new URLSearchParams();
652
- params.set("identifiers", args.identifiers.join(","));
653
- if (args.affinity) params.set("affinity", args.affinity);
677
+ params.set("affinity", args.affinity);
678
+ if (args.affinity_type) params.set("affinity_type", args.affinity_type);
679
+ if (args.min_engagement !== void 0) params.set("min_engagement", String(args.min_engagement));
680
+ if (args.sort) params.set("sort", args.sort);
654
681
  if (args.limit !== void 0) params.set("limit", String(args.limit));
655
682
  const result = await client.get(`/analytics/affinity-posts?${params}`);
656
683
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
@@ -683,7 +710,9 @@ function registerAnalyticsTools(server, client) {
683
710
  inputSchema: profileSourceSchema
684
711
  },
685
712
  async (args) => {
686
- const params = buildSourceParams(args);
713
+ const ids = await resolveIdentifiers(client, args);
714
+ const params = new URLSearchParams();
715
+ if (ids.length) params.set("profiles", ids.join(","));
687
716
  const result = await client.get(`/analytics/cohort/stats?${params}`);
688
717
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
689
718
  }
@@ -718,24 +747,22 @@ function registerContentTools(server, client) {
718
747
  title: "Search Content",
719
748
  description: "Search posts across the creator database by keywords, hashtags, or mentions. Returns matching posts with engagement metrics and media. Costs 1 credit.",
720
749
  inputSchema: z6.object({
721
- query: z6.string().optional().describe("Search query \u2014 matches post captions"),
722
- hashtag: z6.string().optional().describe("Filter by hashtag (without #)"),
723
- username: z6.string().optional().describe("Filter by creator username"),
724
- min_likes: z6.number().int().optional().describe("Minimum likes"),
725
- min_comments: z6.number().int().optional().describe("Minimum comments"),
726
- limit: z6.number().int().min(1).max(100).optional().describe("Results per page (default 25, max 100)"),
727
- cursor: z6.string().optional().describe("Pagination cursor")
750
+ query: z6.string().describe("Search query \u2014 matches post captions (required)"),
751
+ author: z6.string().optional().describe("Filter by creator username"),
752
+ min_engagement: z6.number().int().optional().describe("Minimum total engagement (likes + comments)"),
753
+ since: z6.string().optional().describe("Only posts after this date (ISO 8601, e.g. 2025-01-01)"),
754
+ sort: z6.enum(["relevance", "engagement", "date"]).optional().describe("Sort order (default: 'relevance')"),
755
+ limit: z6.number().int().min(1).max(100).optional().describe("Results per page (default 25, max 100)")
728
756
  })
729
757
  },
730
758
  async (args) => {
731
759
  const params = new URLSearchParams();
732
- if (args.query) params.set("query", args.query);
733
- if (args.hashtag) params.set("hashtag", args.hashtag);
734
- if (args.username) params.set("username", args.username);
735
- if (args.min_likes !== void 0) params.set("min_likes", String(args.min_likes));
736
- if (args.min_comments !== void 0) params.set("min_comments", String(args.min_comments));
760
+ params.set("query", args.query);
761
+ if (args.author) params.set("author", args.author);
762
+ if (args.min_engagement !== void 0) params.set("min_engagement", String(args.min_engagement));
763
+ if (args.since) params.set("since", args.since);
764
+ if (args.sort) params.set("sort", args.sort);
737
765
  if (args.limit !== void 0) params.set("limit", String(args.limit));
738
- if (args.cursor) params.set("cursor", args.cursor);
739
766
  const result = await client.get(`/content/search?${params}`);
740
767
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
741
768
  }
@@ -846,7 +873,11 @@ function registerKnowledgeTools(server, client) {
846
873
  description: "Create a new knowledge base folder. Costs 0 credits.",
847
874
  inputSchema: z8.object({
848
875
  name: z8.string().describe("Folder name"),
849
- description: z8.string().optional().describe("Optional description")
876
+ description: z8.string().optional().describe("Optional description"),
877
+ folder_type: z8.enum(["general", "brand", "campaign", "templates", "research"]).optional().describe("Folder type (default: 'general')"),
878
+ parent_folder_id: z8.string().optional().describe("UUID of parent folder for nesting"),
879
+ icon_name: z8.string().optional().describe("Lucide icon name"),
880
+ color: z8.string().optional().describe("Hex color (e.g. #8b5cf6)")
850
881
  })
851
882
  },
852
883
  async (args) => {
@@ -881,8 +912,10 @@ function registerKnowledgeTools(server, client) {
881
912
  description: "Create a new knowledge base entry in a folder. Costs 0 credits.",
882
913
  inputSchema: z8.object({
883
914
  folder_id: z8.string().describe("Folder UUID to add the entry to"),
884
- title: z8.string().describe("Entry title"),
885
- content: z8.string().describe("Entry content (markdown supported)")
915
+ name: z8.string().describe("Entry name"),
916
+ content: z8.string().optional().describe("Entry content (markdown supported)"),
917
+ description: z8.string().optional().describe("Short description"),
918
+ source_url: z8.string().optional().describe("Source URL reference")
886
919
  })
887
920
  },
888
921
  async (args) => {
@@ -908,11 +941,14 @@ function registerKnowledgeTools(server, client) {
908
941
  "update_knowledge_entry",
909
942
  {
910
943
  title: "Update Knowledge Entry",
911
- description: "Update a knowledge base entry title or content. Costs 0 credits.",
944
+ description: "Update a knowledge base entry. At least one field required. Costs 0 credits.",
912
945
  inputSchema: z8.object({
913
946
  entry_id: z8.string().describe("Entry UUID"),
914
- title: z8.string().optional().describe("New title"),
915
- content: z8.string().optional().describe("New content")
947
+ name: z8.string().optional().describe("New name"),
948
+ content: z8.string().optional().describe("New content"),
949
+ description: z8.string().optional().describe("New description"),
950
+ summary: z8.string().optional().describe("New summary"),
951
+ folder_id: z8.string().optional().describe("Move to a different folder (UUID)")
916
952
  })
917
953
  },
918
954
  async (args) => {
@@ -938,19 +974,19 @@ function registerKnowledgeTools(server, client) {
938
974
  server.registerTool(
939
975
  "search_knowledge",
940
976
  {
941
- title: "Search Knowledge",
942
- description: "Semantic search across the knowledge base. Returns matching entries ranked by relevance. Useful for finding brand guidelines, campaign briefs, etc. Costs 0 credits.",
977
+ title: "Get Knowledge Context",
978
+ description: "Get aggregated brand context from the knowledge base, organized by folder type. Returns entries for AI agent consumption. Filter by folder type to get specific context. Costs 0 credits.",
943
979
  inputSchema: z8.object({
944
- query: z8.string().describe("Search query"),
945
- folder_id: z8.string().optional().describe("Limit search to a specific folder"),
946
- limit: z8.number().int().min(1).max(20).optional().describe("Number of results (default 5, max 20)")
980
+ folder_types: z8.array(z8.string()).optional().describe("Filter by folder types (e.g. ['brand', 'campaign', 'research'])"),
981
+ max_entries: z8.number().int().min(1).max(100).optional().describe("Maximum entries to return (default 20, max 100)"),
982
+ include_summaries: z8.boolean().optional().describe("Include entry summaries (default true)")
947
983
  })
948
984
  },
949
985
  async (args) => {
950
986
  const params = new URLSearchParams();
951
- params.set("query", args.query);
952
- if (args.folder_id) params.set("folder_id", args.folder_id);
953
- if (args.limit !== void 0) params.set("limit", String(args.limit));
987
+ if (args.folder_types?.length) params.set("folder_types", args.folder_types.join(","));
988
+ if (args.max_entries !== void 0) params.set("max_entries", String(args.max_entries));
989
+ if (args.include_summaries === false) params.set("include_summaries", "false");
954
990
  const result = await client.get(`/knowledge/context?${params}`);
955
991
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
956
992
  }
@@ -967,13 +1003,18 @@ function registerEnhanceTools(server, client) {
967
1003
  description: "Trigger AI enhancement for one or more profiles. Enhancement adds affinities, demographics, niche analysis, and more. Returns a job ID \u2014 poll with get_enhancement_status to check progress. Costs 1+ credits.",
968
1004
  inputSchema: z9.object({
969
1005
  identifiers: z9.array(z9.string()).describe("Array of usernames or profile IDs to enhance"),
1006
+ mode: z9.enum(["basic", "enhanced"]).optional().describe("Enhancement mode: 'basic' (1 credit/profile) or 'enhanced' (2 credits/profile). Default: basic"),
1007
+ dry_run: z9.boolean().optional().describe("If true, returns cost estimate without triggering enhancement"),
1008
+ auto_confirm: z9.boolean().optional().describe("If true, auto-confirms the job without a separate confirm step"),
1009
+ authorize_overage: z9.boolean().optional().describe("If true, allows proceeding even if credits are insufficient"),
970
1010
  options: z9.object({
971
1011
  force: z9.boolean().optional().describe("Re-enhance even if already enhanced")
972
1012
  }).optional().describe("Enhancement options")
973
1013
  })
974
1014
  },
975
1015
  async (args) => {
976
- const result = await client.post("/enhance/profiles", args);
1016
+ const { identifiers, options, ...rest } = args;
1017
+ const result = await client.post("/enhance/profiles", { profiles: identifiers, ...rest });
977
1018
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
978
1019
  }
979
1020
  );
@@ -1045,7 +1086,8 @@ function registerScrapeTools(server, client) {
1045
1086
  })
1046
1087
  },
1047
1088
  async (args) => {
1048
- const result = await client.post("/scrape/followers", args);
1089
+ const { limit, ...rest } = args;
1090
+ const result = await client.post("/scrape/followers", { ...rest, ...limit !== void 0 && { max_results: limit } });
1049
1091
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
1050
1092
  }
1051
1093
  );
@@ -1060,7 +1102,8 @@ function registerScrapeTools(server, client) {
1060
1102
  })
1061
1103
  },
1062
1104
  async (args) => {
1063
- const result = await client.post("/scrape/following", args);
1105
+ const { limit, ...rest } = args;
1106
+ const result = await client.post("/scrape/following", { ...rest, ...limit !== void 0 && { max_results: limit } });
1064
1107
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
1065
1108
  }
1066
1109
  );
@@ -1076,7 +1119,11 @@ function registerScrapeTools(server, client) {
1076
1119
  })
1077
1120
  },
1078
1121
  async (args) => {
1079
- const result = await client.post("/scrape/locations", args);
1122
+ const body = {};
1123
+ if (args.location_id) body.location_ids = [args.location_id];
1124
+ if (args.location_name) body.start_urls = [`https://www.instagram.com/explore/locations/${args.location_name}/`];
1125
+ if (args.limit !== void 0) body.max_items = args.limit;
1126
+ const result = await client.post("/scrape/locations", body);
1080
1127
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
1081
1128
  }
1082
1129
  );
@@ -1091,7 +1138,10 @@ function registerScrapeTools(server, client) {
1091
1138
  })
1092
1139
  },
1093
1140
  async (args) => {
1094
- const result = await client.post("/scrape/hashtags", args);
1141
+ const result = await client.post("/scrape/hashtags", {
1142
+ hashtags: [args.hashtag],
1143
+ ...args.limit !== void 0 && { max_items: args.limit }
1144
+ });
1095
1145
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
1096
1146
  }
1097
1147
  );
@@ -1139,7 +1189,8 @@ function registerRefineTools(server, client) {
1139
1189
  })
1140
1190
  },
1141
1191
  async (args) => {
1142
- const result = await client.post("/refine/profiles", args);
1192
+ const { identifiers, ...rest } = args;
1193
+ const result = await client.post("/refine/profiles", { profiles: identifiers, ...rest });
1143
1194
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
1144
1195
  }
1145
1196
  );
@@ -1193,7 +1244,7 @@ async function main() {
1193
1244
  const apiKey = process.env.CELAVII_API_KEY;
1194
1245
  if (!apiKey) {
1195
1246
  console.error(
1196
- "Error: CELAVII_API_KEY environment variable is required.\nGet your API key at https://celavii.com/settings/api-keys\n\nUsage:\n CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp"
1247
+ "Error: CELAVII_API_KEY environment variable is required.\nGet your API key at https://www.celavii.com/settings/api-keys\n\nUsage:\n CELAVII_API_KEY=cvii_live_xxx npx celavii-mcp"
1197
1248
  );
1198
1249
  process.exit(1);
1199
1250
  }
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/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://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://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('affinities', 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', { identifiers: 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, 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 * 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. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List 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(`/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 { identifiers: 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 { identifiers: 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/** Shared schema for profile source parameters used across analytics endpoints */\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\nfunction buildSourceParams(args: { identifiers?: string[]; list_id?: string; campaign_id?: string }): URLSearchParams {\n const params = new URLSearchParams()\n if (args.identifiers?.length) params.set('identifiers', 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 return params\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) for a set of profiles. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = buildSourceParams(args)\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 for a set of profiles — top cities and countries. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = buildSourceParams(args)\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 for a set of profiles. ' +\n 'Provide identifiers, a list_id, or a campaign_id. Costs 1 credit.',\n inputSchema: profileSourceSchema,\n },\n async (args) => {\n const params = buildSourceParams(args)\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 = buildSourceParams(args)\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 = buildSourceParams(args)\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 that demonstrate brand/topic affinities for specific creators. Costs 1 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs'),\n affinity: z.string().optional().describe('Filter to a specific affinity term'),\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('identifiers', args.identifiers.join(','))\n if (args.affinity) params.set('affinity', args.affinity)\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(['campaign', 'list', 'hashtag']).describe('Source type'),\n id: z.string().describe('Source ID (campaign UUID, list UUID, or hashtag)'),\n }).optional().describe('Alternative: analyze from a source (campaign, list, or hashtag)'),\n include: z.array(z.string()).optional().describe(\"Data to include: ['affinities', 'demographics', 'hashtags', '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 = buildSourceParams(args)\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(['campaign', 'list', 'hashtag']).describe('Source type'),\n id: z.string().describe('Source ID'),\n }).optional().describe('Alternative: filter from a source'),\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","/**\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().optional().describe('Search query — matches post captions'),\n hashtag: z.string().optional().describe('Filter by hashtag (without #)'),\n username: z.string().optional().describe('Filter by creator username'),\n min_likes: z.number().int().optional().describe('Minimum likes'),\n min_comments: z.number().int().optional().describe('Minimum comments'),\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.query) params.set('query', args.query)\n if (args.hashtag) params.set('hashtag', args.hashtag)\n if (args.username) params.set('username', args.username)\n if (args.min_likes !== undefined) params.set('min_likes', String(args.min_likes))\n if (args.min_comments !== undefined) params.set('min_comments', String(args.min_comments))\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(`/content/search?${params}`)\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","/**\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 }),\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 title: z.string().describe('Entry title'),\n content: z.string().describe('Entry content (markdown supported)'),\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 title or content. Costs 0 credits.',\n inputSchema: z.object({\n entry_id: z.string().describe('Entry UUID'),\n title: z.string().optional().describe('New title'),\n content: z.string().optional().describe('New content'),\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: 'Search Knowledge',\n description:\n 'Semantic search across the knowledge base. Returns matching entries ranked by relevance. ' +\n 'Useful for finding brand guidelines, campaign briefs, etc. Costs 0 credits.',\n inputSchema: z.object({\n query: z.string().describe('Search query'),\n folder_id: z.string().optional().describe('Limit search to a specific folder'),\n limit: z.number().int().min(1).max(20).optional().describe('Number of results (default 5, max 20)'),\n }),\n },\n async (args) => {\n const params = new URLSearchParams()\n params.set('query', args.query)\n if (args.folder_id) params.set('folder_id', args.folder_id)\n if (args.limit !== undefined) params.set('limit', String(args.limit))\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'\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 options: z.object({\n force: z.boolean().optional().describe('Re-enhance even if already enhanced'),\n }).optional().describe('Enhancement options'),\n }),\n },\n async (args) => {\n const result = await client.post('/enhance/profiles', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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 list or campaign). ' +\n 'Returns a job ID. Costs 1+ credits.',\n inputSchema: z.object({\n source: z.object({\n type: z.enum(['list', 'campaign']).describe('Source type'),\n id: z.string().describe('List or campaign UUID'),\n }).describe('Source of profiles to enhance'),\n options: z.object({\n force: z.boolean().optional().describe('Re-enhance even if already enhanced'),\n }).optional().describe('Enhancement options'),\n }),\n },\n async (args) => {\n const result = await client.post('/enhance/bulk', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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 * 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 const result = await client.post('/scrape/followers', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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 const result = await client.post('/scrape/following', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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 const result = await client.post('/scrape/locations', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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 const result = await client.post('/scrape/hashtags', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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 const result = await client.post('/scrape/urls', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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 const result = await client.get(`/scrape/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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'\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 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to refine'),\n type: z.string().optional().describe('Refinement type (e.g. niche, demographics, full)'),\n }),\n },\n async (args) => {\n const result = await client.post('/refine/profiles', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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"]}
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/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, 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 * 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. Costs 0 credits.',\n inputSchema: z.object({\n list_id: z.string().describe('List 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('offset', args.cursor)\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/**\n * Resolve identifiers/list_id/campaign_id into a flat array of usernames.\n * list_id and campaign_id trigger a prefetch of members from the API.\n */\nasync function resolveIdentifiers(\n client: CelaviiClient,\n args: { identifiers?: string[]; list_id?: string; campaign_id?: string },\n): Promise<string[]> {\n if (args.identifiers?.length) return args.identifiers\n\n if (args.list_id) {\n const resp = await client.get(`/lists/${args.list_id}/members?limit=100`) as { data?: { username?: string; profile_id?: string }[] }\n return (resp.data || []).map(m => m.username || m.profile_id || '').filter(Boolean)\n }\n\n if (args.campaign_id) {\n const resp = await client.get(`/campaigns/${args.campaign_id}/creators?limit=100`) as { data?: { username?: string; profile_id?: string }[] }\n return (resp.data || []).map(m => m.username || m.profile_id || '').filter(Boolean)\n }\n\n return []\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 ids = await resolveIdentifiers(client, args)\n const params = new URLSearchParams()\n if (ids.length) params.set('profile_ids', ids.join(','))\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 ids = await resolveIdentifiers(client, args)\n const params = new URLSearchParams()\n if (ids.length) params.set('usernames', ids.join(','))\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(['campaign', 'list', 'hashtag']).describe('Source type'),\n id: z.string().describe('Source ID (campaign UUID, list UUID, or hashtag)'),\n }).optional().describe('Alternative: analyze from a source (campaign, list, or hashtag)'),\n include: z.array(z.string()).optional().describe(\"Data to include: ['affinities', 'demographics', 'hashtags', '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 ids = await resolveIdentifiers(client, args)\n const params = new URLSearchParams()\n if (ids.length) params.set('profiles', ids.join(','))\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(['campaign', 'list', 'hashtag']).describe('Source type'),\n id: z.string().describe('Source ID'),\n }).optional().describe('Alternative: filter from a source'),\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","/**\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 * 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","/**\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'\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 }),\n },\n async (args) => {\n const { identifiers, options, ...rest } = args\n const result = await client.post('/enhance/profiles', { profiles: identifiers, ...rest })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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 list or campaign). ' +\n 'Returns a job ID. Costs 1+ credits.',\n inputSchema: z.object({\n source: z.object({\n type: z.enum(['list', 'campaign']).describe('Source type'),\n id: z.string().describe('List or campaign UUID'),\n }).describe('Source of profiles to enhance'),\n options: z.object({\n force: z.boolean().optional().describe('Re-enhance even if already enhanced'),\n }).optional().describe('Enhancement options'),\n }),\n },\n async (args) => {\n const result = await client.post('/enhance/bulk', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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 * 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 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 },\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 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 },\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 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 },\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 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 },\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 const result = await client.post('/scrape/urls', args)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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 const result = await client.get(`/scrape/${encodeURIComponent(args.job_id)}/status`)\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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'\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 credit.',\n inputSchema: z.object({\n identifiers: z.array(z.string()).describe('Array of usernames or profile IDs to refine'),\n type: z.string().optional().describe('Refinement type (e.g. niche, demographics, full)'),\n }),\n },\n async (args) => {\n const { identifiers, ...rest } = args\n const result = await client.post('/refine/profiles', { profiles: identifiers, ...rest })\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "celavii-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.3",
4
4
  "description": "Celavii MCP Server — Connect your Celavii account to AI-powered IDEs and assistants",
5
5
  "author": "Celavii <engineering@celavii.com>",
6
6
  "license": "MIT",