@squadbase/vite-server 0.1.17-dev.a9ddcfa → 0.1.17

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.
Files changed (76) hide show
  1. package/dist/cli/index.js +3281 -731
  2. package/dist/connectors/airtable-oauth.js +48 -8
  3. package/dist/connectors/airtable.js +44 -8
  4. package/dist/connectors/amplitude.js +8 -8
  5. package/dist/connectors/anthropic.js +2 -2
  6. package/dist/connectors/asana.js +37 -10
  7. package/dist/connectors/attio.js +30 -13
  8. package/dist/connectors/aws-billing.js +8 -8
  9. package/dist/connectors/azure-sql.js +31 -7
  10. package/dist/connectors/backlog-api-key.js +40 -15
  11. package/dist/connectors/clickup.js +50 -10
  12. package/dist/connectors/cosmosdb.js +12 -12
  13. package/dist/connectors/customerio.js +8 -8
  14. package/dist/connectors/dbt.js +686 -25
  15. package/dist/connectors/freshdesk.js +82 -8
  16. package/dist/connectors/freshsales.js +8 -8
  17. package/dist/connectors/freshservice.js +8 -8
  18. package/dist/connectors/gamma.js +15 -15
  19. package/dist/connectors/gemini.js +2 -2
  20. package/dist/connectors/github.js +12 -12
  21. package/dist/connectors/gmail-oauth.js +10 -10
  22. package/dist/connectors/gmail.js +4 -4
  23. package/dist/connectors/google-ads.js +8 -8
  24. package/dist/connectors/google-analytics-oauth.js +152 -25
  25. package/dist/connectors/google-analytics.js +490 -96
  26. package/dist/connectors/google-audit-log.js +4 -4
  27. package/dist/connectors/google-calendar-oauth.js +61 -15
  28. package/dist/connectors/google-calendar.js +61 -11
  29. package/dist/connectors/google-docs.js +10 -10
  30. package/dist/connectors/google-drive.js +32 -10
  31. package/dist/connectors/google-search-console-oauth.js +126 -17
  32. package/dist/connectors/google-sheets.js +6 -6
  33. package/dist/connectors/google-slides.js +10 -10
  34. package/dist/connectors/grafana.js +45 -10
  35. package/dist/connectors/hubspot-oauth.js +41 -9
  36. package/dist/connectors/hubspot.js +25 -9
  37. package/dist/connectors/influxdb.js +8 -8
  38. package/dist/connectors/intercom-oauth.js +72 -12
  39. package/dist/connectors/intercom.js +12 -12
  40. package/dist/connectors/jdbc.js +6 -6
  41. package/dist/connectors/jira-api-key.js +68 -11
  42. package/dist/connectors/kintone-api-token.js +66 -18
  43. package/dist/connectors/kintone.js +54 -11
  44. package/dist/connectors/linear.js +54 -12
  45. package/dist/connectors/linkedin-ads.js +41 -14
  46. package/dist/connectors/mailchimp-oauth.js +6 -6
  47. package/dist/connectors/mailchimp.js +6 -6
  48. package/dist/connectors/meta-ads-oauth.js +33 -14
  49. package/dist/connectors/meta-ads.js +35 -14
  50. package/dist/connectors/mixpanel.js +8 -8
  51. package/dist/connectors/monday.js +9 -9
  52. package/dist/connectors/mongodb.js +8 -8
  53. package/dist/connectors/notion-oauth.js +60 -11
  54. package/dist/connectors/notion.js +60 -11
  55. package/dist/connectors/openai.js +2 -2
  56. package/dist/connectors/oracle.js +23 -7
  57. package/dist/connectors/outlook-oauth.js +20 -20
  58. package/dist/connectors/powerbi-oauth.js +12 -12
  59. package/dist/connectors/salesforce.js +42 -9
  60. package/dist/connectors/semrush.js +6 -6
  61. package/dist/connectors/sentry.js +36 -10
  62. package/dist/connectors/shopify-oauth.js +43 -10
  63. package/dist/connectors/shopify.js +8 -8
  64. package/dist/connectors/sqlserver.js +31 -7
  65. package/dist/connectors/stripe-api-key.js +66 -15
  66. package/dist/connectors/stripe-oauth.js +70 -19
  67. package/dist/connectors/supabase.js +22 -5
  68. package/dist/connectors/tableau.js +14 -14
  69. package/dist/connectors/tiktok-ads.js +37 -16
  70. package/dist/connectors/wix-store.js +8 -8
  71. package/dist/connectors/zendesk-oauth.js +55 -12
  72. package/dist/connectors/zendesk.js +12 -12
  73. package/dist/index.js +3299 -729
  74. package/dist/main.js +3299 -729
  75. package/dist/vite-plugin.js +3279 -729
  76. package/package.json +1 -1
@@ -268,7 +268,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
268
268
  /**
269
269
  * Create tools for connections that belong to this connector.
270
270
  * Filters connections by connectorKey internally.
271
- * Returns tools keyed as `${connectorKey}_${toolName}`.
271
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
272
272
  */
273
273
  createTools(connections, config, opts) {
274
274
  const myConnections = connections.filter(
@@ -278,7 +278,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
278
278
  for (const t of Object.values(this.tools)) {
279
279
  const tool = t.createTool(myConnections, config);
280
280
  const originalToModelOutput = tool.toModelOutput;
281
- result[`${this.connectorKey}_${t.name}`] = {
281
+ result[`connector_${this.connectorKey}_${t.name}`] = {
282
282
  ...tool,
283
283
  toModelOutput: async (options) => {
284
284
  if (!originalToModelOutput) {
@@ -408,15 +408,15 @@ var AUTH_TYPES = {
408
408
  // ../connectors/src/connectors/linear/setup.ts
409
409
  var linearOnboarding = new ConnectorOnboarding({
410
410
  dataOverviewInstructions: {
411
- en: `1. Call linear_request with query \`{ teams { nodes { id name } } }\` to list all teams
412
- 2. Call linear_request with query \`{ workflowStates { nodes { id name type } } }\` to list workflow states
413
- 3. Call linear_request with query \`{ issues(first: 5, orderBy: updatedAt) { nodes { id identifier title state { name } assignee { name } priority } } }\` to sample recent issues
414
- 4. Call linear_request with query \`{ projects(first: 5) { nodes { id name state } } }\` to list projects
411
+ en: `1. Call connector_linear_request with query \`{ teams { nodes { id name } } }\` to list all teams
412
+ 2. Call connector_linear_request with query \`{ workflowStates { nodes { id name type } } }\` to list workflow states
413
+ 3. Call connector_linear_request with query \`{ issues(first: 5, orderBy: updatedAt) { nodes { id identifier title state { name } assignee { name } priority } } }\` to sample recent issues
414
+ 4. Call connector_linear_request with query \`{ projects(first: 5) { nodes { id name state } } }\` to list projects
415
415
  5. Explore other resources (cycles, labels, users) as needed`,
416
- ja: `1. linear_request \u3067\u30AF\u30A8\u30EA \`{ teams { nodes { id name } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30C1\u30FC\u30E0\u4E00\u89A7\u3092\u53D6\u5F97
417
- 2. linear_request \u3067\u30AF\u30A8\u30EA \`{ workflowStates { nodes { id name type } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u72B6\u614B\u4E00\u89A7\u3092\u53D6\u5F97
418
- 3. linear_request \u3067\u30AF\u30A8\u30EA \`{ issues(first: 5, orderBy: updatedAt) { nodes { id identifier title state { name } assignee { name } priority } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u6700\u8FD1\u306EIssue\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
419
- 4. linear_request \u3067\u30AF\u30A8\u30EA \`{ projects(first: 5) { nodes { id name state } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
416
+ ja: `1. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ teams { nodes { id name } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30C1\u30FC\u30E0\u4E00\u89A7\u3092\u53D6\u5F97
417
+ 2. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ workflowStates { nodes { id name type } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u72B6\u614B\u4E00\u89A7\u3092\u53D6\u5F97
418
+ 3. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ issues(first: 5, orderBy: updatedAt) { nodes { id identifier title state { name } assignee { name } priority } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u6700\u8FD1\u306EIssue\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
419
+ 4. connector_linear_request \u3067\u30AF\u30A8\u30EA \`{ projects(first: 5) { nodes { id name state } } }\` \u3092\u547C\u3073\u51FA\u3057\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
420
420
  5. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u4ED6\u306E\u30EA\u30BD\u30FC\u30B9\uFF08cycles\u3001labels\u3001users\uFF09\u3092\u63A2\u7D22`
421
421
  }
422
422
  });
@@ -473,6 +473,35 @@ async function getTeamDetail(params, teamId) {
473
473
  );
474
474
  return data.team ?? null;
475
475
  }
476
+ async function getIssueBreakdown(params, teamId) {
477
+ try {
478
+ const data = await gqlFetch(
479
+ params,
480
+ `query($id: String!) {
481
+ team(id: $id) {
482
+ issues(first: 250) { nodes { state { name type } } }
483
+ }
484
+ }`,
485
+ { id: teamId }
486
+ );
487
+ const nodes = data.team?.issues?.nodes ?? [];
488
+ const counts = /* @__PURE__ */ new Map();
489
+ for (const n of nodes) {
490
+ const key = `${n.state?.name ?? "Unknown"}|${n.state?.type ?? "unknown"}`;
491
+ const existing = counts.get(key);
492
+ if (existing) existing.count++;
493
+ else
494
+ counts.set(key, {
495
+ stateName: n.state?.name ?? "Unknown",
496
+ stateType: n.state?.type ?? "unknown",
497
+ count: 1
498
+ });
499
+ }
500
+ return { total: nodes.length, byState: Array.from(counts.values()) };
501
+ } catch {
502
+ return null;
503
+ }
504
+ }
476
505
  var linearSetupFlow = {
477
506
  initialState: () => ({}),
478
507
  steps: [
@@ -529,6 +558,19 @@ var linearSetupFlow = {
529
558
  sections.push(` - ${s.name} (${s.type})`);
530
559
  }
531
560
  sections.push("");
561
+ const breakdown = await getIssueBreakdown(rt.params, teamId);
562
+ if (breakdown && breakdown.byState.length > 0) {
563
+ sections.push(
564
+ `#### Issues (${breakdown.total}${breakdown.total === 250 ? "+" : ""})`,
565
+ ""
566
+ );
567
+ sections.push("| State | Type | Count |");
568
+ sections.push("|-------|------|-------|");
569
+ for (const b of breakdown.byState) {
570
+ sections.push(`| ${b.stateName} | ${b.stateType} | ${b.count} |`);
571
+ }
572
+ sections.push("");
573
+ }
532
574
  }
533
575
  return sections.join("\n");
534
576
  }
@@ -639,7 +681,7 @@ var linearConnector = new ConnectorPlugin({
639
681
  systemPrompt: {
640
682
  en: `### Tools
641
683
 
642
- - \`linear_request\`: The only way to call the Linear GraphQL API. Use it to query and mutate all Linear resources: issues, projects, teams, cycles, users, labels, workflow states, and comments. Authentication is configured automatically. Linear's API is GraphQL-only \u2014 send a query string and optional variables. Pagination uses Relay-style cursors with \`first\`/\`after\` and \`last\`/\`before\` arguments. Archived resources are hidden by default; pass \`includeArchived: true\` to include them.
684
+ - \`connector_linear_request\`: The only way to call the Linear GraphQL API. Use it to query and mutate all Linear resources: issues, projects, teams, cycles, users, labels, workflow states, and comments. Authentication is configured automatically. Linear's API is GraphQL-only \u2014 send a query string and optional variables. Pagination uses Relay-style cursors with \`first\`/\`after\` and \`last\`/\`before\` arguments. Archived resources are hidden by default; pass \`includeArchived: true\` to include them.
643
685
 
644
686
  ### Business Logic
645
687
 
@@ -700,7 +742,7 @@ export default async function handler(c: Context) {
700
742
  - \`mutation { commentCreate(input: { issueId: "...", body: "..." }) { success comment { id body } } }\` \u2014 add comment`,
701
743
  ja: `### \u30C4\u30FC\u30EB
702
744
 
703
- - \`linear_request\`: Linear GraphQL API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002Issue\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3001\u30C1\u30FC\u30E0\u3001\u30B5\u30A4\u30AF\u30EB\u3001\u30E6\u30FC\u30B6\u30FC\u3001\u30E9\u30D9\u30EB\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u72B6\u614B\u3001\u30B3\u30E1\u30F3\u30C8\u306A\u3069\u3059\u3079\u3066\u306ELinear\u30EA\u30BD\u30FC\u30B9\u306E\u30AF\u30A8\u30EA\u3068\u30DF\u30E5\u30FC\u30C6\u30FC\u30B7\u30E7\u30F3\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Linear\u306EAPI\u306FGraphQL\u306E\u307F\u3067\u3059\u3002\u30AF\u30A8\u30EA\u6587\u5B57\u5217\u3068\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5909\u6570\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u306FRelay\u5F62\u5F0F\u306E\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u3067\u3001\`first\`/\`after\`\u304A\u3088\u3073\`last\`/\`before\`\u5F15\u6570\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u30EA\u30BD\u30FC\u30B9\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u975E\u8868\u793A\u3067\u3059\u3002\`includeArchived: true\`\u3092\u6E21\u3059\u3068\u542B\u3081\u3089\u308C\u307E\u3059\u3002
745
+ - \`connector_linear_request\`: Linear GraphQL API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002Issue\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3001\u30C1\u30FC\u30E0\u3001\u30B5\u30A4\u30AF\u30EB\u3001\u30E6\u30FC\u30B6\u30FC\u3001\u30E9\u30D9\u30EB\u3001\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u72B6\u614B\u3001\u30B3\u30E1\u30F3\u30C8\u306A\u3069\u3059\u3079\u3066\u306ELinear\u30EA\u30BD\u30FC\u30B9\u306E\u30AF\u30A8\u30EA\u3068\u30DF\u30E5\u30FC\u30C6\u30FC\u30B7\u30E7\u30F3\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Linear\u306EAPI\u306FGraphQL\u306E\u307F\u3067\u3059\u3002\u30AF\u30A8\u30EA\u6587\u5B57\u5217\u3068\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5909\u6570\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u306FRelay\u5F62\u5F0F\u306E\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u3067\u3001\`first\`/\`after\`\u304A\u3088\u3073\`last\`/\`before\`\u5F15\u6570\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002\u30A2\u30FC\u30AB\u30A4\u30D6\u3055\u308C\u305F\u30EA\u30BD\u30FC\u30B9\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u975E\u8868\u793A\u3067\u3059\u3002\`includeArchived: true\`\u3092\u6E21\u3059\u3068\u542B\u3081\u3089\u308C\u307E\u3059\u3002
704
746
 
705
747
  ### Business Logic
706
748
 
@@ -171,7 +171,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
171
171
  /**
172
172
  * Create tools for connections that belong to this connector.
173
173
  * Filters connections by connectorKey internally.
174
- * Returns tools keyed as `${connectorKey}_${toolName}`.
174
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
175
175
  */
176
176
  createTools(connections, config, opts) {
177
177
  const myConnections = connections.filter(
@@ -181,7 +181,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
181
181
  for (const t of Object.values(this.tools)) {
182
182
  const tool = t.createTool(myConnections, config);
183
183
  const originalToModelOutput = tool.toModelOutput;
184
- result[`${this.connectorKey}_${t.name}`] = {
184
+ result[`connector_${this.connectorKey}_${t.name}`] = {
185
185
  ...tool,
186
186
  toModelOutput: async (options) => {
187
187
  if (!originalToModelOutput) {
@@ -453,11 +453,11 @@ var linkedinAdsOnboarding = new ConnectorOnboarding({
453
453
  - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
454
454
  },
455
455
  dataOverviewInstructions: {
456
- en: `1. Call linkedin-ads_request with GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 to explore campaigns
457
- 2. Call linkedin-ads_request with GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues to check recent performance
456
+ en: `1. Call connector_linkedin-ads_request with GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 to explore campaigns
457
+ 2. Call connector_linkedin-ads_request with GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues to check recent performance
458
458
  3. Explore campaign groups and creatives as needed to understand the data structure`,
459
- ja: `1. linkedin-ads_request \u3067 GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
460
- 2. linkedin-ads_request \u3067 GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
459
+ ja: `1. connector_linkedin-ads_request \u3067 GET adAccounts/{adAccountId}/adCampaigns?q=search&search=(status:(values:List(ACTIVE)))&pageSize=10 \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
460
+ 2. connector_linkedin-ads_request \u3067 GET adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=MONTHLY&dateRange=(start:(year:2025,month:1,day:1))&accounts=List(urn%3Ali%3AsponsoredAccount%3A{adAccountId})&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
461
461
  3. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30B0\u30EB\u30FC\u30D7\u3084\u30AF\u30EA\u30A8\u30A4\u30C6\u30A3\u30D6\u3092\u63A2\u7D22\u3057\u3001\u30C7\u30FC\u30BF\u69CB\u9020\u3092\u628A\u63E1`
462
462
  }
463
463
  });
@@ -502,6 +502,24 @@ async function listAdAccounts(proxyFetch) {
502
502
  const data = await res.json();
503
503
  return data.elements ?? [];
504
504
  }
505
+ async function fetchCampaignCount(proxyFetch, accountId) {
506
+ try {
507
+ const account = encodeURIComponent(
508
+ `urn:li:sponsoredAccount:${accountId}`
509
+ );
510
+ const url = `${BASE_URL3}/adCampaigns?q=search&search.account.values[0]=${account}&count=1`;
511
+ const res = await proxyFetch(url, {
512
+ method: "GET",
513
+ headers: defaultHeaders()
514
+ });
515
+ if (!res.ok) return null;
516
+ const data = await res.json();
517
+ const total = data.paging?.total;
518
+ return typeof total === "number" ? total : null;
519
+ } catch {
520
+ return null;
521
+ }
522
+ }
505
523
  var linkedinAdsSetupFlow = {
506
524
  initialState: () => ({}),
507
525
  steps: [
@@ -549,16 +567,25 @@ var linkedinAdsSetupFlow = {
549
567
  sections.push("_No ad accounts selected._", "");
550
568
  return sections.join("\n");
551
569
  }
552
- sections.push("| Ad Account ID | Name | Currency | Type | Status |");
553
- sections.push("|---------------|------|----------|------|--------|");
554
- for (const id of targetIds) {
570
+ sections.push(
571
+ "| Ad Account ID | Name | Currency | Type | Status | Campaigns |"
572
+ );
573
+ sections.push(
574
+ "|---------------|------|----------|------|--------|-----------|"
575
+ );
576
+ const campaignCounts = await Promise.all(
577
+ targetIds.map((id) => fetchCampaignCount(rt.config.proxyFetch, id))
578
+ );
579
+ for (let i = 0; i < targetIds.length; i++) {
580
+ const id = targetIds[i];
555
581
  const account = byId.get(id);
556
582
  const name = (account?.name ?? "-").replace(/\|/g, "\\|");
557
583
  const currency = account?.currency ?? "-";
558
584
  const type = account?.type ?? "-";
559
585
  const status = account?.status ?? "-";
586
+ const campaigns = campaignCounts[i] == null ? "-" : String(campaignCounts[i]);
560
587
  sections.push(
561
- `| ${id} | ${name} | ${currency} | ${type} | ${status} |`
588
+ `| ${id} | ${name} | ${currency} | ${type} | ${status} | ${campaigns} |`
562
589
  );
563
590
  }
564
591
  sections.push("");
@@ -726,8 +753,8 @@ var linkedinAdsConnector = new ConnectorPlugin({
726
753
  systemPrompt: {
727
754
  en: `### Tools
728
755
 
729
- - \`linkedin-ads_request\`: Send authenticated requests to the LinkedIn Marketing API (REST). The {adAccountId} placeholder in paths is automatically replaced. Authentication is handled automatically via OAuth proxy. Required headers (LinkedIn-Version, X-Restli-Protocol-Version) are set automatically.
730
- - \`linkedin-ads_listAdAccounts\`: List accessible LinkedIn ad accounts. Use this during setup to discover available accounts.
756
+ - \`connector_linkedin-ads_request\`: Send authenticated requests to the LinkedIn Marketing API (REST). The {adAccountId} placeholder in paths is automatically replaced. Authentication is handled automatically via OAuth proxy. Required headers (LinkedIn-Version, X-Restli-Protocol-Version) are set automatically.
757
+ - \`connector_linkedin-ads_listAdAccounts\`: List accessible LinkedIn ad accounts. Use this during setup to discover available accounts.
731
758
 
732
759
  ### LinkedIn Marketing API Reference
733
760
 
@@ -819,8 +846,8 @@ const data = await res.json();
819
846
  \`\`\``,
820
847
  ja: `### \u30C4\u30FC\u30EB
821
848
 
822
- - \`linkedin-ads_request\`: LinkedIn Marketing API\uFF08REST\uFF09\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306FOAuth\u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002\u5FC5\u9808\u30D8\u30C3\u30C0\u30FC\uFF08LinkedIn-Version\u3001X-Restli-Protocol-Version\uFF09\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
823
- - \`linkedin-ads_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306ALinkedIn\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
849
+ - \`connector_linkedin-ads_request\`: LinkedIn Marketing API\uFF08REST\uFF09\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306FOAuth\u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002\u5FC5\u9808\u30D8\u30C3\u30C0\u30FC\uFF08LinkedIn-Version\u3001X-Restli-Protocol-Version\uFF09\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
850
+ - \`connector_linkedin-ads_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306ALinkedIn\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
824
851
 
825
852
  ### LinkedIn Marketing API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
826
853
 
@@ -177,7 +177,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
177
177
  /**
178
178
  * Create tools for connections that belong to this connector.
179
179
  * Filters connections by connectorKey internally.
180
- * Returns tools keyed as `${connectorKey}_${toolName}`.
180
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
181
181
  */
182
182
  createTools(connections, config, opts) {
183
183
  const myConnections = connections.filter(
@@ -187,7 +187,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
187
187
  for (const t of Object.values(this.tools)) {
188
188
  const tool = t.createTool(myConnections, config);
189
189
  const originalToModelOutput = tool.toModelOutput;
190
- result[`${this.connectorKey}_${t.name}`] = {
190
+ result[`connector_${this.connectorKey}_${t.name}`] = {
191
191
  ...tool,
192
192
  toModelOutput: async (options) => {
193
193
  if (!originalToModelOutput) {
@@ -317,11 +317,11 @@ var AUTH_TYPES = {
317
317
  // ../connectors/src/connectors/mailchimp-oauth/setup.ts
318
318
  var mailchimpOauthOnboarding = new ConnectorOnboarding({
319
319
  dataOverviewInstructions: {
320
- en: `1. Call mailchimp-oauth_request with GET /lists to list all audiences
320
+ en: `1. Call connector_mailchimp-oauth_request with GET /lists to list all audiences
321
321
  2. Pick an audience and call GET /lists/{list_id}/members?count=5 to sample members
322
322
  3. Call GET /campaigns?count=5 to list recent campaigns
323
323
  4. Call GET /reports?count=5 to view campaign reports`,
324
- ja: `1. mailchimp-oauth_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
324
+ ja: `1. connector_mailchimp-oauth_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
325
325
  2. \u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u3092\u9078\u629E\u3057 GET /lists/{list_id}/members?count=5 \u3067\u30E1\u30F3\u30D0\u30FC\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
326
326
  3. GET /campaigns?count=5 \u3067\u6700\u8FD1\u306E\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u4E00\u89A7\u3092\u53D6\u5F97
327
327
  4. GET /reports?count=5 \u3067\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30EC\u30DD\u30FC\u30C8\u3092\u8868\u793A`
@@ -576,7 +576,7 @@ var mailchimpOauthConnector = new ConnectorPlugin({
576
576
  systemPrompt: {
577
577
  en: `### Tools
578
578
 
579
- - \`mailchimp-oauth_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication is configured automatically via OAuth.
579
+ - \`connector_mailchimp-oauth_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication is configured automatically via OAuth.
580
580
 
581
581
  ### Mailchimp Marketing API v3 Reference
582
582
 
@@ -634,7 +634,7 @@ const data = await res.json();
634
634
  \`\`\``,
635
635
  ja: `### \u30C4\u30FC\u30EB
636
636
 
637
- - \`mailchimp-oauth_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
637
+ - \`connector_mailchimp-oauth_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
638
638
 
639
639
  ### Mailchimp Marketing API v3 \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
640
640
 
@@ -282,7 +282,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
282
282
  /**
283
283
  * Create tools for connections that belong to this connector.
284
284
  * Filters connections by connectorKey internally.
285
- * Returns tools keyed as `${connectorKey}_${toolName}`.
285
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
286
286
  */
287
287
  createTools(connections, config, opts) {
288
288
  const myConnections = connections.filter(
@@ -292,7 +292,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
292
292
  for (const t of Object.values(this.tools)) {
293
293
  const tool = t.createTool(myConnections, config);
294
294
  const originalToModelOutput = tool.toModelOutput;
295
- result[`${this.connectorKey}_${t.name}`] = {
295
+ result[`connector_${this.connectorKey}_${t.name}`] = {
296
296
  ...tool,
297
297
  toModelOutput: async (options) => {
298
298
  if (!originalToModelOutput) {
@@ -422,11 +422,11 @@ var AUTH_TYPES = {
422
422
  // ../connectors/src/connectors/mailchimp/setup.ts
423
423
  var mailchimpOnboarding = new ConnectorOnboarding({
424
424
  dataOverviewInstructions: {
425
- en: `1. Call mailchimp_request with GET /lists to list all audiences
425
+ en: `1. Call connector_mailchimp_request with GET /lists to list all audiences
426
426
  2. Pick an audience and call GET /lists/{list_id}/members?count=5 to sample members
427
427
  3. Call GET /campaigns?count=5 to list recent campaigns
428
428
  4. Call GET /reports?count=5 to view campaign reports`,
429
- ja: `1. mailchimp_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
429
+ ja: `1. connector_mailchimp_request \u3067 GET /lists \u3092\u547C\u3073\u51FA\u3057\u3001\u5168\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
430
430
  2. \u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9\u3092\u9078\u629E\u3057 GET /lists/{list_id}/members?count=5 \u3067\u30E1\u30F3\u30D0\u30FC\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
431
431
  3. GET /campaigns?count=5 \u3067\u6700\u8FD1\u306E\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u4E00\u89A7\u3092\u53D6\u5F97
432
432
  4. GET /reports?count=5 \u3067\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30EC\u30DD\u30FC\u30C8\u3092\u8868\u793A`
@@ -647,7 +647,7 @@ var mailchimpConnector = new ConnectorPlugin({
647
647
  systemPrompt: {
648
648
  en: `### Tools
649
649
 
650
- - \`mailchimp_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication (Basic Auth with API key) is configured automatically. The datacenter is extracted from the API key suffix.
650
+ - \`connector_mailchimp_request\`: The only way to call the Mailchimp Marketing API v3. Use it to manage audiences/lists, subscribers/members, campaigns, templates, automations, and reports. Authentication (Basic Auth with API key) is configured automatically. The datacenter is extracted from the API key suffix.
651
651
 
652
652
  ### Business Logic
653
653
 
@@ -744,7 +744,7 @@ export default async function handler(c: Context) {
744
744
  - Errors return \`type\`, \`title\`, \`status\`, \`detail\`, and \`instance\` fields`,
745
745
  ja: `### \u30C4\u30FC\u30EB
746
746
 
747
- - \`mailchimp_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30AD\u30FC\u306B\u3088\u308BBasic Auth\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u30C7\u30FC\u30BF\u30BB\u30F3\u30BF\u30FC\u306FAPI\u30AD\u30FC\u306E\u30B5\u30D5\u30A3\u30C3\u30AF\u30B9\u304B\u3089\u81EA\u52D5\u691C\u51FA\u3055\u308C\u307E\u3059\u3002
747
+ - \`connector_mailchimp_request\`: Mailchimp Marketing API v3\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30AA\u30FC\u30C7\u30A3\u30A8\u30F3\u30B9/\u30EA\u30B9\u30C8\u3001\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D0\u30FC/\u30E1\u30F3\u30D0\u30FC\u3001\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3001\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3001\u30AA\u30FC\u30C8\u30E1\u30FC\u30B7\u30E7\u30F3\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u7BA1\u7406\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30AD\u30FC\u306B\u3088\u308BBasic Auth\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u30C7\u30FC\u30BF\u30BB\u30F3\u30BF\u30FC\u306FAPI\u30AD\u30FC\u306E\u30B5\u30D5\u30A3\u30C3\u30AF\u30B9\u304B\u3089\u81EA\u52D5\u691C\u51FA\u3055\u308C\u307E\u3059\u3002
748
748
 
749
749
  ### Business Logic
750
750
 
@@ -171,7 +171,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
171
171
  /**
172
172
  * Create tools for connections that belong to this connector.
173
173
  * Filters connections by connectorKey internally.
174
- * Returns tools keyed as `${connectorKey}_${toolName}`.
174
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
175
175
  */
176
176
  createTools(connections, config, opts) {
177
177
  const myConnections = connections.filter(
@@ -181,7 +181,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
181
181
  for (const t of Object.values(this.tools)) {
182
182
  const tool = t.createTool(myConnections, config);
183
183
  const originalToModelOutput = tool.toModelOutput;
184
- result[`${this.connectorKey}_${t.name}`] = {
184
+ result[`connector_${this.connectorKey}_${t.name}`] = {
185
185
  ...tool,
186
186
  toModelOutput: async (options) => {
187
187
  if (!originalToModelOutput) {
@@ -448,11 +448,11 @@ var metaAdsOauthOnboarding = new ConnectorOnboarding({
448
448
  - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
449
449
  },
450
450
  dataOverviewInstructions: {
451
- en: `1. Call meta-ads-oauth_request with GET act_{adAccountId}/campaigns?fields=id,name,status,objective to explore campaign data
452
- 2. Call meta-ads-oauth_request with GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d to check recent performance
451
+ en: `1. Call connector_meta-ads-oauth_request with GET act_{adAccountId}/campaigns?fields=id,name,status,objective to explore campaign data
452
+ 2. Call connector_meta-ads-oauth_request with GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d to check recent performance
453
453
  3. Explore ad sets and ads as needed to understand the data structure`,
454
- ja: `1. meta-ads-oauth_request \u3067 GET act_{adAccountId}/campaigns?fields=id,name,status,objective \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
455
- 2. meta-ads-oauth_request \u3067 GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
454
+ ja: `1. connector_meta-ads-oauth_request \u3067 GET act_{adAccountId}/campaigns?fields=id,name,status,objective \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
455
+ 2. connector_meta-ads-oauth_request \u3067 GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
456
456
  3. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u5E83\u544A\u30BB\u30C3\u30C8\u3084\u5E83\u544A\u30C7\u30FC\u30BF\u3092\u63A2\u7D22\u3057\u3001\u30C7\u30FC\u30BF\u69CB\u9020\u3092\u628A\u63E1`
457
457
  }
458
458
  });
@@ -503,6 +503,18 @@ async function listAdAccounts(proxyFetch) {
503
503
  const data = await res.json();
504
504
  return data.data ?? [];
505
505
  }
506
+ async function fetchCampaignCount(proxyFetch, accountId) {
507
+ try {
508
+ const url = `${BASE_URL3}/act_${encodeURIComponent(accountId)}/campaigns?summary=total_count&limit=0`;
509
+ const res = await proxyFetch(url, { method: "GET" });
510
+ if (!res.ok) return null;
511
+ const data = await res.json();
512
+ const total = data.summary?.total_count;
513
+ return typeof total === "number" ? total : null;
514
+ } catch {
515
+ return null;
516
+ }
517
+ }
506
518
  function bareAdAccountId(account) {
507
519
  if (account.account_id) return account.account_id;
508
520
  return (account.id ?? "").replace(/^act_/, "");
@@ -554,14 +566,21 @@ var metaAdsOauthSetupFlow = {
554
566
  sections.push("_No ad accounts selected._", "");
555
567
  return sections.join("\n");
556
568
  }
557
- sections.push("| Ad Account ID | Name | Currency | Status |");
558
- sections.push("|---------------|------|----------|--------|");
559
- for (const id of targetIds) {
569
+ sections.push("| Ad Account ID | Name | Currency | Status | Campaigns |");
570
+ sections.push("|---------------|------|----------|--------|-----------|");
571
+ const campaignCounts = await Promise.all(
572
+ targetIds.map((id) => fetchCampaignCount(rt.config.proxyFetch, id))
573
+ );
574
+ for (let i = 0; i < targetIds.length; i++) {
575
+ const id = targetIds[i];
560
576
  const account = byId.get(id);
561
577
  const name = (account?.name ?? "-").replace(/\|/g, "\\|");
562
578
  const currency = account?.currency ?? "-";
563
579
  const status = statusLabel(account?.account_status);
564
- sections.push(`| ${id} | ${name} | ${currency} | ${status} |`);
580
+ const campaigns = campaignCounts[i] == null ? "-" : String(campaignCounts[i]);
581
+ sections.push(
582
+ `| ${id} | ${name} | ${currency} | ${status} | ${campaigns} |`
583
+ );
565
584
  }
566
585
  sections.push("");
567
586
  return sections.join("\n");
@@ -716,8 +735,8 @@ var metaAdsOauthConnector = new ConnectorPlugin({
716
735
  systemPrompt: {
717
736
  en: `### Tools
718
737
 
719
- - \`meta-ads-oauth_request\`: Send authenticated requests to the Meta Marketing API v21.0. The {adAccountId} placeholder in paths is automatically replaced. Authentication is handled automatically via OAuth proxy.
720
- - \`meta-ads-oauth_listAdAccounts\`: List accessible Meta ad accounts. Use this during setup to discover available accounts.
738
+ - \`connector_meta-ads-oauth_request\`: Send authenticated requests to the Meta Marketing API v21.0. The {adAccountId} placeholder in paths is automatically replaced. Authentication is handled automatically via OAuth proxy.
739
+ - \`connector_meta-ads-oauth_listAdAccounts\`: List accessible Meta ad accounts. Use this during setup to discover available accounts.
721
740
 
722
741
  ### Meta Marketing API Reference
723
742
 
@@ -773,8 +792,8 @@ const data = await res.json();
773
792
  \`\`\``,
774
793
  ja: `### \u30C4\u30FC\u30EB
775
794
 
776
- - \`meta-ads-oauth_request\`: Meta Marketing API v21.0\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306FOAuth\u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002
777
- - \`meta-ads-oauth_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AMeta\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
795
+ - \`connector_meta-ads-oauth_request\`: Meta Marketing API v21.0\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306FOAuth\u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u81EA\u52D5\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002
796
+ - \`connector_meta-ads-oauth_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AMeta\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
778
797
 
779
798
  ### Meta Marketing API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
780
799
 
@@ -242,7 +242,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
242
242
  /**
243
243
  * Create tools for connections that belong to this connector.
244
244
  * Filters connections by connectorKey internally.
245
- * Returns tools keyed as `${connectorKey}_${toolName}`.
245
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
246
246
  */
247
247
  createTools(connections, config, opts) {
248
248
  const myConnections = connections.filter(
@@ -252,7 +252,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
252
252
  for (const t of Object.values(this.tools)) {
253
253
  const tool = t.createTool(myConnections, config);
254
254
  const originalToModelOutput = tool.toModelOutput;
255
- result[`${this.connectorKey}_${t.name}`] = {
255
+ result[`connector_${this.connectorKey}_${t.name}`] = {
256
256
  ...tool,
257
257
  toModelOutput: async (options) => {
258
258
  if (!originalToModelOutput) {
@@ -480,11 +480,11 @@ var metaAdsOnboarding = new ConnectorOnboarding({
480
480
  - Write only 1 sentence between tool calls, then immediately call the next tool. Skip unnecessary explanations and proceed efficiently`
481
481
  },
482
482
  dataOverviewInstructions: {
483
- en: `1. Call meta-ads_request with GET act_{adAccountId}/campaigns?fields=id,name,status,objective to explore campaign data
484
- 2. Call meta-ads_request with GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d to check recent performance
483
+ en: `1. Call connector_meta-ads_request with GET act_{adAccountId}/campaigns?fields=id,name,status,objective to explore campaign data
484
+ 2. Call connector_meta-ads_request with GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d to check recent performance
485
485
  3. Explore ad sets and ads as needed to understand the data structure`,
486
- ja: `1. meta-ads_request \u3067 GET act_{adAccountId}/campaigns?fields=id,name,status,objective \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
487
- 2. meta-ads_request \u3067 GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
486
+ ja: `1. connector_meta-ads_request \u3067 GET act_{adAccountId}/campaigns?fields=id,name,status,objective \u3092\u547C\u3073\u51FA\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
487
+ 2. connector_meta-ads_request \u3067 GET act_{adAccountId}/insights?fields=impressions,clicks,spend,ctr,cpm&date_preset=last_7d \u3092\u547C\u3073\u51FA\u3057\u3066\u76F4\u8FD1\u306E\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u78BA\u8A8D
488
488
  3. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u5E83\u544A\u30BB\u30C3\u30C8\u3084\u5E83\u544A\u30C7\u30FC\u30BF\u3092\u63A2\u7D22\u3057\u3001\u30C7\u30FC\u30BF\u69CB\u9020\u3092\u628A\u63E1`
489
489
  }
490
490
  });
@@ -532,6 +532,20 @@ async function listAdAccounts(params) {
532
532
  const data = await res.json();
533
533
  return data.data ?? [];
534
534
  }
535
+ async function fetchCampaignCount(params, accountId) {
536
+ try {
537
+ const res = await apiFetch(
538
+ params,
539
+ `/act_${encodeURIComponent(accountId)}/campaigns?summary=total_count&limit=0`
540
+ );
541
+ if (!res.ok) return null;
542
+ const data = await res.json();
543
+ const total = data.summary?.total_count;
544
+ return typeof total === "number" ? total : null;
545
+ } catch {
546
+ return null;
547
+ }
548
+ }
535
549
  function bareAdAccountId(account) {
536
550
  if (account.account_id) return account.account_id;
537
551
  return (account.id ?? "").replace(/^act_/, "");
@@ -583,14 +597,21 @@ var metaAdsSetupFlow = {
583
597
  sections.push("_No ad accounts selected._", "");
584
598
  return sections.join("\n");
585
599
  }
586
- sections.push("| Ad Account ID | Name | Currency | Status |");
587
- sections.push("|---------------|------|----------|--------|");
588
- for (const id of targetIds) {
600
+ sections.push("| Ad Account ID | Name | Currency | Status | Campaigns |");
601
+ sections.push("|---------------|------|----------|--------|-----------|");
602
+ const campaignCounts = await Promise.all(
603
+ targetIds.map((id) => fetchCampaignCount(rt.params, id))
604
+ );
605
+ for (let i = 0; i < targetIds.length; i++) {
606
+ const id = targetIds[i];
589
607
  const account = byId.get(id);
590
608
  const name = (account?.name ?? "-").replace(/\|/g, "\\|");
591
609
  const currency = account?.currency ?? "-";
592
610
  const status = statusLabel(account?.account_status);
593
- sections.push(`| ${id} | ${name} | ${currency} | ${status} |`);
611
+ const campaigns = campaignCounts[i] == null ? "-" : String(campaignCounts[i]);
612
+ sections.push(
613
+ `| ${id} | ${name} | ${currency} | ${status} | ${campaigns} |`
614
+ );
594
615
  }
595
616
  sections.push("");
596
617
  return sections.join("\n");
@@ -698,8 +719,8 @@ var metaAdsConnector = new ConnectorPlugin({
698
719
  systemPrompt: {
699
720
  en: `### Tools
700
721
 
701
- - \`meta-ads_request\`: Send authenticated requests to the Meta Marketing API v21.0. The {adAccountId} placeholder in paths is automatically replaced. Authentication is configured via the access token parameter.
702
- - \`meta-ads_listAdAccounts\`: List accessible Meta ad accounts. Use this during setup to discover available accounts.
722
+ - \`connector_meta-ads_request\`: Send authenticated requests to the Meta Marketing API v21.0. The {adAccountId} placeholder in paths is automatically replaced. Authentication is configured via the access token parameter.
723
+ - \`connector_meta-ads_listAdAccounts\`: List accessible Meta ad accounts. Use this during setup to discover available accounts.
703
724
 
704
725
  ### Meta Marketing API Reference
705
726
 
@@ -760,8 +781,8 @@ const accounts = await meta.listAdAccounts();
760
781
  \`\`\``,
761
782
  ja: `### \u30C4\u30FC\u30EB
762
783
 
763
- - \`meta-ads_request\`: Meta Marketing API v21.0\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306F\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u30D1\u30E9\u30E1\u30FC\u30BF\u3067\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
764
- - \`meta-ads_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AMeta\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
784
+ - \`connector_meta-ads_request\`: Meta Marketing API v21.0\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{adAccountId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u8A8D\u8A3C\u306F\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u30D1\u30E9\u30E1\u30FC\u30BF\u3067\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
785
+ - \`connector_meta-ads_listAdAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AMeta\u5E83\u544A\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u5229\u7528\u53EF\u80FD\u306A\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
765
786
 
766
787
  ### Meta Marketing API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
767
788
 
@@ -334,7 +334,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
334
334
  /**
335
335
  * Create tools for connections that belong to this connector.
336
336
  * Filters connections by connectorKey internally.
337
- * Returns tools keyed as `${connectorKey}_${toolName}`.
337
+ * Returns tools keyed as `connector_${connectorKey}_${toolName}`.
338
338
  */
339
339
  createTools(connections, config, opts) {
340
340
  const myConnections = connections.filter(
@@ -344,7 +344,7 @@ var ConnectorPlugin = class _ConnectorPlugin {
344
344
  for (const t of Object.values(this.tools)) {
345
345
  const tool = t.createTool(myConnections, config);
346
346
  const originalToModelOutput = tool.toModelOutput;
347
- result[`${this.connectorKey}_${t.name}`] = {
347
+ result[`connector_${this.connectorKey}_${t.name}`] = {
348
348
  ...tool,
349
349
  toModelOutput: async (options) => {
350
350
  if (!originalToModelOutput) {
@@ -473,15 +473,15 @@ var mixpanelOnboarding = new ConnectorOnboarding({
473
473
  - US (default): https://mixpanel.com/api/query (Query API), https://data.mixpanel.com/api/2.0/export (Export API)
474
474
  - EU: https://eu.mixpanel.com/api/query, https://data-eu.mixpanel.com/api/2.0/export
475
475
  - India: https://in.mixpanel.com/api/query, https://data-in.mixpanel.com/api/2.0/export
476
- 2. Call mixpanel_request with GET {exportBase}?from_date=YYYY-MM-DD&to_date=YYYY-MM-DD (use a short recent date range, e.g. 1-2 days) to export raw events and discover available event types and properties
477
- 3. Call mixpanel_request with POST {queryBase}/engage to query user profiles and understand user properties
476
+ 2. Call connector_mixpanel_request with GET {exportBase}?from_date=YYYY-MM-DD&to_date=YYYY-MM-DD (use a short recent date range, e.g. 1-2 days) to export raw events and discover available event types and properties
477
+ 3. Call connector_mixpanel_request with POST {queryBase}/engage to query user profiles and understand user properties
478
478
  NOTE: The Query API endpoints (insights, funnels, retention) require a bookmark_id or funnel_id from existing reports in Mixpanel. Use the Export API to retrieve raw events and aggregate in code if you need ad-hoc analysis.`,
479
479
  ja: `1. \u63A5\u7D9A\u306Eregion\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u78BA\u8A8D\u3057\u3066\u30D9\u30FC\u30B9URL\u3092\u6C7A\u5B9A\uFF1A
480
480
  - US\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\uFF09: https://mixpanel.com/api/query\uFF08Query API\uFF09\u3001https://data.mixpanel.com/api/2.0/export\uFF08Export API\uFF09
481
481
  - EU: https://eu.mixpanel.com/api/query\u3001https://data-eu.mixpanel.com/api/2.0/export
482
482
  - India: https://in.mixpanel.com/api/query\u3001https://data-in.mixpanel.com/api/2.0/export
483
- 2. mixpanel_request \u3067 GET {exportBase}?from_date=YYYY-MM-DD&to_date=YYYY-MM-DD \u3092\u547C\u3073\u51FA\u3057\uFF08\u76F4\u8FD11-2\u65E5\u306E\u77ED\u3044\u671F\u9593\u3092\u4F7F\u7528\uFF09\u3001\u751F\u30A4\u30D9\u30F3\u30C8\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u3066\u5229\u7528\u53EF\u80FD\u306A\u30A4\u30D9\u30F3\u30C8\u30BF\u30A4\u30D7\u3068\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u78BA\u8A8D
484
- 3. mixpanel_request \u3067 POST {queryBase}/engage \u3092\u547C\u3073\u51FA\u3057\u3001\u30E6\u30FC\u30B6\u30FC\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3092\u7167\u4F1A\u3057\u3066\u30E6\u30FC\u30B6\u30FC\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u628A\u63E1
483
+ 2. connector_mixpanel_request \u3067 GET {exportBase}?from_date=YYYY-MM-DD&to_date=YYYY-MM-DD \u3092\u547C\u3073\u51FA\u3057\uFF08\u76F4\u8FD11-2\u65E5\u306E\u77ED\u3044\u671F\u9593\u3092\u4F7F\u7528\uFF09\u3001\u751F\u30A4\u30D9\u30F3\u30C8\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u3066\u5229\u7528\u53EF\u80FD\u306A\u30A4\u30D9\u30F3\u30C8\u30BF\u30A4\u30D7\u3068\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u78BA\u8A8D
484
+ 3. connector_mixpanel_request \u3067 POST {queryBase}/engage \u3092\u547C\u3073\u51FA\u3057\u3001\u30E6\u30FC\u30B6\u30FC\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3092\u7167\u4F1A\u3057\u3066\u30E6\u30FC\u30B6\u30FC\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u628A\u63E1
485
485
  \u6CE8\u610F: Query API\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08insights\u3001funnels\u3001retention\uFF09\u306FMixpanel\u5185\u306E\u65E2\u5B58\u30EC\u30DD\u30FC\u30C8\u306Ebookmark_id\u307E\u305F\u306Ffunnel_id\u304C\u5FC5\u8981\u3067\u3059\u3002\u30A2\u30C9\u30DB\u30C3\u30AF\u5206\u6790\u304C\u5FC5\u8981\u306A\u5834\u5408\u306F\u3001Export API\u3067\u751F\u30A4\u30D9\u30F3\u30C8\u3092\u53D6\u5F97\u3057\u3001\u30B3\u30FC\u30C9\u4E0A\u3067\u96C6\u8A08\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
486
486
  }
487
487
  });
@@ -757,7 +757,7 @@ var mixpanelConnector = new ConnectorPlugin({
757
757
  systemPrompt: {
758
758
  en: `### Tools
759
759
 
760
- - \`mixpanel_request\`: The only way to call the Mixpanel REST API. Use it for exporting raw events, querying insights/funnels/retention reports, and querying user profiles. Authentication (Basic auth with Service Account username + secret) is configured automatically. The project_id query parameter is appended automatically. Provide the full URL including query parameters \u2014 the base URL varies by region and endpoint type.
760
+ - \`connector_mixpanel_request\`: The only way to call the Mixpanel REST API. Use it for exporting raw events, querying insights/funnels/retention reports, and querying user profiles. Authentication (Basic auth with Service Account username + secret) is configured automatically. The project_id query parameter is appended automatically. Provide the full URL including query parameters \u2014 the base URL varies by region and endpoint type.
761
761
 
762
762
  ### Business Logic
763
763
 
@@ -816,7 +816,7 @@ export default async function handler(c: Context) {
816
816
  IMPORTANT: The Insights endpoint requires a bookmark_id from an existing report in the Mixpanel UI. For ad-hoc event analysis, use the Export API to retrieve raw events and aggregate them in code. The Export API is the most flexible and universally accessible endpoint.`,
817
817
  ja: `### \u30C4\u30FC\u30EB
818
818
 
819
- - \`mixpanel_request\`: Mixpanel REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u751F\u30A4\u30D9\u30F3\u30C8\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3001\u30A4\u30F3\u30B5\u30A4\u30C8/\u30D5\u30A1\u30CD\u30EB/\u30EA\u30C6\u30F3\u30B7\u30E7\u30F3\u30EC\u30DD\u30FC\u30C8\u306E\u7167\u4F1A\u3001\u30E6\u30FC\u30B6\u30FC\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u306E\u7167\u4F1A\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Service Account\u306E\u30E6\u30FC\u30B6\u30FC\u540D+\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u306B\u3088\u308BBasic\u8A8D\u8A3C\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002project_id\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u306F\u81EA\u52D5\u7684\u306B\u4ED8\u52A0\u3055\u308C\u307E\u3059\u3002\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u542B\u3080\u5B8C\u5168\u306AURL\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044 \u2014 \u30D9\u30FC\u30B9URL\u306F\u30EA\u30FC\u30B8\u30E7\u30F3\u3068\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u30BF\u30A4\u30D7\u306B\u3088\u3063\u3066\u7570\u306A\u308A\u307E\u3059\u3002
819
+ - \`connector_mixpanel_request\`: Mixpanel REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u751F\u30A4\u30D9\u30F3\u30C8\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3001\u30A4\u30F3\u30B5\u30A4\u30C8/\u30D5\u30A1\u30CD\u30EB/\u30EA\u30C6\u30F3\u30B7\u30E7\u30F3\u30EC\u30DD\u30FC\u30C8\u306E\u7167\u4F1A\u3001\u30E6\u30FC\u30B6\u30FC\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u306E\u7167\u4F1A\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Service Account\u306E\u30E6\u30FC\u30B6\u30FC\u540D+\u30B7\u30FC\u30AF\u30EC\u30C3\u30C8\u306B\u3088\u308BBasic\u8A8D\u8A3C\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002project_id\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u306F\u81EA\u52D5\u7684\u306B\u4ED8\u52A0\u3055\u308C\u307E\u3059\u3002\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u542B\u3080\u5B8C\u5168\u306AURL\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044 \u2014 \u30D9\u30FC\u30B9URL\u306F\u30EA\u30FC\u30B8\u30E7\u30F3\u3068\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u30BF\u30A4\u30D7\u306B\u3088\u3063\u3066\u7570\u306A\u308A\u307E\u3059\u3002
820
820
 
821
821
  ### Business Logic
822
822