@squadbase/vite-server 0.1.2-dev.6 → 0.1.3-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -7215,8 +7215,8 @@ var init_body = __esm({
7215
7215
  const ct = this.headers.get("content-type");
7216
7216
  if (ct.startsWith("application/x-www-form-urlencoded")) {
7217
7217
  const formData = new FormData2();
7218
- const parameters33 = new URLSearchParams(await this.text());
7219
- for (const [name, value] of parameters33) {
7218
+ const parameters34 = new URLSearchParams(await this.text());
7219
+ for (const [name, value] of parameters34) {
7220
7220
  formData.append(name, value);
7221
7221
  }
7222
7222
  return formData;
@@ -10164,11 +10164,11 @@ var require_bignumber = __commonJS({
10164
10164
  return n > 0 || n === i2 ? i2 : i2 - 1;
10165
10165
  }
10166
10166
  function coeffToString(a) {
10167
- var s2, z33, i2 = 1, j = a.length, r2 = a[0] + "";
10167
+ var s2, z37, i2 = 1, j = a.length, r2 = a[0] + "";
10168
10168
  for (; i2 < j; ) {
10169
10169
  s2 = a[i2++] + "";
10170
- z33 = LOG_BASE - s2.length;
10171
- for (; z33--; s2 = "0" + s2) ;
10170
+ z37 = LOG_BASE - s2.length;
10171
+ for (; z37--; s2 = "0" + s2) ;
10172
10172
  r2 += s2;
10173
10173
  }
10174
10174
  for (j = r2.length; r2.charCodeAt(--j) === 48; ) ;
@@ -10201,15 +10201,15 @@ var require_bignumber = __commonJS({
10201
10201
  function toExponential(str, e2) {
10202
10202
  return (str.length > 1 ? str.charAt(0) + "." + str.slice(1) : str) + (e2 < 0 ? "e" : "e+") + e2;
10203
10203
  }
10204
- function toFixedPoint(str, e2, z33) {
10204
+ function toFixedPoint(str, e2, z37) {
10205
10205
  var len, zs;
10206
10206
  if (e2 < 0) {
10207
- for (zs = z33 + "."; ++e2; zs += z33) ;
10207
+ for (zs = z37 + "."; ++e2; zs += z37) ;
10208
10208
  str = zs + str;
10209
10209
  } else {
10210
10210
  len = str.length;
10211
10211
  if (++e2 > len) {
10212
- for (zs = z33, e2 -= len; --e2; zs += z33) ;
10212
+ for (zs = z37, e2 -= len; --e2; zs += z37) ;
10213
10213
  str += zs;
10214
10214
  } else if (e2 < len) {
10215
10215
  str = str.slice(0, e2) + "." + str.slice(e2);
@@ -18796,30 +18796,38 @@ var snowflakeConnector = new ConnectorPlugin({
18796
18796
  releaseFlag: { dev1: true, dev2: true, prod: true },
18797
18797
  onboarding: snowflakeOnboarding,
18798
18798
  systemPrompt: {
18799
- en: `### SQL Reference
18799
+ en: `### Tools
18800
+
18801
+ - \`snowflake_executeQuery\`: Executes a Snowflake SQL query and returns rows. Use this for schema exploration (\`SHOW DATABASES\`, \`SHOW SCHEMAS\`, \`SHOW TABLES\`, \`DESCRIBE TABLE\`) and for sampling data. See the SQL Reference below for syntax notes.
18802
+
18803
+ ### Business Logic
18804
+
18805
+ The business logic type for this connector is "sql".
18806
+
18807
+ ### SQL Reference
18800
18808
  - Use fully qualified names DB.SCHEMA.TABLE for table references
18801
18809
  - Schema exploration commands:
18802
18810
  - List databases: \`SHOW DATABASES\`
18803
18811
  - List schemas: \`SHOW SCHEMAS IN DATABASE db_name\`
18804
18812
  - List tables: \`SHOW TABLES IN SCHEMA db_name.schema_name\`
18805
18813
  - List columns: \`DESCRIBE TABLE db_name.schema_name.table_name\`
18806
- - INFORMATION_SCHEMA is also available: \`SELECT * FROM db_name.INFORMATION_SCHEMA.TABLES\`
18814
+ - INFORMATION_SCHEMA is also available: \`SELECT * FROM db_name.INFORMATION_SCHEMA.TABLES\``,
18815
+ ja: `### \u30C4\u30FC\u30EB
18816
+
18817
+ - \`snowflake_executeQuery\`: Snowflake SQL\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22 (\`SHOW DATABASES\`, \`SHOW SCHEMAS\`, \`SHOW TABLES\`, \`DESCRIBE TABLE\`) \u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u69CB\u6587\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
18807
18818
 
18808
18819
  ### Business Logic
18809
18820
 
18810
- The business logic type for this connector is "sql". Write SQL queries to define data retrieval logic.`,
18811
- ja: `### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
18821
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002
18822
+
18823
+ ### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
18812
18824
  - \u30C6\u30FC\u30D6\u30EB\u53C2\u7167\u306B\u306F\u5B8C\u5168\u4FEE\u98FE\u540D DB.SCHEMA.TABLE \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
18813
18825
  - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u30B3\u30DE\u30F3\u30C9:
18814
18826
  - \u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u4E00\u89A7: \`SHOW DATABASES\`
18815
18827
  - \u30B9\u30AD\u30FC\u30DE\u4E00\u89A7: \`SHOW SCHEMAS IN DATABASE db_name\`
18816
18828
  - \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SHOW TABLES IN SCHEMA db_name.schema_name\`
18817
18829
  - \u30AB\u30E9\u30E0\u4E00\u89A7: \`DESCRIBE TABLE db_name.schema_name.table_name\`
18818
- - INFORMATION_SCHEMA \u3082\u5229\u7528\u53EF\u80FD: \`SELECT * FROM db_name.INFORMATION_SCHEMA.TABLES\`
18819
-
18820
- ### Business Logic
18821
-
18822
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002SQL\u30AF\u30A8\u30EA\u3092\u4F7F\u7528\u3057\u3066\u30C7\u30FC\u30BF\u53D6\u5F97\u30ED\u30B8\u30C3\u30AF\u3092\u5B9A\u7FA9\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
18830
+ - INFORMATION_SCHEMA \u3082\u5229\u7528\u53EF\u80FD: \`SELECT * FROM db_name.INFORMATION_SCHEMA.TABLES\``
18823
18831
  },
18824
18832
  tools,
18825
18833
  async checkConnection(params, _config) {
@@ -19071,30 +19079,38 @@ var snowflakePatConnector = new ConnectorPlugin({
19071
19079
  releaseFlag: { dev1: true, dev2: true, prod: true },
19072
19080
  onboarding: snowflakeOnboarding,
19073
19081
  systemPrompt: {
19074
- en: `### SQL Reference
19082
+ en: `### Tools
19083
+
19084
+ - \`snowflake-pat_executeQuery\`: Executes a Snowflake SQL query (authenticated via PAT) and returns rows. Use this for schema exploration (\`SHOW DATABASES\`, \`SHOW SCHEMAS\`, \`SHOW TABLES\`, \`DESCRIBE TABLE\`) and for sampling data. See the SQL Reference below for syntax notes.
19085
+
19086
+ ### Business Logic
19087
+
19088
+ The business logic type for this connector is "sql".
19089
+
19090
+ ### SQL Reference
19075
19091
  - Use fully qualified names DB.SCHEMA.TABLE for table references
19076
19092
  - Schema exploration commands:
19077
19093
  - List databases: \`SHOW DATABASES\`
19078
19094
  - List schemas: \`SHOW SCHEMAS IN DATABASE db_name\`
19079
19095
  - List tables: \`SHOW TABLES IN SCHEMA db_name.schema_name\`
19080
19096
  - List columns: \`DESCRIBE TABLE db_name.schema_name.table_name\`
19081
- - INFORMATION_SCHEMA is also available: \`SELECT * FROM db_name.INFORMATION_SCHEMA.TABLES\`
19097
+ - INFORMATION_SCHEMA is also available: \`SELECT * FROM db_name.INFORMATION_SCHEMA.TABLES\``,
19098
+ ja: `### \u30C4\u30FC\u30EB
19099
+
19100
+ - \`snowflake-pat_executeQuery\`: Snowflake SQL\u30AF\u30A8\u30EA (PAT\u8A8D\u8A3C) \u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22 (\`SHOW DATABASES\`, \`SHOW SCHEMAS\`, \`SHOW TABLES\`, \`DESCRIBE TABLE\`) \u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u69CB\u6587\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
19082
19101
 
19083
19102
  ### Business Logic
19084
19103
 
19085
- The business logic type for this connector is "sql". Write SQL queries to define data retrieval logic.`,
19086
- ja: `### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
19104
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002
19105
+
19106
+ ### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
19087
19107
  - \u30C6\u30FC\u30D6\u30EB\u53C2\u7167\u306B\u306F\u5B8C\u5168\u4FEE\u98FE\u540D DB.SCHEMA.TABLE \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
19088
19108
  - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u30B3\u30DE\u30F3\u30C9:
19089
19109
  - \u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u4E00\u89A7: \`SHOW DATABASES\`
19090
19110
  - \u30B9\u30AD\u30FC\u30DE\u4E00\u89A7: \`SHOW SCHEMAS IN DATABASE db_name\`
19091
19111
  - \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SHOW TABLES IN SCHEMA db_name.schema_name\`
19092
19112
  - \u30AB\u30E9\u30E0\u4E00\u89A7: \`DESCRIBE TABLE db_name.schema_name.table_name\`
19093
- - INFORMATION_SCHEMA \u3082\u5229\u7528\u53EF\u80FD: \`SELECT * FROM db_name.INFORMATION_SCHEMA.TABLES\`
19094
-
19095
- ### Business Logic
19096
-
19097
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002SQL\u30AF\u30A8\u30EA\u3092\u4F7F\u7528\u3057\u3066\u30C7\u30FC\u30BF\u53D6\u5F97\u30ED\u30B8\u30C3\u30AF\u3092\u5B9A\u7FA9\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
19113
+ - INFORMATION_SCHEMA \u3082\u5229\u7528\u53EF\u80FD: \`SELECT * FROM db_name.INFORMATION_SCHEMA.TABLES\``
19098
19114
  },
19099
19115
  tools: tools2,
19100
19116
  async checkConnection(params, _config) {
@@ -19288,24 +19304,32 @@ var postgresqlConnector = new ConnectorPlugin({
19288
19304
  releaseFlag: { dev1: true, dev2: true, prod: true },
19289
19305
  onboarding: postgresqlOnboarding,
19290
19306
  systemPrompt: {
19291
- en: `### SQL Reference
19307
+ en: `### Tools
19308
+
19309
+ - \`postgresql_executeQuery\`: Executes a PostgreSQL SQL query and returns rows. Use this for schema exploration via \`information_schema.tables\`/\`columns\` and for sampling data. See the SQL Reference below for syntax notes.
19310
+
19311
+ ### Business Logic
19312
+
19313
+ The business logic type for this connector is "sql".
19314
+
19315
+ ### SQL Reference
19292
19316
  - Schema exploration:
19293
19317
  - List tables: \`SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'\`
19294
19318
  - List columns: \`SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'xxx'\`
19295
- - Always include LIMIT in queries
19319
+ - Always include LIMIT in queries`,
19320
+ ja: `### \u30C4\u30FC\u30EB
19321
+
19322
+ - \`postgresql_executeQuery\`: PostgreSQL SQL\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\`information_schema.tables\`/\`columns\` \u3092\u4F7F\u3063\u305F\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u69CB\u6587\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
19296
19323
 
19297
19324
  ### Business Logic
19298
19325
 
19299
- The business logic type for this connector is "sql". Write SQL queries to define data retrieval logic.`,
19300
- ja: `### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
19326
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002
19327
+
19328
+ ### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
19301
19329
  - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22:
19302
19330
  - \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'\`
19303
19331
  - \u30AB\u30E9\u30E0\u4E00\u89A7: \`SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'xxx'\`
19304
- - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A LIMIT \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044
19305
-
19306
- ### Business Logic
19307
-
19308
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002SQL\u30AF\u30A8\u30EA\u3092\u4F7F\u7528\u3057\u3066\u30C7\u30FC\u30BF\u53D6\u5F97\u30ED\u30B8\u30C3\u30AF\u3092\u5B9A\u7FA9\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
19332
+ - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A LIMIT \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044`
19309
19333
  },
19310
19334
  tools: tools3,
19311
19335
  async checkConnection(params, _config) {
@@ -19456,24 +19480,32 @@ var mysqlConnector = new ConnectorPlugin({
19456
19480
  releaseFlag: { dev1: true, dev2: true, prod: true },
19457
19481
  onboarding: mysqlOnboarding,
19458
19482
  systemPrompt: {
19459
- en: `### SQL Reference
19483
+ en: `### Tools
19484
+
19485
+ - \`mysql_executeQuery\`: Executes a MySQL SQL query and returns rows. Use this for schema exploration via \`information_schema.TABLES\`/\`COLUMNS\` and for sampling data. See the SQL Reference below for syntax notes.
19486
+
19487
+ ### Business Logic
19488
+
19489
+ The business logic type for this connector is "sql".
19490
+
19491
+ ### SQL Reference
19460
19492
  - Schema exploration:
19461
19493
  - List tables: \`SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()\`
19462
19494
  - List columns: \`SELECT COLUMN_NAME, DATA_TYPE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'xxx'\`
19463
- - Always include LIMIT in queries
19495
+ - Always include LIMIT in queries`,
19496
+ ja: `### \u30C4\u30FC\u30EB
19497
+
19498
+ - \`mysql_executeQuery\`: MySQL SQL\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\`information_schema.TABLES\`/\`COLUMNS\` \u3092\u4F7F\u3063\u305F\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u69CB\u6587\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
19464
19499
 
19465
19500
  ### Business Logic
19466
19501
 
19467
- The business logic type for this connector is "sql". Write SQL queries to define data retrieval logic.`,
19468
- ja: `### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
19502
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002
19503
+
19504
+ ### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
19469
19505
  - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22:
19470
19506
  - \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()\`
19471
19507
  - \u30AB\u30E9\u30E0\u4E00\u89A7: \`SELECT COLUMN_NAME, DATA_TYPE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'xxx'\`
19472
- - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A LIMIT \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044
19473
-
19474
- ### Business Logic
19475
-
19476
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002SQL\u30AF\u30A8\u30EA\u3092\u4F7F\u7528\u3057\u3066\u30C7\u30FC\u30BF\u53D6\u5F97\u30ED\u30B8\u30C3\u30AF\u3092\u5B9A\u7FA9\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
19508
+ - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A LIMIT \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044`
19477
19509
  },
19478
19510
  tools: tools4,
19479
19511
  async checkConnection(params, _config) {
@@ -19816,28 +19848,42 @@ var bigqueryConnector = new ConnectorPlugin({
19816
19848
  releaseFlag: { dev1: true, dev2: true, prod: true },
19817
19849
  onboarding: bigqueryOnboarding,
19818
19850
  systemPrompt: {
19819
- en: `### SQL Reference
19820
- - Use backtick-quoted fully qualified names \`project.dataset.table\` for table references
19821
- - Use INFORMATION_SCHEMA for schema exploration
19851
+ en: `### Tools
19852
+
19853
+ - \`bigquery_listProjects\`: Lists GCP projects accessible by the configured service account. Use this when you need to discover which projects are available before selecting one.
19854
+ - \`bigquery_listDatasets\`: Lists datasets within the connection's project. Prefer this over querying \`INFORMATION_SCHEMA.SCHEMATA\`.
19855
+ - \`bigquery_executeQuery\`: Executes a BigQuery SQL query and returns rows. Use this for table/column inspection (\`INFORMATION_SCHEMA.TABLES\`/\`COLUMNS\`) and for sampling data. See the SQL Reference below for syntax notes.
19856
+
19857
+ ### Business Logic
19858
+
19859
+ The business logic type for this connector is "sql".
19860
+
19861
+ ### SQL Reference
19862
+
19863
+ - Table references use backtick-quoted fully qualified names: \`\\\`project.dataset.table\\\`\`
19864
+ - Always specify \`project_id\` explicitly in queries
19865
+ - Schema exploration via \`INFORMATION_SCHEMA\`:
19822
19866
  - List tables: \`SELECT table_name FROM \\\`project_id.dataset\\\`.INFORMATION_SCHEMA.TABLES\`
19823
19867
  - List columns: \`SELECT column_name, data_type FROM \\\`project_id.dataset\\\`.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'xxx'\`
19824
- - To list datasets, use the listDatasets tool instead of INFORMATION_SCHEMA.SCHEMATA
19825
- - Always specify project_id explicitly in queries
19868
+ - For listing datasets, use the \`bigquery_listDatasets\` tool instead of \`INFORMATION_SCHEMA.SCHEMATA\``,
19869
+ ja: `### \u30C4\u30FC\u30EB
19870
+
19871
+ - \`bigquery_listProjects\`: \u8A2D\u5B9A\u3055\u308C\u305F\u30B5\u30FC\u30D3\u30B9\u30A2\u30AB\u30A6\u30F3\u30C8\u304C\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AGCP\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3092\u9078\u3076\u524D\u306B\u5229\u7528\u53EF\u80FD\u306A\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3092\u63A2\u7D22\u3059\u308B\u6642\u306B\u4F7F\u3044\u307E\u3059\u3002
19872
+ - \`bigquery_listDatasets\`: \u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u5185\u306E\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\`INFORMATION_SCHEMA.SCHEMATA\` \u3092\u30AF\u30A8\u30EA\u3059\u308B\u3088\u308A\u3053\u3061\u3089\u3092\u512A\u5148\u3057\u3066\u304F\u3060\u3055\u3044\u3002
19873
+ - \`bigquery_executeQuery\`: BigQuery SQL\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\u30C6\u30FC\u30D6\u30EB/\u30AB\u30E9\u30E0\u306E\u78BA\u8A8D (\`INFORMATION_SCHEMA.TABLES\`/\`COLUMNS\`) \u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u69CB\u6587\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
19826
19874
 
19827
19875
  ### Business Logic
19828
19876
 
19829
- The business logic type for this connector is "sql". Write SQL queries to define data retrieval logic.`,
19830
- ja: `### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
19831
- - \u30C6\u30FC\u30D6\u30EB\u53C2\u7167\u306B\u306F\u30D0\u30C3\u30AF\u30AF\u30A9\u30FC\u30C8\u3067\u56F2\u3093\u3060\u5B8C\u5168\u4FEE\u98FE\u540D \`project.dataset.table\` \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
19832
- - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u306B\u306F INFORMATION_SCHEMA \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
19833
- - \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SELECT table_name FROM \\\`project_id.dataset\\\`.INFORMATION_SCHEMA.TABLES\`
19834
- - \u30AB\u30E9\u30E0\u4E00\u89A7: \`SELECT column_name, data_type FROM \\\`project_id.dataset\\\`.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'xxx'\`
19835
- - \u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B\u306B\u306F\u3001INFORMATION_SCHEMA.SCHEMATA \u3067\u306F\u306A\u304F listDatasets \u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
19836
- - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A project_id \u3092\u660E\u793A\u7684\u306B\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044
19877
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002
19837
19878
 
19838
- ### Business Logic
19879
+ ### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
19839
19880
 
19840
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002SQL\u30AF\u30A8\u30EA\u3092\u4F7F\u7528\u3057\u3066\u30C7\u30FC\u30BF\u53D6\u5F97\u30ED\u30B8\u30C3\u30AF\u3092\u5B9A\u7FA9\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
19881
+ - \u30C6\u30FC\u30D6\u30EB\u53C2\u7167\u306B\u306F\u30D0\u30C3\u30AF\u30AF\u30A9\u30FC\u30C8\u3067\u56F2\u3093\u3060\u5B8C\u5168\u4FEE\u98FE\u540D \`\\\`project.dataset.table\\\`\` \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
19882
+ - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A \`project_id\` \u3092\u660E\u793A\u7684\u306B\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044
19883
+ - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u306F \`INFORMATION_SCHEMA\` \u3092\u4F7F\u7528\u3057\u307E\u3059:
19884
+ - \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SELECT table_name FROM \\\`project_id.dataset\\\`.INFORMATION_SCHEMA.TABLES\`
19885
+ - \u30AB\u30E9\u30E0\u4E00\u89A7: \`SELECT column_name, data_type FROM \\\`project_id.dataset\\\`.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'xxx'\`
19886
+ - \u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u4E00\u89A7\u306E\u53D6\u5F97\u306B\u306F \`INFORMATION_SCHEMA.SCHEMATA\` \u3067\u306F\u306A\u304F \`bigquery_listDatasets\` \u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044`
19841
19887
  },
19842
19888
  tools: tools5,
19843
19889
  async checkConnection(params, _config) {
@@ -20344,28 +20390,40 @@ var bigqueryOauthConnector = new ConnectorPlugin({
20344
20390
  ]
20345
20391
  },
20346
20392
  systemPrompt: {
20347
- en: `### SQL Reference
20348
- - Use backtick-quoted fully qualified names \`project.dataset.table\` for table references
20349
- - Use INFORMATION_SCHEMA for schema exploration
20393
+ en: `### Tools
20394
+
20395
+ - \`bigquery-oauth_listProjects\`: Lists GCP projects accessible by the authenticated user. Use this when you need to discover which projects are available before selecting one.
20396
+ - \`bigquery-oauth_listDatasets\`: Lists datasets within the connection's project. Prefer this over querying \`INFORMATION_SCHEMA.SCHEMATA\`.
20397
+ - \`bigquery-oauth_executeQuery\`: Executes a BigQuery SQL query and returns rows. Use this for table/column inspection (\`INFORMATION_SCHEMA.TABLES\`/\`COLUMNS\`) and for sampling data. See the SQL Reference below for syntax notes.
20398
+
20399
+ ### Business Logic
20400
+
20401
+ The business logic type for this connector is "sql".
20402
+
20403
+ ### SQL Reference
20404
+ - Table references use backtick-quoted fully qualified names: \`\\\`project.dataset.table\\\`\`
20405
+ - Always specify \`project_id\` explicitly in queries
20406
+ - Schema exploration via \`INFORMATION_SCHEMA\`:
20350
20407
  - List tables: \`SELECT table_name FROM \\\`project_id.dataset\\\`.INFORMATION_SCHEMA.TABLES\`
20351
20408
  - List columns: \`SELECT column_name, data_type FROM \\\`project_id.dataset\\\`.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'xxx'\`
20352
- - To list datasets, use the listDatasets tool instead of INFORMATION_SCHEMA.SCHEMATA
20353
- - Always specify project_id explicitly in queries
20409
+ - For listing datasets, use the \`bigquery-oauth_listDatasets\` tool instead of \`INFORMATION_SCHEMA.SCHEMATA\``,
20410
+ ja: `### \u30C4\u30FC\u30EB
20411
+
20412
+ - \`bigquery-oauth_listProjects\`: \u8A8D\u8A3C\u6E08\u307F\u30E6\u30FC\u30B6\u30FC\u304C\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AGCP\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3092\u9078\u3076\u524D\u306B\u5229\u7528\u53EF\u80FD\u306A\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3092\u63A2\u7D22\u3059\u308B\u6642\u306B\u4F7F\u3044\u307E\u3059\u3002
20413
+ - \`bigquery-oauth_listDatasets\`: \u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u5185\u306E\u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\`INFORMATION_SCHEMA.SCHEMATA\` \u3092\u30AF\u30A8\u30EA\u3059\u308B\u3088\u308A\u3053\u3061\u3089\u3092\u512A\u5148\u3057\u3066\u304F\u3060\u3055\u3044\u3002
20414
+ - \`bigquery-oauth_executeQuery\`: BigQuery SQL\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\u30C6\u30FC\u30D6\u30EB/\u30AB\u30E9\u30E0\u306E\u78BA\u8A8D (\`INFORMATION_SCHEMA.TABLES\`/\`COLUMNS\`) \u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u69CB\u6587\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
20354
20415
 
20355
20416
  ### Business Logic
20356
20417
 
20357
- The business logic type for this connector is "sql". Write SQL queries to define data retrieval logic.`,
20358
- ja: `### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
20359
- - \u30C6\u30FC\u30D6\u30EB\u53C2\u7167\u306B\u306F\u30D0\u30C3\u30AF\u30AF\u30A9\u30FC\u30C8\u3067\u56F2\u3093\u3060\u5B8C\u5168\u4FEE\u98FE\u540D \`project.dataset.table\` \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
20360
- - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u306B\u306F INFORMATION_SCHEMA \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
20418
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002
20419
+
20420
+ ### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
20421
+ - \u30C6\u30FC\u30D6\u30EB\u53C2\u7167\u306B\u306F\u30D0\u30C3\u30AF\u30AF\u30A9\u30FC\u30C8\u3067\u56F2\u3093\u3060\u5B8C\u5168\u4FEE\u98FE\u540D \`\\\`project.dataset.table\\\`\` \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
20422
+ - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A \`project_id\` \u3092\u660E\u793A\u7684\u306B\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044
20423
+ - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u306F \`INFORMATION_SCHEMA\` \u3092\u4F7F\u7528\u3057\u307E\u3059:
20361
20424
  - \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SELECT table_name FROM \\\`project_id.dataset\\\`.INFORMATION_SCHEMA.TABLES\`
20362
20425
  - \u30AB\u30E9\u30E0\u4E00\u89A7: \`SELECT column_name, data_type FROM \\\`project_id.dataset\\\`.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'xxx'\`
20363
- - \u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\u3059\u308B\u306B\u306F\u3001INFORMATION_SCHEMA.SCHEMATA \u3067\u306F\u306A\u304F listDatasets \u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044
20364
- - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A project_id \u3092\u660E\u793A\u7684\u306B\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044
20365
-
20366
- ### Business Logic
20367
-
20368
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002SQL\u30AF\u30A8\u30EA\u3092\u4F7F\u7528\u3057\u3066\u30C7\u30FC\u30BF\u53D6\u5F97\u30ED\u30B8\u30C3\u30AF\u3092\u5B9A\u7FA9\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
20426
+ - \u30C7\u30FC\u30BF\u30BB\u30C3\u30C8\u4E00\u89A7\u306E\u53D6\u5F97\u306B\u306F \`INFORMATION_SCHEMA.SCHEMATA\` \u3067\u306F\u306A\u304F \`bigquery-oauth_listDatasets\` \u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044`
20369
20427
  },
20370
20428
  tools: tools6,
20371
20429
  async checkConnection(params, config) {
@@ -20596,30 +20654,38 @@ var awsAthenaConnector = new ConnectorPlugin({
20596
20654
  releaseFlag: { dev1: true, dev2: true, prod: true },
20597
20655
  onboarding: awsAthenaOnboarding,
20598
20656
  systemPrompt: {
20599
- en: `### SQL Reference
20657
+ en: `### Tools
20658
+
20659
+ - \`aws-athena_executeQuery\`: Executes an Athena (Presto/Trino) SQL query and returns rows. Use this for schema exploration (\`SHOW DATABASES\`, \`SHOW TABLES\`, \`DESCRIBE\`) and for sampling data. See the SQL Reference below for syntax notes.
20660
+
20661
+ ### Business Logic
20662
+
20663
+ The business logic type for this connector is "sql".
20664
+
20665
+ ### SQL Reference
20600
20666
  - Uses Presto/Trino based SQL syntax
20601
20667
  - Schema exploration:
20602
20668
  - List databases: \`SHOW DATABASES\`
20603
20669
  - List tables: \`SHOW TABLES\` or \`SHOW TABLES IN database_name\`
20604
20670
  - List columns: \`DESCRIBE table_name\`
20605
20671
  - Always include LIMIT in queries
20606
- - Query execution is asynchronous and results may take time to retrieve
20672
+ - Query execution is asynchronous and results may take time to retrieve`,
20673
+ ja: `### \u30C4\u30FC\u30EB
20674
+
20675
+ - \`aws-athena_executeQuery\`: Athena (Presto/Trino) SQL\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22 (\`SHOW DATABASES\`, \`SHOW TABLES\`, \`DESCRIBE\`) \u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u69CB\u6587\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
20607
20676
 
20608
20677
  ### Business Logic
20609
20678
 
20610
- The business logic type for this connector is "sql". Write SQL queries to define data retrieval logic.`,
20611
- ja: `### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
20679
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002
20680
+
20681
+ ### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
20612
20682
  - Presto/Trino \u30D9\u30FC\u30B9\u306E SQL \u69CB\u6587\u3092\u4F7F\u7528\u3057\u307E\u3059
20613
20683
  - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22:
20614
20684
  - \u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u4E00\u89A7: \`SHOW DATABASES\`
20615
20685
  - \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SHOW TABLES\` \u307E\u305F\u306F \`SHOW TABLES IN database_name\`
20616
20686
  - \u30AB\u30E9\u30E0\u4E00\u89A7: \`DESCRIBE table_name\`
20617
20687
  - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A LIMIT \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044
20618
- - \u30AF\u30A8\u30EA\u5B9F\u884C\u306F\u975E\u540C\u671F\u3067\u3001\u7D50\u679C\u306E\u53D6\u5F97\u306B\u6642\u9593\u304C\u304B\u304B\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059
20619
-
20620
- ### Business Logic
20621
-
20622
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002SQL\u30AF\u30A8\u30EA\u3092\u4F7F\u7528\u3057\u3066\u30C7\u30FC\u30BF\u53D6\u5F97\u30ED\u30B8\u30C3\u30AF\u3092\u5B9A\u7FA9\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
20688
+ - \u30AF\u30A8\u30EA\u5B9F\u884C\u306F\u975E\u540C\u671F\u3067\u3001\u7D50\u679C\u306E\u53D6\u5F97\u306B\u6642\u9593\u304C\u304B\u304B\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059`
20623
20689
  },
20624
20690
  tools: tools7,
20625
20691
  async checkConnection(params, _config) {
@@ -20960,30 +21026,38 @@ var redshiftConnector = new ConnectorPlugin({
20960
21026
  releaseFlag: { dev1: true, dev2: true, prod: true },
20961
21027
  onboarding: redshiftOnboarding,
20962
21028
  systemPrompt: {
20963
- en: `### SQL Reference
21029
+ en: `### Tools
21030
+
21031
+ - \`redshift_executeQuery\`: Executes a Redshift (PostgreSQL-based) SQL query and returns rows. Use this for schema exploration via \`pg_tables\`/\`information_schema.columns\` and for sampling data. See the SQL Reference below for syntax notes.
21032
+
21033
+ ### Business Logic
21034
+
21035
+ The business logic type for this connector is "sql".
21036
+
21037
+ ### SQL Reference
20964
21038
  - Uses PostgreSQL based SQL syntax
20965
21039
  - Schema exploration:
20966
21040
  - List schemas: \`SELECT DISTINCT schemaname FROM pg_tables\`
20967
21041
  - List tables: \`SELECT tablename FROM pg_tables WHERE schemaname = 'public'\`
20968
21042
  - List columns: \`SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'xxx'\`
20969
21043
  - Always include LIMIT in queries
20970
- - Query execution is asynchronous and results may take time to retrieve
21044
+ - Query execution is asynchronous and results may take time to retrieve`,
21045
+ ja: `### \u30C4\u30FC\u30EB
21046
+
21047
+ - \`redshift_executeQuery\`: Redshift (PostgreSQL\u30D9\u30FC\u30B9) SQL\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\`pg_tables\`/\`information_schema.columns\` \u3092\u4F7F\u3063\u305F\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u69CB\u6587\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
20971
21048
 
20972
21049
  ### Business Logic
20973
21050
 
20974
- The business logic type for this connector is "sql". Write SQL queries to define data retrieval logic.`,
20975
- ja: `### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
21051
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002
21052
+
21053
+ ### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
20976
21054
  - PostgreSQL \u30D9\u30FC\u30B9\u306E SQL \u69CB\u6587\u3092\u4F7F\u7528\u3057\u307E\u3059
20977
21055
  - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22:
20978
21056
  - \u30B9\u30AD\u30FC\u30DE\u4E00\u89A7: \`SELECT DISTINCT schemaname FROM pg_tables\`
20979
21057
  - \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SELECT tablename FROM pg_tables WHERE schemaname = 'public'\`
20980
21058
  - \u30AB\u30E9\u30E0\u4E00\u89A7: \`SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'xxx'\`
20981
21059
  - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A LIMIT \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044
20982
- - \u30AF\u30A8\u30EA\u5B9F\u884C\u306F\u975E\u540C\u671F\u3067\u3001\u7D50\u679C\u306E\u53D6\u5F97\u306B\u6642\u9593\u304C\u304B\u304B\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059
20983
-
20984
- ### Business Logic
20985
-
20986
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002SQL\u30AF\u30A8\u30EA\u3092\u4F7F\u7528\u3057\u3066\u30C7\u30FC\u30BF\u53D6\u5F97\u30ED\u30B8\u30C3\u30AF\u3092\u5B9A\u7FA9\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
21060
+ - \u30AF\u30A8\u30EA\u5B9F\u884C\u306F\u975E\u540C\u671F\u3067\u3001\u7D50\u679C\u306E\u53D6\u5F97\u306B\u6642\u9593\u304C\u304B\u304B\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059`
20987
21061
  },
20988
21062
  tools: tools8,
20989
21063
  async checkConnection(params, _config) {
@@ -21238,30 +21312,38 @@ var databricksConnector = new ConnectorPlugin({
21238
21312
  releaseFlag: { dev1: true, dev2: true, prod: true },
21239
21313
  onboarding: databricksOnboarding,
21240
21314
  systemPrompt: {
21241
- en: `### SQL Reference
21315
+ en: `### Tools
21316
+
21317
+ - \`databricks_executeQuery\`: Executes a Databricks/Spark SQL query and returns rows. Use this for schema exploration (\`SHOW CATALOGS\`, \`SHOW SCHEMAS\`, \`SHOW TABLES\`, \`DESCRIBE TABLE\`) and for sampling data. See the SQL Reference below for syntax notes.
21318
+
21319
+ ### Business Logic
21320
+
21321
+ The business logic type for this connector is "sql".
21322
+
21323
+ ### SQL Reference
21242
21324
  - Uses Spark SQL / Databricks SQL syntax
21243
21325
  - Schema exploration:
21244
21326
  - List catalogs: \`SHOW CATALOGS\`
21245
21327
  - List databases: \`SHOW DATABASES\` or \`SHOW SCHEMAS\`
21246
21328
  - List tables: \`SHOW TABLES\` or \`SHOW TABLES IN database_name\`
21247
21329
  - List columns: \`DESCRIBE TABLE table_name\`
21248
- - Always include LIMIT in queries
21330
+ - Always include LIMIT in queries`,
21331
+ ja: `### \u30C4\u30FC\u30EB
21332
+
21333
+ - \`databricks_executeQuery\`: Databricks/Spark SQL\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22 (\`SHOW CATALOGS\`, \`SHOW SCHEMAS\`, \`SHOW TABLES\`, \`DESCRIBE TABLE\`) \u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u69CB\u6587\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
21249
21334
 
21250
21335
  ### Business Logic
21251
21336
 
21252
- The business logic type for this connector is "sql". Write SQL queries to define data retrieval logic.`,
21253
- ja: `### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
21337
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002
21338
+
21339
+ ### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
21254
21340
  - Spark SQL / Databricks SQL \u69CB\u6587\u3092\u4F7F\u7528\u3057\u307E\u3059
21255
21341
  - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22:
21256
21342
  - \u30AB\u30BF\u30ED\u30B0\u4E00\u89A7: \`SHOW CATALOGS\`
21257
21343
  - \u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u4E00\u89A7: \`SHOW DATABASES\` \u307E\u305F\u306F \`SHOW SCHEMAS\`
21258
21344
  - \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SHOW TABLES\` \u307E\u305F\u306F \`SHOW TABLES IN database_name\`
21259
21345
  - \u30AB\u30E9\u30E0\u4E00\u89A7: \`DESCRIBE TABLE table_name\`
21260
- - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A LIMIT \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044
21261
-
21262
- ### Business Logic
21263
-
21264
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002SQL\u30AF\u30A8\u30EA\u3092\u4F7F\u7528\u3057\u3066\u30C7\u30FC\u30BF\u53D6\u5F97\u30ED\u30B8\u30C3\u30AF\u3092\u5B9A\u7FA9\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
21346
+ - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A LIMIT \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044`
21265
21347
  },
21266
21348
  tools: tools9,
21267
21349
  async checkConnection(params, _config) {
@@ -21436,106 +21518,124 @@ var airtableConnector = new ConnectorPlugin({
21436
21518
  releaseFlag: { dev1: true, dev2: true, prod: true },
21437
21519
  onboarding: airtableOnboarding,
21438
21520
  systemPrompt: {
21439
- en: `### Airtable API
21440
- - Call the Airtable REST API using the authenticated request tool
21441
- - {baseId} in the path is automatically replaced
21442
-
21443
- ### List Tables (Schema Exploration)
21444
- - GET meta/bases/{baseId}/tables
21445
-
21446
- ### Get Records
21447
- - GET {baseId}/{tableIdOrName}
21448
- - Query parameter examples: ?maxRecords=100&filterByFormula={formula}&sort[0][field]=Name&sort[0][direction]=asc
21449
- - Filter columns with fields[]: ?fields[]=Name&fields[]=Email
21450
-
21451
- ### Create Record
21452
- - POST {baseId}/{tableIdOrName}
21453
- - Body: { "records": [{ "fields": { "Name": "value", ... } }] }
21521
+ en: `### Tools
21454
21522
 
21455
- ### Pagination
21456
- - If the response contains an offset, fetch the next page by appending ?offset={offset} to the next request
21523
+ - \`airtable_request\`: The only way to call the Airtable REST API. Use it to list tables, read records, and create/update records. The \`{baseId}\` placeholder in the path is automatically replaced. See the Airtable API Reference below for available endpoints and query parameters.
21457
21524
 
21458
21525
  ### Business Logic
21459
21526
 
21460
- The business logic type for this connector is "typescript". Write handler code using the connector SDK shown below. Do NOT access credentials directly from environment variables.
21527
+ The business logic type for this connector is "typescript". Use the connector SDK in your handler. Do NOT read credentials from environment variables.
21461
21528
 
21462
- #### Example
21529
+ SDK methods (client created via \`connection(connectionId)\`):
21530
+ - \`client.request(path, init?)\` \u2014 low-level authenticated fetch
21531
+ - \`client.listTables()\` \u2014 list tables in the base (schema exploration)
21532
+ - \`client.listRecords(tableName, options?)\` \u2014 list records with filtering/sorting/pagination
21533
+ - \`client.getRecord(tableName, recordId)\` \u2014 fetch a single record
21534
+ - \`client.createRecords(tableName, records)\` \u2014 create records
21535
+ - \`client.updateRecords(tableName, records)\` \u2014 update records
21463
21536
 
21464
21537
  \`\`\`ts
21538
+ import type { Context } from "hono";
21465
21539
  import { connection } from "@squadbase/vite-server/connectors/airtable";
21466
21540
 
21467
21541
  const airtable = connection("<connectionId>");
21468
21542
 
21469
- // Authenticated fetch (returns standard Response)
21470
- const res = await airtable.request("meta/bases/{baseId}/tables");
21471
- const data = await res.json();
21543
+ export default async function handler(c: Context) {
21544
+ const { status = "Done" } = await c.req.json<{ status?: string }>();
21472
21545
 
21473
- // Convenience methods
21474
- const { tables } = await airtable.listTables();
21475
- const { records, offset } = await airtable.listRecords("Tasks", {
21476
- filterByFormula: '{Status} = "Done"',
21477
- fields: ["Name", "Status"],
21478
- maxRecords: 100,
21479
- sort: [{ field: "Name", direction: "asc" }],
21480
- });
21481
- const record = await airtable.getRecord("Tasks", "recXXXXXX");
21482
- await airtable.createRecords("Tasks", [
21483
- { fields: { Name: "New task", Status: "Todo" } },
21484
- ]);
21485
- await airtable.updateRecords("Tasks", [
21486
- { id: "recXXXXXX", fields: { Status: "Done" } },
21487
- ]);
21488
- \`\`\``,
21489
- ja: `### Airtable API
21490
- - \u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066Airtable REST API\u3092\u547C\u3073\u51FA\u3057\u307E\u3059
21491
- - \u30D1\u30B9\u5185\u306E {baseId} \u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059
21546
+ const { records } = await airtable.listRecords("Tasks", {
21547
+ filterByFormula: \`{Status} = "\${status}"\`,
21548
+ fields: ["Name", "Status", "DueDate"],
21549
+ sort: [{ field: "DueDate", direction: "asc" }],
21550
+ maxRecords: 100,
21551
+ });
21552
+
21553
+ return c.json(
21554
+ records.map((r) => ({
21555
+ id: r.id,
21556
+ name: r.fields.Name,
21557
+ status: r.fields.Status,
21558
+ dueDate: r.fields.DueDate,
21559
+ })),
21560
+ );
21561
+ }
21562
+ \`\`\`
21492
21563
 
21493
- ### \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7\u306E\u53D6\u5F97\uFF08\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\uFF09
21494
- - GET meta/bases/{baseId}/tables
21564
+ ### Airtable API Reference
21495
21565
 
21496
- ### \u30EC\u30B3\u30FC\u30C9\u306E\u53D6\u5F97
21497
- - GET {baseId}/{tableIdOrName}
21498
- - \u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u4F8B: ?maxRecords=100&filterByFormula={formula}&sort[0][field]=Name&sort[0][direction]=asc
21499
- - fields[] \u3067\u30AB\u30E9\u30E0\u3092\u30D5\u30A3\u30EB\u30BF: ?fields[]=Name&fields[]=Email
21566
+ #### List Tables (Schema Exploration)
21567
+ - \`GET meta/bases/{baseId}/tables\`
21500
21568
 
21501
- ### \u30EC\u30B3\u30FC\u30C9\u306E\u4F5C\u6210
21502
- - POST {baseId}/{tableIdOrName}
21503
- - Body: { "records": [{ "fields": { "Name": "value", ... } }] }
21569
+ #### Get Records
21570
+ - \`GET {baseId}/{tableIdOrName}\`
21571
+ - Query parameter examples: \`?maxRecords=100&filterByFormula={formula}&sort[0][field]=Name&sort[0][direction]=asc\`
21572
+ - Filter columns with fields[]: \`?fields[]=Name&fields[]=Email\`
21504
21573
 
21505
- ### \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3
21506
- - \u30EC\u30B9\u30DD\u30F3\u30B9\u306B offset \u304C\u542B\u307E\u308C\u308B\u5834\u5408\u3001\u6B21\u306E\u30EA\u30AF\u30A8\u30B9\u30C8\u306B ?offset={offset} \u3092\u8FFD\u52A0\u3057\u3066\u6B21\u306E\u30DA\u30FC\u30B8\u3092\u53D6\u5F97\u3057\u307E\u3059
21574
+ #### Create Record
21575
+ - \`POST {baseId}/{tableIdOrName}\`
21576
+ - Body: \`{ "records": [{ "fields": { "Name": "value", ... } }] }\`
21577
+
21578
+ #### Pagination
21579
+ - If the response contains an \`offset\`, fetch the next page by appending \`?offset={offset}\` to the next request`,
21580
+ ja: `### \u30C4\u30FC\u30EB
21581
+
21582
+ - \`airtable_request\`: Airtable REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30C6\u30FC\u30D6\u30EB\u4E00\u89A7\u306E\u53D6\u5F97\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u8AAD\u307F\u53D6\u308A\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E \`{baseId}\` \u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3068\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u306F\u4E0B\u90E8\u306E\u300CAirtable API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
21507
21583
 
21508
21584
  ### Business Logic
21509
21585
 
21510
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u4EE5\u4E0B\u306B\u793A\u3059\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u30B3\u30FC\u30C9\u3092\u8A18\u8FF0\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u76F4\u63A5\u8A8D\u8A3C\u60C5\u5831\u306B\u30A2\u30AF\u30BB\u30B9\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
21586
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
21511
21587
 
21512
- #### Example
21588
+ SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
21589
+ - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
21590
+ - \`client.listTables()\` \u2014 \u30D9\u30FC\u30B9\u5185\u306E\u30C6\u30FC\u30D6\u30EB\u4E00\u89A7\u3092\u53D6\u5F97\uFF08\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\uFF09
21591
+ - \`client.listRecords(tableName, options?)\` \u2014 \u30D5\u30A3\u30EB\u30BF/\u30BD\u30FC\u30C8/\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u4ED8\u304D\u3067\u30EC\u30B3\u30FC\u30C9\u53D6\u5F97
21592
+ - \`client.getRecord(tableName, recordId)\` \u2014 \u5358\u4E00\u30EC\u30B3\u30FC\u30C9\u3092\u53D6\u5F97
21593
+ - \`client.createRecords(tableName, records)\` \u2014 \u30EC\u30B3\u30FC\u30C9\u3092\u4F5C\u6210
21594
+ - \`client.updateRecords(tableName, records)\` \u2014 \u30EC\u30B3\u30FC\u30C9\u3092\u66F4\u65B0
21513
21595
 
21514
21596
  \`\`\`ts
21597
+ import type { Context } from "hono";
21515
21598
  import { connection } from "@squadbase/vite-server/connectors/airtable";
21516
21599
 
21517
21600
  const airtable = connection("<connectionId>");
21518
21601
 
21519
- // Authenticated fetch (returns standard Response)
21520
- const res = await airtable.request("meta/bases/{baseId}/tables");
21521
- const data = await res.json();
21602
+ export default async function handler(c: Context) {
21603
+ const { status = "Done" } = await c.req.json<{ status?: string }>();
21522
21604
 
21523
- // Convenience methods
21524
- const { tables } = await airtable.listTables();
21525
- const { records, offset } = await airtable.listRecords("Tasks", {
21526
- filterByFormula: '{Status} = "Done"',
21527
- fields: ["Name", "Status"],
21528
- maxRecords: 100,
21529
- sort: [{ field: "Name", direction: "asc" }],
21530
- });
21531
- const record = await airtable.getRecord("Tasks", "recXXXXXX");
21532
- await airtable.createRecords("Tasks", [
21533
- { fields: { Name: "New task", Status: "Todo" } },
21534
- ]);
21535
- await airtable.updateRecords("Tasks", [
21536
- { id: "recXXXXXX", fields: { Status: "Done" } },
21537
- ]);
21538
- \`\`\``
21605
+ const { records } = await airtable.listRecords("Tasks", {
21606
+ filterByFormula: \`{Status} = "\${status}"\`,
21607
+ fields: ["Name", "Status", "DueDate"],
21608
+ sort: [{ field: "DueDate", direction: "asc" }],
21609
+ maxRecords: 100,
21610
+ });
21611
+
21612
+ return c.json(
21613
+ records.map((r) => ({
21614
+ id: r.id,
21615
+ name: r.fields.Name,
21616
+ status: r.fields.Status,
21617
+ dueDate: r.fields.DueDate,
21618
+ })),
21619
+ );
21620
+ }
21621
+ \`\`\`
21622
+
21623
+ ### Airtable API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
21624
+
21625
+ #### \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7\u306E\u53D6\u5F97\uFF08\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\uFF09
21626
+ - \`GET meta/bases/{baseId}/tables\`
21627
+
21628
+ #### \u30EC\u30B3\u30FC\u30C9\u306E\u53D6\u5F97
21629
+ - \`GET {baseId}/{tableIdOrName}\`
21630
+ - \u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u4F8B: \`?maxRecords=100&filterByFormula={formula}&sort[0][field]=Name&sort[0][direction]=asc\`
21631
+ - fields[] \u3067\u30AB\u30E9\u30E0\u3092\u30D5\u30A3\u30EB\u30BF: \`?fields[]=Name&fields[]=Email\`
21632
+
21633
+ #### \u30EC\u30B3\u30FC\u30C9\u306E\u4F5C\u6210
21634
+ - \`POST {baseId}/{tableIdOrName}\`
21635
+ - Body: \`{ "records": [{ "fields": { "Name": "value", ... } }] }\`
21636
+
21637
+ #### \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3
21638
+ - \u30EC\u30B9\u30DD\u30F3\u30B9\u306B \`offset\` \u304C\u542B\u307E\u308C\u308B\u5834\u5408\u3001\u6B21\u306E\u30EA\u30AF\u30A8\u30B9\u30C8\u306B \`?offset={offset}\` \u3092\u8FFD\u52A0\u3057\u3066\u6B21\u306E\u30DA\u30FC\u30B8\u3092\u53D6\u5F97\u3057\u307E\u3059`
21539
21639
  },
21540
21640
  tools: tools10
21541
21641
  });
@@ -21915,11 +22015,14 @@ var googleAdsOauthConnector = new ConnectorPlugin({
21915
22015
  ]
21916
22016
  },
21917
22017
  systemPrompt: {
21918
- en: `### Google Ads API (OAuth, Read-Only)
21919
- - Use GAQL (Google Ads Query Language) to query campaign data
21920
- - {customerId} in the path is automatically replaced (hyphens removed)
22018
+ en: `### Tools
21921
22019
 
21922
- ### Query Data (searchStream)
22020
+ - \`google-ads-oauth_request\`: Send authenticated requests to the Google Ads API. Use it for GAQL queries via searchStream. The {customerId} placeholder in paths is automatically replaced (hyphens removed). Authentication and developer token are configured automatically.
22021
+ - \`google-ads-oauth_listCustomers\`: List accessible Google Ads customer accounts. Use this during setup to discover available accounts.
22022
+
22023
+ ### Google Ads API Reference
22024
+
22025
+ #### Query Data (searchStream)
21923
22026
  - POST customers/{customerId}/googleAds:searchStream
21924
22027
  - Body: { "query": "SELECT campaign.id, campaign.name, metrics.impressions FROM campaign WHERE segments.date DURING LAST_30_DAYS" }
21925
22028
 
@@ -21965,11 +22068,14 @@ rows.forEach(row => console.log(row));
21965
22068
  // List accessible customer accounts
21966
22069
  const customerIds = await ads.listAccessibleCustomers();
21967
22070
  \`\`\``,
21968
- ja: `### Google Ads API (OAuth\u3001\u8AAD\u307F\u53D6\u308A\u5C02\u7528)
21969
- - GAQL (Google Ads Query Language) \u3092\u4F7F\u7528\u3057\u3066\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30C7\u30FC\u30BF\u3092\u30AF\u30A8\u30EA\u3057\u307E\u3059
21970
- - \u30D1\u30B9\u5185\u306E {customerId} \u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\uFF08\u30CF\u30A4\u30D5\u30F3\u306F\u9664\u53BB\uFF09
22071
+ ja: `### \u30C4\u30FC\u30EB
22072
+
22073
+ - \`google-ads-oauth_request\`: Google Ads API\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002searchStream\u3092\u4F7F\u3063\u305FGAQL\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{customerId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\uFF08\u30CF\u30A4\u30D5\u30F3\u306F\u9664\u53BB\uFF09\u3002\u8A8D\u8A3C\u3068\u30C7\u30D9\u30ED\u30C3\u30D1\u30FC\u30C8\u30FC\u30AF\u30F3\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
22074
+ - \`google-ads-oauth_listCustomers\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AGoogle Ads\u9867\u5BA2\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
22075
+
22076
+ ### Google Ads API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
21971
22077
 
21972
- ### \u30C7\u30FC\u30BF\u306E\u30AF\u30A8\u30EA (searchStream)
22078
+ #### \u30C7\u30FC\u30BF\u306E\u30AF\u30A8\u30EA (searchStream)
21973
22079
  - POST customers/{customerId}/googleAds:searchStream
21974
22080
  - Body: { "query": "SELECT campaign.id, campaign.name, metrics.impressions FROM campaign WHERE segments.date DURING LAST_30_DAYS" }
21975
22081
 
@@ -22188,126 +22294,142 @@ var googleAnalyticsConnector = new ConnectorPlugin({
22188
22294
  releaseFlag: { dev1: true, dev2: true, prod: true },
22189
22295
  onboarding: googleAnalyticsOnboarding,
22190
22296
  systemPrompt: {
22191
- en: `### Google Analytics Data API
22192
- - Call the GA4 Data API using the authenticated request tool
22193
- - {propertyId} in the path is automatically replaced
22194
-
22195
- ### Get Metadata (Check available dimensions and metrics)
22196
- - GET properties/{propertyId}/metadata
22197
-
22198
- ### Get Report
22199
- - POST properties/{propertyId}:runReport
22200
- - Body example:
22201
- {
22202
- "dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
22203
- "dimensions": [{"name": "date"}],
22204
- "metrics": [{"name": "activeUsers"}],
22205
- "limit": 100
22206
- }
22207
-
22208
- ### Common Dimensions
22209
- date, country, city, deviceCategory, browser, pagePath, pageTitle,
22210
- sessionSource, sessionMedium, eventName
22211
-
22212
- ### Common Metrics
22213
- activeUsers, sessions, screenPageViews, bounceRate,
22214
- averageSessionDuration, conversions, totalRevenue
22297
+ en: `### Tools
22215
22298
 
22216
- ### Date Specification
22217
- - Absolute: "2024-01-01"
22218
- - Relative: "today", "yesterday", "7daysAgo", "30daysAgo"
22299
+ - \`google-analytics_request\`: The only way to call the GA4 Data API. Use it to fetch metadata, run reports, or run realtime reports. See the GA4 Data API Reference below for available endpoints and request bodies.
22219
22300
 
22220
22301
  ### Business Logic
22221
22302
 
22222
- The business logic type for this connector is "typescript". Write handler code using the connector SDK shown below. Do NOT access credentials directly from environment variables.
22303
+ The business logic type for this connector is "typescript". Use the connector SDK in your handler. Do NOT read credentials from environment variables.
22223
22304
 
22224
- #### Example
22305
+ SDK methods (client created via \`connection(connectionId)\`):
22306
+ - \`client.runReport(request)\` \u2014 run a GA4 report
22307
+ - \`client.runRealtimeReport(request)\` \u2014 run a realtime report
22308
+ - \`client.getMetadata()\` \u2014 fetch available dimensions/metrics
22309
+ - \`client.request(path, init?)\` \u2014 low-level authenticated fetch
22225
22310
 
22226
22311
  \`\`\`ts
22312
+ import type { Context } from "hono";
22227
22313
  import { connection } from "@squadbase/vite-server/connectors/google-analytics";
22228
22314
 
22229
22315
  const ga = connection("<connectionId>");
22230
22316
 
22231
- // Authenticated fetch (returns standard Response)
22232
- const res = await ga.request("properties/{propertyId}:runReport", {
22233
- method: "POST",
22234
- body: JSON.stringify({ dateRanges: [{ startDate: "7daysAgo", endDate: "today" }], metrics: [{ name: "activeUsers" }] }),
22235
- });
22236
- const data = await res.json();
22317
+ export default async function handler(c: Context) {
22318
+ const { startDate = "7daysAgo", endDate = "today" } = await c.req.json<{
22319
+ startDate?: string;
22320
+ endDate?: string;
22321
+ }>();
22322
+
22323
+ const { rows } = await ga.runReport({
22324
+ dateRanges: [{ startDate, endDate }],
22325
+ dimensions: [{ name: "date" }],
22326
+ metrics: [{ name: "activeUsers" }, { name: "sessions" }],
22327
+ limit: 100,
22328
+ });
22237
22329
 
22238
- // Convenience methods
22239
- const { rows, rowCount } = await ga.runReport({
22240
- dateRanges: [{ startDate: "7daysAgo", endDate: "today" }],
22241
- dimensions: [{ name: "date" }],
22242
- metrics: [{ name: "activeUsers" }, { name: "sessions" }],
22243
- limit: 100,
22244
- });
22245
- const metadata = await ga.getMetadata();
22246
- const realtime = await ga.runRealtimeReport({
22247
- metrics: [{ name: "activeUsers" }],
22248
- dimensions: [{ name: "country" }],
22249
- });
22250
- \`\`\``,
22251
- ja: `### Google Analytics Data API
22252
- - \u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066GA4 Data API\u3092\u547C\u3073\u51FA\u3057\u307E\u3059
22253
- - \u30D1\u30B9\u5185\u306E {propertyId} \u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059
22330
+ return c.json(
22331
+ rows.map((row) => ({
22332
+ date: row.dimensionValues[0].value,
22333
+ activeUsers: Number(row.metricValues[0].value),
22334
+ sessions: Number(row.metricValues[1].value),
22335
+ })),
22336
+ );
22337
+ }
22338
+ \`\`\`
22254
22339
 
22255
- ### \u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\uFF08\u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3\u3068\u30E1\u30C8\u30EA\u30AF\u30B9\u306E\u78BA\u8A8D\uFF09
22256
- - GET properties/{propertyId}/metadata
22340
+ ### GA4 Data API Reference
22257
22341
 
22258
- ### \u30EC\u30DD\u30FC\u30C8\u306E\u53D6\u5F97
22259
- - POST properties/{propertyId}:runReport
22260
- - Body\u4F8B:
22342
+ Common operations:
22343
+
22344
+ - **Get metadata** (list available dimensions/metrics for a property): \`GET properties/{propertyId}/metadata\`
22345
+ - **Run report** (query analytics data): \`POST properties/{propertyId}:runReport\` with a body like:
22346
+ \`\`\`json
22261
22347
  {
22262
- "dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
22263
- "dimensions": [{"name": "date"}],
22264
- "metrics": [{"name": "activeUsers"}],
22348
+ "dateRanges": [{ "startDate": "7daysAgo", "endDate": "today" }],
22349
+ "dimensions": [{ "name": "date" }],
22350
+ "metrics": [{ "name": "activeUsers" }],
22265
22351
  "limit": 100
22266
22352
  }
22353
+ \`\`\`
22354
+ - **Run realtime report**: \`POST properties/{propertyId}:runRealtimeReport\`
22267
22355
 
22268
- ### \u4E3B\u8981\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3
22269
- date, country, city, deviceCategory, browser, pagePath, pageTitle,
22270
- sessionSource, sessionMedium, eventName
22356
+ #### Common dimensions
22357
+ date, country, city, deviceCategory, browser, pagePath, pageTitle, sessionSource, sessionMedium, eventName
22271
22358
 
22272
- ### \u4E3B\u8981\u306A\u30E1\u30C8\u30EA\u30AF\u30B9
22273
- activeUsers, sessions, screenPageViews, bounceRate,
22274
- averageSessionDuration, conversions, totalRevenue
22359
+ #### Common metrics
22360
+ activeUsers, sessions, screenPageViews, bounceRate, averageSessionDuration, conversions, totalRevenue
22275
22361
 
22276
- ### \u65E5\u4ED8\u306E\u6307\u5B9A
22277
- - \u7D76\u5BFE\u5024: "2024-01-01"
22278
- - \u76F8\u5BFE\u5024: "today", "yesterday", "7daysAgo", "30daysAgo"
22362
+ #### Date specification
22363
+ - Absolute: \`"2024-01-01"\`
22364
+ - Relative: \`"today"\`, \`"yesterday"\`, \`"7daysAgo"\`, \`"30daysAgo"\``,
22365
+ ja: `### \u30C4\u30FC\u30EB
22366
+
22367
+ - \`google-analytics_request\`: GA4 Data API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u3001\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u3001\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3068\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3\u306F\u4E0B\u90E8\u306E\u300CGA4 Data API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
22279
22368
 
22280
22369
  ### Business Logic
22281
22370
 
22282
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u4EE5\u4E0B\u306B\u793A\u3059\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u30B3\u30FC\u30C9\u3092\u8A18\u8FF0\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u76F4\u63A5\u8A8D\u8A3C\u60C5\u5831\u306B\u30A2\u30AF\u30BB\u30B9\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
22371
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
22283
22372
 
22284
- #### Example
22373
+ SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
22374
+ - \`client.runReport(request)\` \u2014 GA4\u30EC\u30DD\u30FC\u30C8\u3092\u5B9F\u884C
22375
+ - \`client.runRealtimeReport(request)\` \u2014 \u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u3092\u5B9F\u884C
22376
+ - \`client.getMetadata()\` \u2014 \u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3/\u30E1\u30C8\u30EA\u30AF\u30B9\u3092\u53D6\u5F97
22377
+ - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
22285
22378
 
22286
22379
  \`\`\`ts
22380
+ import type { Context } from "hono";
22287
22381
  import { connection } from "@squadbase/vite-server/connectors/google-analytics";
22288
22382
 
22289
22383
  const ga = connection("<connectionId>");
22290
22384
 
22291
- // Authenticated fetch (returns standard Response)
22292
- const res = await ga.request("properties/{propertyId}:runReport", {
22293
- method: "POST",
22294
- body: JSON.stringify({ dateRanges: [{ startDate: "7daysAgo", endDate: "today" }], metrics: [{ name: "activeUsers" }] }),
22295
- });
22296
- const data = await res.json();
22385
+ export default async function handler(c: Context) {
22386
+ const { startDate = "7daysAgo", endDate = "today" } = await c.req.json<{
22387
+ startDate?: string;
22388
+ endDate?: string;
22389
+ }>();
22390
+
22391
+ const { rows } = await ga.runReport({
22392
+ dateRanges: [{ startDate, endDate }],
22393
+ dimensions: [{ name: "date" }],
22394
+ metrics: [{ name: "activeUsers" }, { name: "sessions" }],
22395
+ limit: 100,
22396
+ });
22297
22397
 
22298
- // Convenience methods
22299
- const { rows, rowCount } = await ga.runReport({
22300
- dateRanges: [{ startDate: "7daysAgo", endDate: "today" }],
22301
- dimensions: [{ name: "date" }],
22302
- metrics: [{ name: "activeUsers" }, { name: "sessions" }],
22303
- limit: 100,
22304
- });
22305
- const metadata = await ga.getMetadata();
22306
- const realtime = await ga.runRealtimeReport({
22307
- metrics: [{ name: "activeUsers" }],
22308
- dimensions: [{ name: "country" }],
22309
- });
22310
- \`\`\``
22398
+ return c.json(
22399
+ rows.map((row) => ({
22400
+ date: row.dimensionValues[0].value,
22401
+ activeUsers: Number(row.metricValues[0].value),
22402
+ sessions: Number(row.metricValues[1].value),
22403
+ })),
22404
+ );
22405
+ }
22406
+ \`\`\`
22407
+
22408
+ ### GA4 Data API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
22409
+
22410
+ \u4E3B\u306A\u64CD\u4F5C:
22411
+
22412
+ - **\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97** (\u30D7\u30ED\u30D1\u30C6\u30A3\u3067\u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3/\u30E1\u30C8\u30EA\u30AF\u30B9\u306E\u4E00\u89A7): \`GET properties/{propertyId}/metadata\`
22413
+ - **\u30EC\u30DD\u30FC\u30C8\u306E\u53D6\u5F97** (\u5206\u6790\u30C7\u30FC\u30BF\u306E\u30AF\u30A8\u30EA): \`POST properties/{propertyId}:runReport\`\u3001\u30DC\u30C7\u30A3\u4F8B:
22414
+ \`\`\`json
22415
+ {
22416
+ "dateRanges": [{ "startDate": "7daysAgo", "endDate": "today" }],
22417
+ "dimensions": [{ "name": "date" }],
22418
+ "metrics": [{ "name": "activeUsers" }],
22419
+ "limit": 100
22420
+ }
22421
+ \`\`\`
22422
+ - **\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8**: \`POST properties/{propertyId}:runRealtimeReport\`
22423
+
22424
+ #### \u4E3B\u8981\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3
22425
+ date, country, city, deviceCategory, browser, pagePath, pageTitle, sessionSource, sessionMedium, eventName
22426
+
22427
+ #### \u4E3B\u8981\u306A\u30E1\u30C8\u30EA\u30AF\u30B9
22428
+ activeUsers, sessions, screenPageViews, bounceRate, averageSessionDuration, conversions, totalRevenue
22429
+
22430
+ #### \u65E5\u4ED8\u306E\u6307\u5B9A
22431
+ - \u7D76\u5BFE\u5024: \`"2024-01-01"\`
22432
+ - \u76F8\u5BFE\u5024: \`"today"\`, \`"yesterday"\`, \`"7daysAgo"\`, \`"30daysAgo"\``
22311
22433
  },
22312
22434
  tools: tools12
22313
22435
  });
@@ -22749,11 +22871,15 @@ var googleAnalyticsOauthConnector = new ConnectorPlugin({
22749
22871
  ]
22750
22872
  },
22751
22873
  systemPrompt: {
22752
- en: `### Google Analytics Data API (OAuth, Read-Only)
22753
- - Call the GA4 Data API using the authenticated request tool
22754
- - {propertyId} in the path is automatically replaced
22874
+ en: `### Tools
22755
22875
 
22756
- ### Get Metadata (Check available dimensions and metrics)
22876
+ - \`google-analytics-oauth_request\`: Send authenticated requests to the GA4 Data API. Use it for running reports, getting metadata, and realtime reports. The {propertyId} placeholder in paths is automatically replaced. Authentication is configured automatically via OAuth.
22877
+ - \`google-analytics-oauth_listAccounts\`: List accessible Google Analytics accounts. Use during setup to discover available accounts.
22878
+ - \`google-analytics-oauth_listProperties\`: List GA4 properties for a given account. Use during setup to select the target property.
22879
+
22880
+ ### GA4 Data API Reference
22881
+
22882
+ #### Get Metadata (Check available dimensions and metrics)
22757
22883
  - GET properties/{propertyId}/metadata
22758
22884
 
22759
22885
  ### Get Report
@@ -22809,11 +22935,15 @@ const realtime = await ga.runRealtimeReport({
22809
22935
  dimensions: [{ name: "country" }],
22810
22936
  });
22811
22937
  \`\`\``,
22812
- ja: `### Google Analytics Data API (OAuth\u3001\u8AAD\u307F\u53D6\u308A\u5C02\u7528)
22813
- - \u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066GA4 Data API\u3092\u547C\u3073\u51FA\u3057\u307E\u3059
22814
- - \u30D1\u30B9\u5185\u306E {propertyId} \u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059
22938
+ ja: `### \u30C4\u30FC\u30EB
22939
+
22940
+ - \`google-analytics-oauth_request\`: GA4 Data API\u3078\u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u9001\u4FE1\u3057\u307E\u3059\u3002\u30EC\u30DD\u30FC\u30C8\u306E\u5B9F\u884C\u3001\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u3001\u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u30EC\u30DD\u30FC\u30C8\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{propertyId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002
22941
+ - \`google-analytics-oauth_listAccounts\`: \u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306AGoogle Analytics\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
22942
+ - \`google-analytics-oauth_listProperties\`: \u6307\u5B9A\u30A2\u30AB\u30A6\u30F3\u30C8\u306EGA4\u30D7\u30ED\u30D1\u30C6\u30A3\u4E00\u89A7\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u6642\u306B\u30BF\u30FC\u30B2\u30C3\u30C8\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u9078\u629E\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002
22943
+
22944
+ ### GA4 Data API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
22815
22945
 
22816
- ### \u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\uFF08\u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3\u3068\u30E1\u30C8\u30EA\u30AF\u30B9\u306E\u78BA\u8A8D\uFF09
22946
+ #### \u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\uFF08\u5229\u7528\u53EF\u80FD\u306A\u30C7\u30A3\u30E1\u30F3\u30B7\u30E7\u30F3\u3068\u30E1\u30C8\u30EA\u30AF\u30B9\u306E\u78BA\u8A8D\uFF09
22817
22947
  - GET properties/{propertyId}/metadata
22818
22948
 
22819
22949
  ### \u30EC\u30DD\u30FC\u30C8\u306E\u53D6\u5F97
@@ -23099,9 +23229,13 @@ var googleSheetsOauthConnector = new ConnectorPlugin({
23099
23229
  ]
23100
23230
  },
23101
23231
  systemPrompt: {
23102
- en: `### Google Sheets API (OAuth, Read-Only)
23232
+ en: `### Tools
23103
23233
 
23104
- ### Available Endpoints
23234
+ - \`google-sheets-oauth_request\`: The only way to call the Google Sheets API (read-only). Use it to get spreadsheet metadata, cell values, and batch values. Authentication is configured automatically via OAuth. The {spreadsheetId} placeholder in paths is automatically replaced with the configured default spreadsheet ID.
23235
+
23236
+ ### Google Sheets API Reference
23237
+
23238
+ #### Available Endpoints
23105
23239
  - GET \`/{spreadsheetId}\` \u2014 Get spreadsheet metadata (title, sheets, properties)
23106
23240
  - GET \`/{spreadsheetId}/values/{range}\` \u2014 Get cell values for a range
23107
23241
  - GET \`/{spreadsheetId}/values:batchGet?ranges={range1}&ranges={range2}\` \u2014 Get values for multiple ranges
@@ -23143,9 +23277,13 @@ console.log(values.values); // 2D array
23143
23277
  const batch = await sheets.batchGetValues(["Sheet1!A1:B5", "Sheet2!A1:C3"]);
23144
23278
  batch.valueRanges.forEach(vr => console.log(vr.range, vr.values));
23145
23279
  \`\`\``,
23146
- ja: `### Google Sheets API (OAuth\u3001\u8AAD\u307F\u53D6\u308A\u5C02\u7528)
23280
+ ja: `### \u30C4\u30FC\u30EB
23281
+
23282
+ - \`google-sheets-oauth_request\`: Google Sheets API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\uFF08\u8AAD\u307F\u53D6\u308A\u5C02\u7528\uFF09\u3002\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u3001\u30BB\u30EB\u5024\u3001\u30D0\u30C3\u30C1\u5024\u306E\u53D6\u5F97\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{spreadsheetId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u8A2D\u5B9A\u6E08\u307F\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8ID\u3067\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002
23283
+
23284
+ ### Google Sheets API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
23147
23285
 
23148
- ### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
23286
+ #### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
23149
23287
  - GET \`/{spreadsheetId}\` \u2014 \u30B9\u30D7\u30EC\u30C3\u30C9\u30B7\u30FC\u30C8\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\uFF08\u30BF\u30A4\u30C8\u30EB\u3001\u30B7\u30FC\u30C8\u3001\u30D7\u30ED\u30D1\u30C6\u30A3\uFF09
23150
23288
  - GET \`/{spreadsheetId}/values/{range}\` \u2014 \u7BC4\u56F2\u306E\u30BB\u30EB\u5024\u3092\u53D6\u5F97
23151
23289
  - GET \`/{spreadsheetId}/values:batchGet?ranges={range1}&ranges={range2}\` \u2014 \u8907\u6570\u7BC4\u56F2\u306E\u5024\u3092\u53D6\u5F97
@@ -23394,9 +23532,13 @@ var hubspotOauthConnector = new ConnectorPlugin({
23394
23532
  ]
23395
23533
  },
23396
23534
  systemPrompt: {
23397
- en: `### HubSpot API (OAuth)
23535
+ en: `### Tools
23398
23536
 
23399
- ### Available Endpoints
23537
+ - \`hubspot-oauth_request\`: The only way to call the HubSpot API. Use it to query contacts, deals, companies, and other CRM objects. Authentication is configured automatically via OAuth. HubSpot uses cursor-based pagination with the \`after\` parameter from \`paging.next.after\` in the response.
23538
+
23539
+ ### HubSpot API Reference
23540
+
23541
+ #### Available Endpoints
23400
23542
  - GET \`/crm/v3/objects/contacts\` \u2014 List contacts
23401
23543
  - GET \`/crm/v3/objects/contacts/{contactId}\` \u2014 Get a contact
23402
23544
  - GET \`/crm/v3/objects/deals\` \u2014 List deals
@@ -23435,9 +23577,13 @@ const hubspot = connection("<connectionId>");
23435
23577
  const res = await hubspot.request("/crm/v3/objects/contacts?limit=10");
23436
23578
  const data = await res.json();
23437
23579
  \`\`\``,
23438
- ja: `### HubSpot API (OAuth)
23580
+ ja: `### \u30C4\u30FC\u30EB
23581
+
23582
+ - \`hubspot-oauth_request\`: HubSpot API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30B3\u30F3\u30BF\u30AF\u30C8\u3001\u53D6\u5F15\u3001\u4F1A\u793E\u3001\u305D\u306E\u4ED6\u306ECRM\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002HubSpot\u306F\u30EC\u30B9\u30DD\u30F3\u30B9\u306E \`paging.next.after\` \u304B\u3089\u306E \`after\` \u30D1\u30E9\u30E1\u30FC\u30BF\u306B\u3088\u308B\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002
23583
+
23584
+ ### HubSpot API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
23439
23585
 
23440
- ### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
23586
+ #### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
23441
23587
  - GET \`/crm/v3/objects/contacts\` \u2014 \u30B3\u30F3\u30BF\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
23442
23588
  - GET \`/crm/v3/objects/contacts/{contactId}\` \u2014 \u30B3\u30F3\u30BF\u30AF\u30C8\u3092\u53D6\u5F97
23443
23589
  - GET \`/crm/v3/objects/deals\` \u2014 \u53D6\u5F15\u4E00\u89A7\u3092\u53D6\u5F97
@@ -23681,9 +23827,13 @@ var stripeOauthConnector = new ConnectorPlugin({
23681
23827
  ]
23682
23828
  },
23683
23829
  systemPrompt: {
23684
- en: `### Stripe API (OAuth)
23830
+ en: `### Tools
23685
23831
 
23686
- ### Available Endpoints
23832
+ - \`stripe-oauth_request\`: The only way to call the Stripe API. Use it to query charges, customers, invoices, subscriptions, products, prices, payment intents, balances, and more. Authentication is configured automatically via OAuth. Stripe uses cursor-based pagination with \`starting_after\` and \`has_more\`.
23833
+
23834
+ ### Stripe API Reference
23835
+
23836
+ #### Available Endpoints
23687
23837
  - GET \`/v1/charges\` \u2014 List charges
23688
23838
  - GET \`/v1/charges/{chargeId}\` \u2014 Get a charge
23689
23839
  - GET \`/v1/customers\` \u2014 List customers
@@ -23726,9 +23876,13 @@ const stripe = connection("<connectionId>");
23726
23876
  const res = await stripe.request("/v1/customers?limit=10");
23727
23877
  const data = await res.json();
23728
23878
  \`\`\``,
23729
- ja: `### Stripe API (OAuth)
23879
+ ja: `### \u30C4\u30FC\u30EB
23880
+
23881
+ - \`stripe-oauth_request\`: Stripe API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u8ACB\u6C42\u3001\u9867\u5BA2\u3001\u8ACB\u6C42\u66F8\u3001\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u3001\u5546\u54C1\u3001\u4FA1\u683C\u3001\u652F\u6255\u3044\u30A4\u30F3\u30C6\u30F3\u30C8\u3001\u6B8B\u9AD8\u306A\u3069\u306E\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Stripe\u306F \`starting_after\` \u3068 \`has_more\` \u306B\u3088\u308B\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002
23882
+
23883
+ ### Stripe API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
23730
23884
 
23731
- ### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
23885
+ #### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
23732
23886
  - GET \`/v1/charges\` \u2014 \u8ACB\u6C42\u4E00\u89A7\u3092\u53D6\u5F97
23733
23887
  - GET \`/v1/charges/{chargeId}\` \u2014 \u8ACB\u6C42\u3092\u53D6\u5F97
23734
23888
  - GET \`/v1/customers\` \u2014 \u9867\u5BA2\u4E00\u89A7\u3092\u53D6\u5F97
@@ -24000,9 +24154,13 @@ var airtableOauthConnector = new ConnectorPlugin({
24000
24154
  ]
24001
24155
  },
24002
24156
  systemPrompt: {
24003
- en: `### Airtable API (OAuth)
24157
+ en: `### Tools
24004
24158
 
24005
- ### Available Endpoints
24159
+ - \`airtable-oauth_request\`: The only way to call the Airtable REST API. Use it to list tables, query/create/update/delete records. Authentication is configured automatically via OAuth. The {baseId} placeholder in paths is automatically replaced with the configured default base ID.
24160
+
24161
+ ### Airtable API Reference
24162
+
24163
+ #### Available Endpoints
24006
24164
  - GET \`/meta/bases/{baseId}/tables\` \u2014 List tables in a base
24007
24165
  - GET \`/{baseId}/{tableIdOrName}\` \u2014 List records in a table
24008
24166
  - GET \`/{baseId}/{tableIdOrName}/{recordId}\` \u2014 Get a single record
@@ -24044,9 +24202,13 @@ const data = await res.json();
24044
24202
  const records = await airtable.request("/{baseId}/Tasks?maxRecords=100");
24045
24203
  const recordsData = await records.json();
24046
24204
  \`\`\``,
24047
- ja: `### Airtable API (OAuth)
24205
+ ja: `### \u30C4\u30FC\u30EB
24206
+
24207
+ - \`airtable-oauth_request\`: Airtable REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30C6\u30FC\u30D6\u30EB\u4E00\u89A7\u306E\u53D6\u5F97\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u691C\u7D22\u30FB\u4F5C\u6210\u30FB\u66F4\u65B0\u30FB\u524A\u9664\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u30D1\u30B9\u5185\u306E{baseId}\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306F\u8A2D\u5B9A\u6E08\u307F\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u30D9\u30FC\u30B9ID\u3067\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002
24208
+
24209
+ ### Airtable API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
24048
24210
 
24049
- ### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
24211
+ #### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
24050
24212
  - GET \`/meta/bases/{baseId}/tables\` \u2014 \u30D9\u30FC\u30B9\u5185\u306E\u30C6\u30FC\u30D6\u30EB\u4E00\u89A7\u3092\u53D6\u5F97
24051
24213
  - GET \`/{baseId}/{tableIdOrName}\` \u2014 \u30C6\u30FC\u30D6\u30EB\u5185\u306E\u30EC\u30B3\u30FC\u30C9\u4E00\u89A7\u3092\u53D6\u5F97
24052
24214
  - GET \`/{baseId}/{tableIdOrName}/{recordId}\` \u2014 \u5358\u4E00\u30EC\u30B3\u30FC\u30C9\u3092\u53D6\u5F97
@@ -24245,114 +24407,140 @@ var kintoneConnector = new ConnectorPlugin({
24245
24407
  releaseFlag: { dev1: true, dev2: true, prod: true },
24246
24408
  onboarding: kintoneOnboarding,
24247
24409
  systemPrompt: {
24248
- en: `### kintone REST API
24249
- - Call the kintone REST API using the authenticated request tool
24250
- - The base URL (e.g., https://example.cybozu.com) is automatically resolved
24251
-
24252
- ### List Apps
24253
- - GET apps.json
24254
-
24255
- ### Get Field Definitions
24256
- - GET app/form/fields.json?app={appId}
24257
-
24258
- ### Get Records
24259
- - GET records.json?app={appId}&query={query}
24260
- - Query example: records.json?app=1&query=updatedTime > "2024-01-01" order by recordNumber asc limit 100
24261
-
24262
- ### Add Record
24263
- - POST record.json
24264
- - Body: { "app": 1, "record": { "fieldName": { "value": "value" } } }
24410
+ en: `### Tools
24265
24411
 
24266
- ### kintone Query Syntax
24267
- - Comparison: fieldName = "value", fieldName > 100
24268
- - Operators: and, or, not
24269
- - Sort: order by fieldName asc/desc
24270
- - Limit: limit 100 offset 0
24271
- - String: like "partial match"
24412
+ - \`kintone_request\`: The only way to call the kintone REST API. Use it to list apps, fetch field definitions, and read/write records. The base URL (e.g., \`https://example.cybozu.com\`) is automatically resolved. See the kintone REST API Reference below for endpoints and the kintone query syntax.
24272
24413
 
24273
24414
  ### Business Logic
24274
24415
 
24275
- The business logic type for this connector is "typescript". Write handler code using the connector SDK shown below. Do NOT access credentials directly from environment variables.
24416
+ The business logic type for this connector is "typescript". Use the connector SDK in your handler. Do NOT read credentials from environment variables.
24276
24417
 
24277
- #### Example
24418
+ SDK methods (client created via \`connection(connectionId)\`):
24419
+ - \`client.request(path, init?)\` \u2014 low-level authenticated fetch
24420
+ - \`client.getRecords(appId, options?)\` \u2014 fetch records with query/fields/totalCount (uses @kintone/rest-api-client)
24421
+ - \`client.getRecord(appId, recordId)\` \u2014 fetch a single record
24422
+ - \`client.listApps(options?)\` \u2014 list available apps
24278
24423
 
24279
24424
  \`\`\`ts
24425
+ import type { Context } from "hono";
24280
24426
  import { connection } from "@squadbase/vite-server/connectors/kintone";
24281
24427
 
24282
24428
  const kintone = connection("<connectionId>");
24283
24429
 
24284
- // Authenticated fetch (returns standard Response)
24285
- const res = await kintone.request("/k/v1/records.json?app=1&query=limit 10");
24286
- const data = await res.json();
24430
+ export default async function handler(c: Context) {
24431
+ const { appId, status = "Active" } = await c.req.json<{
24432
+ appId: number;
24433
+ status?: string;
24434
+ }>();
24287
24435
 
24288
- await kintone.request("/k/v1/record.json", {
24289
- method: "POST",
24290
- body: JSON.stringify({ app: 1, record: { title: { value: "Hello" } } }),
24291
- });
24436
+ const { records, totalCount } = await kintone.getRecords(appId, {
24437
+ query: \`status = "\${status}" order by updatedTime desc limit 100\`,
24438
+ fields: ["$id", "name", "email", "status", "updatedTime"],
24439
+ totalCount: true,
24440
+ });
24292
24441
 
24293
- // Convenience methods (uses @kintone/rest-api-client)
24294
- const { records, totalCount } = await kintone.getRecords(1, {
24295
- query: 'status = "Active"',
24296
- fields: ["name", "email"],
24297
- totalCount: true,
24298
- });
24299
- const { record } = await kintone.getRecord(1, 100);
24300
- const { apps } = await kintone.listApps();
24301
- \`\`\``,
24302
- ja: `### kintone REST API
24303
- - \u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066kintone REST API\u3092\u547C\u3073\u51FA\u3057\u307E\u3059
24304
- - \u30D9\u30FC\u30B9URL\uFF08\u4F8B: https://example.cybozu.com\uFF09\u306F\u81EA\u52D5\u7684\u306B\u89E3\u6C7A\u3055\u308C\u307E\u3059
24442
+ return c.json({
24443
+ totalCount,
24444
+ rows: records.map((r) => ({
24445
+ id: r.$id.value,
24446
+ name: r.name?.value,
24447
+ email: r.email?.value,
24448
+ status: r.status?.value,
24449
+ updatedTime: r.updatedTime?.value,
24450
+ })),
24451
+ });
24452
+ }
24453
+ \`\`\`
24305
24454
 
24306
- ### \u30A2\u30D7\u30EA\u4E00\u89A7\u306E\u53D6\u5F97
24307
- - GET apps.json
24455
+ ### kintone REST API Reference
24308
24456
 
24309
- ### \u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u306E\u53D6\u5F97
24310
- - GET app/form/fields.json?app={appId}
24457
+ #### List Apps
24458
+ - \`GET apps.json\`
24311
24459
 
24312
- ### \u30EC\u30B3\u30FC\u30C9\u306E\u53D6\u5F97
24313
- - GET records.json?app={appId}&query={query}
24314
- - \u30AF\u30A8\u30EA\u4F8B: records.json?app=1&query=updatedTime > "2024-01-01" order by recordNumber asc limit 100
24460
+ #### Get Field Definitions
24461
+ - \`GET app/form/fields.json?app={appId}\`
24315
24462
 
24316
- ### \u30EC\u30B3\u30FC\u30C9\u306E\u8FFD\u52A0
24317
- - POST record.json
24318
- - Body: { "app": 1, "record": { "fieldName": { "value": "value" } } }
24463
+ #### Get Records
24464
+ - \`GET records.json?app={appId}&query={query}\`
24465
+ - Query example: \`records.json?app=1&query=updatedTime > "2024-01-01" order by recordNumber asc limit 100\`
24319
24466
 
24320
- ### kintone \u30AF\u30A8\u30EA\u69CB\u6587
24321
- - \u6BD4\u8F03: fieldName = "value", fieldName > 100
24322
- - \u6F14\u7B97\u5B50: and, or, not
24323
- - \u30BD\u30FC\u30C8: order by fieldName asc/desc
24324
- - \u5236\u9650: limit 100 offset 0
24325
- - \u6587\u5B57\u5217: like "\u90E8\u5206\u4E00\u81F4"
24467
+ #### Add Record
24468
+ - \`POST record.json\`
24469
+ - Body: \`{ "app": 1, "record": { "fieldName": { "value": "value" } } }\`
24470
+
24471
+ #### kintone Query Syntax
24472
+ - Comparison: \`fieldName = "value"\`, \`fieldName > 100\`
24473
+ - Operators: \`and\`, \`or\`, \`not\`
24474
+ - Sort: \`order by fieldName asc/desc\`
24475
+ - Limit: \`limit 100 offset 0\`
24476
+ - String: \`like "partial match"\``,
24477
+ ja: `### \u30C4\u30FC\u30EB
24478
+
24479
+ - \`kintone_request\`: kintone REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30A2\u30D7\u30EA\u4E00\u89A7\u306E\u53D6\u5F97\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u306E\u53D6\u5F97\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u8AAD\u307F\u66F8\u304D\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u30D9\u30FC\u30B9URL\uFF08\u4F8B: \`https://example.cybozu.com\`\uFF09\u306F\u81EA\u52D5\u7684\u306B\u89E3\u6C7A\u3055\u308C\u307E\u3059\u3002\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u304A\u3088\u3073kintone\u30AF\u30A8\u30EA\u69CB\u6587\u306F\u4E0B\u90E8\u306E\u300Ckintone REST API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
24326
24480
 
24327
24481
  ### Business Logic
24328
24482
 
24329
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u4EE5\u4E0B\u306B\u793A\u3059\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u30B3\u30FC\u30C9\u3092\u8A18\u8FF0\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u76F4\u63A5\u8A8D\u8A3C\u60C5\u5831\u306B\u30A2\u30AF\u30BB\u30B9\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
24483
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
24330
24484
 
24331
- #### Example
24485
+ SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
24486
+ - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
24487
+ - \`client.getRecords(appId, options?)\` \u2014 query/fields/totalCount\u4ED8\u304D\u3067\u30EC\u30B3\u30FC\u30C9\u53D6\u5F97 (@kintone/rest-api-client \u4F7F\u7528)
24488
+ - \`client.getRecord(appId, recordId)\` \u2014 \u5358\u4E00\u30EC\u30B3\u30FC\u30C9\u3092\u53D6\u5F97
24489
+ - \`client.listApps(options?)\` \u2014 \u5229\u7528\u53EF\u80FD\u306A\u30A2\u30D7\u30EA\u4E00\u89A7\u3092\u53D6\u5F97
24332
24490
 
24333
24491
  \`\`\`ts
24492
+ import type { Context } from "hono";
24334
24493
  import { connection } from "@squadbase/vite-server/connectors/kintone";
24335
24494
 
24336
24495
  const kintone = connection("<connectionId>");
24337
24496
 
24338
- // Authenticated fetch (returns standard Response)
24339
- const res = await kintone.request("/k/v1/records.json?app=1&query=limit 10");
24340
- const data = await res.json();
24497
+ export default async function handler(c: Context) {
24498
+ const { appId, status = "Active" } = await c.req.json<{
24499
+ appId: number;
24500
+ status?: string;
24501
+ }>();
24341
24502
 
24342
- await kintone.request("/k/v1/record.json", {
24343
- method: "POST",
24344
- body: JSON.stringify({ app: 1, record: { title: { value: "Hello" } } }),
24345
- });
24503
+ const { records, totalCount } = await kintone.getRecords(appId, {
24504
+ query: \`status = "\${status}" order by updatedTime desc limit 100\`,
24505
+ fields: ["$id", "name", "email", "status", "updatedTime"],
24506
+ totalCount: true,
24507
+ });
24346
24508
 
24347
- // Convenience methods (uses @kintone/rest-api-client)
24348
- const { records, totalCount } = await kintone.getRecords(1, {
24349
- query: 'status = "Active"',
24350
- fields: ["name", "email"],
24351
- totalCount: true,
24352
- });
24353
- const { record } = await kintone.getRecord(1, 100);
24354
- const { apps } = await kintone.listApps();
24355
- \`\`\``
24509
+ return c.json({
24510
+ totalCount,
24511
+ rows: records.map((r) => ({
24512
+ id: r.$id.value,
24513
+ name: r.name?.value,
24514
+ email: r.email?.value,
24515
+ status: r.status?.value,
24516
+ updatedTime: r.updatedTime?.value,
24517
+ })),
24518
+ });
24519
+ }
24520
+ \`\`\`
24521
+
24522
+ ### kintone REST API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
24523
+
24524
+ #### \u30A2\u30D7\u30EA\u4E00\u89A7\u306E\u53D6\u5F97
24525
+ - \`GET apps.json\`
24526
+
24527
+ #### \u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u306E\u53D6\u5F97
24528
+ - \`GET app/form/fields.json?app={appId}\`
24529
+
24530
+ #### \u30EC\u30B3\u30FC\u30C9\u306E\u53D6\u5F97
24531
+ - \`GET records.json?app={appId}&query={query}\`
24532
+ - \u30AF\u30A8\u30EA\u4F8B: \`records.json?app=1&query=updatedTime > "2024-01-01" order by recordNumber asc limit 100\`
24533
+
24534
+ #### \u30EC\u30B3\u30FC\u30C9\u306E\u8FFD\u52A0
24535
+ - \`POST record.json\`
24536
+ - Body: \`{ "app": 1, "record": { "fieldName": { "value": "value" } } }\`
24537
+
24538
+ #### kintone \u30AF\u30A8\u30EA\u69CB\u6587
24539
+ - \u6BD4\u8F03: \`fieldName = "value"\`, \`fieldName > 100\`
24540
+ - \u6F14\u7B97\u5B50: \`and\`, \`or\`, \`not\`
24541
+ - \u30BD\u30FC\u30C8: \`order by fieldName asc/desc\`
24542
+ - \u5236\u9650: \`limit 100 offset 0\`
24543
+ - \u6587\u5B57\u5217: \`like "\u90E8\u5206\u4E00\u81F4"\``
24356
24544
  },
24357
24545
  tools: tools18
24358
24546
  });
@@ -24473,12 +24661,13 @@ var kintoneApiTokenConnector = new ConnectorPlugin({
24473
24661
  releaseFlag: { dev1: true, dev2: false, prod: false },
24474
24662
  onboarding: kintoneApiTokenOnboarding,
24475
24663
  systemPrompt: {
24476
- en: `### kintone REST API (API Token)
24477
- - Call the kintone REST API using the authenticated request tool
24478
- - The base URL (e.g., https://example.cybozu.com) is automatically resolved
24479
- - Authentication uses the kintone API token (scoped to specific apps)
24664
+ en: `### Tools
24480
24665
 
24481
- ### List Apps
24666
+ - \`kintone-api-key_request\`: The only way to call the kintone REST API. Use it to list apps, get field definitions, query records, and create/update records. Authentication (API Token) and base URL are configured automatically. API tokens are scoped per app \u2014 combine multiple tokens with commas to access multiple apps.
24667
+
24668
+ ### kintone REST API Reference
24669
+
24670
+ #### List Apps
24482
24671
  - GET apps.json
24483
24672
 
24484
24673
  ### Get Field Definitions
@@ -24488,20 +24677,17 @@ var kintoneApiTokenConnector = new ConnectorPlugin({
24488
24677
  - GET records.json?app={appId}&query={query}
24489
24678
  - Query example: records.json?app=1&query=updatedTime > "2024-01-01" order by recordNumber asc limit 100
24490
24679
 
24491
- ### Add Record
24680
+ #### Add Record
24492
24681
  - POST record.json
24493
24682
  - Body: { "app": 1, "record": { "fieldName": { "value": "value" } } }
24494
24683
 
24495
- ### kintone Query Syntax
24684
+ #### kintone Query Syntax
24496
24685
  - Comparison: fieldName = "value", fieldName > 100
24497
24686
  - Operators: and, or, not
24498
24687
  - Sort: order by fieldName asc/desc
24499
24688
  - Limit: limit 100 offset 0
24500
24689
  - String: like "partial match"
24501
24690
 
24502
- ### Tips
24503
- - API tokens are scoped per app. If you need to access multiple apps, you can combine multiple tokens separated by commas.
24504
-
24505
24691
  ### Business Logic
24506
24692
 
24507
24693
  The business logic type for this connector is "typescript". Write handler code using the connector SDK shown below. Do NOT access credentials directly from environment variables.
@@ -24522,12 +24708,13 @@ await kintone.request("/k/v1/record.json", {
24522
24708
  body: JSON.stringify({ app: 1, record: { title: { value: "Hello" } } }),
24523
24709
  });
24524
24710
  \`\`\``,
24525
- ja: `### kintone REST API (API Token)
24526
- - \u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066kintone REST API\u3092\u547C\u3073\u51FA\u3057\u307E\u3059
24527
- - \u30D9\u30FC\u30B9URL\uFF08\u4F8B: https://example.cybozu.com\uFF09\u306F\u81EA\u52D5\u7684\u306B\u89E3\u6C7A\u3055\u308C\u307E\u3059
24528
- - \u8A8D\u8A3C\u306B\u306Fkintone API\u30C8\u30FC\u30AF\u30F3\uFF08\u7279\u5B9A\u306E\u30A2\u30D7\u30EA\u306B\u30B9\u30B3\u30FC\u30D7\u3055\u308C\u305F\u3082\u306E\uFF09\u3092\u4F7F\u7528\u3057\u307E\u3059
24711
+ ja: `### \u30C4\u30FC\u30EB
24529
24712
 
24530
- ### \u30A2\u30D7\u30EA\u4E00\u89A7\u306E\u53D6\u5F97
24713
+ - \`kintone-api-key_request\`: kintone REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30A2\u30D7\u30EA\u4E00\u89A7\u306E\u53D6\u5F97\u3001\u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u306E\u53D6\u5F97\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u691C\u7D22\u3001\u30EC\u30B3\u30FC\u30C9\u306E\u4F5C\u6210\u30FB\u66F4\u65B0\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API\u30C8\u30FC\u30AF\u30F3\uFF09\u3068\u30D9\u30FC\u30B9URL\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002API\u30C8\u30FC\u30AF\u30F3\u306F\u30A2\u30D7\u30EA\u3054\u3068\u306B\u30B9\u30B3\u30FC\u30D7\u3055\u308C\u3066\u3044\u307E\u3059 \u2014 \u8907\u6570\u306E\u30A2\u30D7\u30EA\u306B\u30A2\u30AF\u30BB\u30B9\u3059\u308B\u5834\u5408\u306F\u30AB\u30F3\u30DE\u533A\u5207\u308A\u3067\u30C8\u30FC\u30AF\u30F3\u3092\u7D44\u307F\u5408\u308F\u305B\u3066\u304F\u3060\u3055\u3044\u3002
24714
+
24715
+ ### kintone REST API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
24716
+
24717
+ #### \u30A2\u30D7\u30EA\u4E00\u89A7\u306E\u53D6\u5F97
24531
24718
  - GET apps.json
24532
24719
 
24533
24720
  ### \u30D5\u30A3\u30FC\u30EB\u30C9\u5B9A\u7FA9\u306E\u53D6\u5F97
@@ -24537,20 +24724,17 @@ await kintone.request("/k/v1/record.json", {
24537
24724
  - GET records.json?app={appId}&query={query}
24538
24725
  - \u30AF\u30A8\u30EA\u4F8B: records.json?app=1&query=updatedTime > "2024-01-01" order by recordNumber asc limit 100
24539
24726
 
24540
- ### \u30EC\u30B3\u30FC\u30C9\u306E\u8FFD\u52A0
24727
+ #### \u30EC\u30B3\u30FC\u30C9\u306E\u8FFD\u52A0
24541
24728
  - POST record.json
24542
24729
  - Body: { "app": 1, "record": { "fieldName": { "value": "value" } } }
24543
24730
 
24544
- ### kintone \u30AF\u30A8\u30EA\u69CB\u6587
24731
+ #### kintone \u30AF\u30A8\u30EA\u69CB\u6587
24545
24732
  - \u6BD4\u8F03: fieldName = "value", fieldName > 100
24546
24733
  - \u6F14\u7B97\u5B50: and, or, not
24547
24734
  - \u30BD\u30FC\u30C8: order by fieldName asc/desc
24548
24735
  - \u5236\u9650: limit 100 offset 0
24549
24736
  - \u6587\u5B57\u5217: like "\u90E8\u5206\u4E00\u81F4"
24550
24737
 
24551
- ### \u30D2\u30F3\u30C8
24552
- - API\u30C8\u30FC\u30AF\u30F3\u306F\u30A2\u30D7\u30EA\u3054\u3068\u306B\u30B9\u30B3\u30FC\u30D7\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u8907\u6570\u306E\u30A2\u30D7\u30EA\u306B\u30A2\u30AF\u30BB\u30B9\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u5834\u5408\u306F\u3001\u30AB\u30F3\u30DE\u533A\u5207\u308A\u3067\u8907\u6570\u306E\u30C8\u30FC\u30AF\u30F3\u3092\u7D44\u307F\u5408\u308F\u305B\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002
24553
-
24554
24738
  ### Business Logic
24555
24739
 
24556
24740
  \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u4EE5\u4E0B\u306B\u793A\u3059\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u30B3\u30FC\u30C9\u3092\u8A18\u8FF0\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u76F4\u63A5\u8A8D\u8A3C\u60C5\u5831\u306B\u30A2\u30AF\u30BB\u30B9\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
@@ -24700,118 +24884,154 @@ var wixStoreConnector = new ConnectorPlugin({
24700
24884
  releaseFlag: { dev1: true, dev2: true, prod: true },
24701
24885
  onboarding: wixStoreOnboarding,
24702
24886
  systemPrompt: {
24703
- en: `### Wix Store API
24704
- - Call the Wix Store REST API using the authenticated request tool
24705
- - Authentication (API Key, Site ID) is automatically configured
24706
- - Wix API uses POST for query endpoints as well
24707
- - Wix uses WQL (Wix Query Language) for filters
24708
- - Max 100 items per page
24709
-
24710
- ### List Products
24711
- - POST stores/v1/products/query
24712
- - Body: { "query": { "paging": { "limit": 50, "offset": 0 } } }
24887
+ en: `### Tools
24713
24888
 
24714
- ### Search Products (with filter)
24715
- - POST stores/v1/products/query
24716
- - Body: { "query": { "filter": { "name": { "$contains": "keyword" } }, "paging": { "limit": 50 } } }
24717
-
24718
- ### Search Orders (eCommerce Orders V1)
24719
- - POST ecom/v1/orders/search
24720
- - Body: { "search": { "cursorPaging": { "limit": 50 } } }
24721
- - Uses cursor-based pagination (cursorPaging, not paging)
24722
- - Response includes pagingMetadata.cursors.next for pagination
24723
-
24724
- ### List Collections (Categories)
24725
- - POST stores/v1/collections/query
24726
- - Body: { "query": { "paging": { "limit": 50 } } }
24727
-
24728
- ### List Inventory Items
24729
- - POST stores/v2/inventoryItems/query
24730
- - Body: { "query": { "paging": { "limit": 50 } } }
24889
+ - \`wix-store_request\`: The only way to call the Wix Store REST API. Use it to query products, orders, collections, and inventory. Authentication (API Key, Site ID) is configured automatically. Note that Wix uses POST even for query endpoints, and filters are written in WQL (Wix Query Language). See the Wix Store API Reference below for endpoints and request bodies.
24731
24890
 
24732
24891
  ### Business Logic
24733
24892
 
24734
- The business logic type for this connector is "typescript". Write handler code using the connector SDK shown below. Do NOT access credentials directly from environment variables.
24893
+ The business logic type for this connector is "typescript". Use the connector SDK in your handler. Do NOT read credentials from environment variables.
24735
24894
 
24736
- #### Example
24895
+ SDK methods (client created via \`connection(connectionId)\`):
24896
+ - \`client.request(path, init?)\` \u2014 low-level authenticated fetch
24897
+ - \`client.queryProducts(options?)\` \u2014 query products with WQL filter/paging
24898
+ - \`client.getProduct(productId)\` \u2014 fetch a single product
24899
+ - \`client.queryOrders(options?)\` \u2014 query orders (uses cursorPaging)
24900
+ - \`client.getOrder(orderId)\` \u2014 fetch a single order
24901
+ - \`client.queryCollections(options?)\` \u2014 query collections (categories)
24902
+ - \`client.queryInventory(options?)\` \u2014 query inventory items
24737
24903
 
24738
24904
  \`\`\`ts
24905
+ import type { Context } from "hono";
24739
24906
  import { connection } from "@squadbase/vite-server/connectors/wix-store";
24740
24907
 
24741
24908
  const wix = connection("<connectionId>");
24742
24909
 
24743
- // Authenticated fetch (returns standard Response)
24744
- const res = await wix.request("/stores/v1/products/query", {
24745
- method: "POST",
24746
- headers: { "Content-Type": "application/json" },
24747
- body: JSON.stringify({ query: { paging: { limit: 10 } } }),
24748
- });
24749
- const data = await res.json();
24910
+ export default async function handler(c: Context) {
24911
+ const { keyword, limit = 50 } = await c.req.json<{
24912
+ keyword?: string;
24913
+ limit?: number;
24914
+ }>();
24750
24915
 
24751
- // Convenience methods
24752
- const { products, totalResults } = await wix.queryProducts({ paging: { limit: 50 } });
24753
- const { product } = await wix.getProduct("product-id");
24754
- const { orders, pagingMetadata } = await wix.queryOrders({ cursorPaging: { limit: 50 } });
24755
- const { order } = await wix.getOrder("order-id");
24756
- const { inventoryItems } = await wix.queryInventory({ paging: { limit: 50 } });
24757
- const { collections } = await wix.queryCollections({ paging: { limit: 50 } });
24758
- \`\`\``,
24759
- ja: `### Wix Store API
24760
- - \u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066Wix Store REST API\u3092\u547C\u3073\u51FA\u3057\u307E\u3059
24761
- - \u8A8D\u8A3C\uFF08API Key\u3001Site ID\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059
24762
- - Wix API\u306F\u30AF\u30A8\u30EA\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3067\u3082POST\u3092\u4F7F\u7528\u3057\u307E\u3059
24763
- - Wix\u306F\u30D5\u30A3\u30EB\u30BF\u306B WQL (Wix Query Language) \u3092\u4F7F\u7528\u3057\u307E\u3059
24764
- - \u30DA\u30FC\u30B8\u3042\u305F\u308A\u6700\u5927100\u30A2\u30A4\u30C6\u30E0
24916
+ const { products, totalResults } = await wix.queryProducts({
24917
+ filter: keyword ? { name: { $contains: keyword } } : undefined,
24918
+ paging: { limit, offset: 0 },
24919
+ });
24920
+
24921
+ return c.json({
24922
+ totalResults,
24923
+ products: products.map((p) => ({
24924
+ id: p.id,
24925
+ name: p.name,
24926
+ price: p.price?.price,
24927
+ currency: p.price?.currency,
24928
+ stock: p.stock?.quantity,
24929
+ })),
24930
+ });
24931
+ }
24932
+ \`\`\`
24933
+
24934
+ ### Wix Store API Reference
24765
24935
 
24766
- ### \u5546\u54C1\u4E00\u89A7\u306E\u53D6\u5F97
24767
- - POST stores/v1/products/query
24768
- - Body: { "query": { "paging": { "limit": 50, "offset": 0 } } }
24936
+ - Wix API uses POST for query endpoints as well
24937
+ - Wix uses WQL (Wix Query Language) for filters
24938
+ - Max 100 items per page
24939
+
24940
+ #### List Products
24941
+ - \`POST stores/v1/products/query\`
24942
+ - Body: \`{ "query": { "paging": { "limit": 50, "offset": 0 } } }\`
24769
24943
 
24770
- ### \u5546\u54C1\u306E\u691C\u7D22\uFF08\u30D5\u30A3\u30EB\u30BF\u4ED8\u304D\uFF09
24771
- - POST stores/v1/products/query
24772
- - Body: { "query": { "filter": { "name": { "$contains": "keyword" } }, "paging": { "limit": 50 } } }
24944
+ #### Search Products (with filter)
24945
+ - \`POST stores/v1/products/query\`
24946
+ - Body: \`{ "query": { "filter": { "name": { "$contains": "keyword" } }, "paging": { "limit": 50 } } }\`
24773
24947
 
24774
- ### \u6CE8\u6587\u306E\u691C\u7D22 (eCommerce Orders V1)
24775
- - POST ecom/v1/orders/search
24776
- - Body: { "search": { "cursorPaging": { "limit": 50 } } }
24777
- - \u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\uFF08paging\u3067\u306F\u306A\u304FcursorPaging\uFF09\u3092\u4F7F\u7528\u3057\u307E\u3059
24778
- - \u30EC\u30B9\u30DD\u30F3\u30B9\u306B\u306F\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u7528\u306E pagingMetadata.cursors.next \u304C\u542B\u307E\u308C\u307E\u3059
24948
+ #### Search Orders (eCommerce Orders V1)
24949
+ - \`POST ecom/v1/orders/search\`
24950
+ - Body: \`{ "search": { "cursorPaging": { "limit": 50 } } }\`
24951
+ - Uses cursor-based pagination (\`cursorPaging\`, not \`paging\`)
24952
+ - Response includes \`pagingMetadata.cursors.next\` for pagination
24779
24953
 
24780
- ### \u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u4E00\u89A7\u306E\u53D6\u5F97\uFF08\u30AB\u30C6\u30B4\u30EA\uFF09
24781
- - POST stores/v1/collections/query
24782
- - Body: { "query": { "paging": { "limit": 50 } } }
24954
+ #### List Collections (Categories)
24955
+ - \`POST stores/v1/collections/query\`
24956
+ - Body: \`{ "query": { "paging": { "limit": 50 } } }\`
24783
24957
 
24784
- ### \u5728\u5EAB\u30A2\u30A4\u30C6\u30E0\u4E00\u89A7\u306E\u53D6\u5F97
24785
- - POST stores/v2/inventoryItems/query
24786
- - Body: { "query": { "paging": { "limit": 50 } } }
24958
+ #### List Inventory Items
24959
+ - \`POST stores/v2/inventoryItems/query\`
24960
+ - Body: \`{ "query": { "paging": { "limit": 50 } } }\``,
24961
+ ja: `### \u30C4\u30FC\u30EB
24962
+
24963
+ - \`wix-store_request\`: Wix Store REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u5546\u54C1\u3001\u6CE8\u6587\u3001\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3001\u5728\u5EAB\u306E\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API Key\u3001Site ID\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Wix\u306F\u30AF\u30A8\u30EA\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3067\u3082 POST \u3092\u4F7F\u7528\u3057\u3001\u30D5\u30A3\u30EB\u30BF\u306F WQL (Wix Query Language) \u3067\u8A18\u8FF0\u3059\u308B\u3053\u3068\u306B\u6CE8\u610F\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3068\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3\u306F\u4E0B\u90E8\u306E\u300CWix Store API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
24787
24964
 
24788
24965
  ### Business Logic
24789
24966
 
24790
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u4EE5\u4E0B\u306B\u793A\u3059\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u30B3\u30FC\u30C9\u3092\u8A18\u8FF0\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u76F4\u63A5\u8A8D\u8A3C\u60C5\u5831\u306B\u30A2\u30AF\u30BB\u30B9\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
24967
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
24791
24968
 
24792
- #### Example
24969
+ SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
24970
+ - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
24971
+ - \`client.queryProducts(options?)\` \u2014 WQL\u30D5\u30A3\u30EB\u30BF/\u30DA\u30FC\u30B8\u30F3\u30B0\u4ED8\u304D\u3067\u5546\u54C1\u3092\u30AF\u30A8\u30EA
24972
+ - \`client.getProduct(productId)\` \u2014 \u5358\u4E00\u5546\u54C1\u3092\u53D6\u5F97
24973
+ - \`client.queryOrders(options?)\` \u2014 \u6CE8\u6587\u3092\u30AF\u30A8\u30EA (cursorPaging \u3092\u4F7F\u7528)
24974
+ - \`client.getOrder(orderId)\` \u2014 \u5358\u4E00\u6CE8\u6587\u3092\u53D6\u5F97
24975
+ - \`client.queryCollections(options?)\` \u2014 \u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\uFF08\u30AB\u30C6\u30B4\u30EA\uFF09\u3092\u30AF\u30A8\u30EA
24976
+ - \`client.queryInventory(options?)\` \u2014 \u5728\u5EAB\u30A2\u30A4\u30C6\u30E0\u3092\u30AF\u30A8\u30EA
24793
24977
 
24794
24978
  \`\`\`ts
24979
+ import type { Context } from "hono";
24795
24980
  import { connection } from "@squadbase/vite-server/connectors/wix-store";
24796
24981
 
24797
24982
  const wix = connection("<connectionId>");
24798
24983
 
24799
- // Authenticated fetch (returns standard Response)
24800
- const res = await wix.request("/stores/v1/products/query", {
24801
- method: "POST",
24802
- headers: { "Content-Type": "application/json" },
24803
- body: JSON.stringify({ query: { paging: { limit: 10 } } }),
24804
- });
24805
- const data = await res.json();
24984
+ export default async function handler(c: Context) {
24985
+ const { keyword, limit = 50 } = await c.req.json<{
24986
+ keyword?: string;
24987
+ limit?: number;
24988
+ }>();
24806
24989
 
24807
- // Convenience methods
24808
- const { products, totalResults } = await wix.queryProducts({ paging: { limit: 50 } });
24809
- const { product } = await wix.getProduct("product-id");
24810
- const { orders, pagingMetadata } = await wix.queryOrders({ cursorPaging: { limit: 50 } });
24811
- const { order } = await wix.getOrder("order-id");
24812
- const { inventoryItems } = await wix.queryInventory({ paging: { limit: 50 } });
24813
- const { collections } = await wix.queryCollections({ paging: { limit: 50 } });
24814
- \`\`\``
24990
+ const { products, totalResults } = await wix.queryProducts({
24991
+ filter: keyword ? { name: { $contains: keyword } } : undefined,
24992
+ paging: { limit, offset: 0 },
24993
+ });
24994
+
24995
+ return c.json({
24996
+ totalResults,
24997
+ products: products.map((p) => ({
24998
+ id: p.id,
24999
+ name: p.name,
25000
+ price: p.price?.price,
25001
+ currency: p.price?.currency,
25002
+ stock: p.stock?.quantity,
25003
+ })),
25004
+ });
25005
+ }
25006
+ \`\`\`
25007
+
25008
+ ### Wix Store API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
25009
+
25010
+ - Wix API\u306F\u30AF\u30A8\u30EA\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3067\u3082POST\u3092\u4F7F\u7528\u3057\u307E\u3059
25011
+ - Wix\u306F\u30D5\u30A3\u30EB\u30BF\u306B WQL (Wix Query Language) \u3092\u4F7F\u7528\u3057\u307E\u3059
25012
+ - \u30DA\u30FC\u30B8\u3042\u305F\u308A\u6700\u5927100\u30A2\u30A4\u30C6\u30E0
25013
+
25014
+ #### \u5546\u54C1\u4E00\u89A7\u306E\u53D6\u5F97
25015
+ - \`POST stores/v1/products/query\`
25016
+ - Body: \`{ "query": { "paging": { "limit": 50, "offset": 0 } } }\`
25017
+
25018
+ #### \u5546\u54C1\u306E\u691C\u7D22\uFF08\u30D5\u30A3\u30EB\u30BF\u4ED8\u304D\uFF09
25019
+ - \`POST stores/v1/products/query\`
25020
+ - Body: \`{ "query": { "filter": { "name": { "$contains": "keyword" } }, "paging": { "limit": 50 } } }\`
25021
+
25022
+ #### \u6CE8\u6587\u306E\u691C\u7D22 (eCommerce Orders V1)
25023
+ - \`POST ecom/v1/orders/search\`
25024
+ - Body: \`{ "search": { "cursorPaging": { "limit": 50 } } }\`
25025
+ - \u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\uFF08\`paging\` \u3067\u306F\u306A\u304F \`cursorPaging\`\uFF09\u3092\u4F7F\u7528\u3057\u307E\u3059
25026
+ - \u30EC\u30B9\u30DD\u30F3\u30B9\u306B\u306F\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u7528\u306E \`pagingMetadata.cursors.next\` \u304C\u542B\u307E\u308C\u307E\u3059
25027
+
25028
+ #### \u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u4E00\u89A7\u306E\u53D6\u5F97\uFF08\u30AB\u30C6\u30B4\u30EA\uFF09
25029
+ - \`POST stores/v1/collections/query\`
25030
+ - Body: \`{ "query": { "paging": { "limit": 50 } } }\`
25031
+
25032
+ #### \u5728\u5EAB\u30A2\u30A4\u30C6\u30E0\u4E00\u89A7\u306E\u53D6\u5F97
25033
+ - \`POST stores/v2/inventoryItems/query\`
25034
+ - Body: \`{ "query": { "paging": { "limit": 50 } } }\``
24815
25035
  },
24816
25036
  tools: tools20
24817
25037
  });
@@ -24929,17 +25149,17 @@ Authentication is handled automatically using the API token.
24929
25149
  signal: controller.signal
24930
25150
  });
24931
25151
  const data = await response.json();
24932
- if (!response.ok) {
25152
+ if (Array.isArray(data?.errors) && data.errors.length > 0) {
25153
+ const errors = data.errors;
24933
25154
  return {
24934
25155
  success: false,
24935
- error: data?.message ?? `HTTP ${response.status} ${response.statusText}`
25156
+ error: errors.map((e2) => e2.message).join("; ")
24936
25157
  };
24937
25158
  }
24938
- if (Array.isArray(data?.errors) && data.errors.length > 0) {
24939
- const errors = data.errors;
25159
+ if (!response.ok) {
24940
25160
  return {
24941
25161
  success: false,
24942
- error: errors.map((e2) => e2.message).join("; ")
25162
+ error: data?.message ?? `HTTP ${response.status} ${response.statusText}`
24943
25163
  };
24944
25164
  }
24945
25165
  return { success: true, data };
@@ -24965,11 +25185,59 @@ var dbtConnector = new ConnectorPlugin({
24965
25185
  releaseFlag: { dev1: true, dev2: true, prod: true },
24966
25186
  onboarding: dbtOnboarding,
24967
25187
  systemPrompt: {
24968
- en: `### dbt Cloud Discovery API (GraphQL)
24969
- - Call the dbt Cloud Discovery API using the authenticated request tool
24970
- - {environmentId} in GraphQL variables is automatically replaced with the prod-env-id
25188
+ en: `### Tools
25189
+
25190
+ - \`dbt_request\`: The only way to call the dbt Cloud Discovery API (GraphQL). Use it to explore models, sources, tests, metrics, columns, and lineage. The \`{environmentId}\` placeholder in GraphQL variables is automatically replaced with the prod-env-id. See the dbt Cloud Discovery API Reference below for available GraphQL queries.
25191
+
25192
+ ### Business Logic
25193
+
25194
+ The business logic type for this connector is "typescript". Use the connector SDK in your handler. Do NOT read credentials from environment variables.
25195
+
25196
+ SDK methods (client created via \`connection(connectionId)\`):
25197
+ - \`client.request(path, init?)\` \u2014 low-level authenticated fetch
25198
+ - \`client.query(graphqlQuery, variables?)\` \u2014 run an arbitrary GraphQL query
25199
+ - \`client.getModels(options?)\` \u2014 list models with metadata
25200
+ - \`client.getModelByUniqueId(uniqueId)\` \u2014 fetch a single model (including catalog columns)
25201
+ - \`client.getSources(options?)\` \u2014 list sources
25202
+ - \`client.getTests(options?)\` \u2014 list tests
25203
+ - \`client.getMetrics(options?)\` \u2014 list metrics
25204
+
25205
+ \`\`\`ts
25206
+ import type { Context } from "hono";
25207
+ import { connection } from "@squadbase/vite-server/connectors/dbt";
25208
+
25209
+ const dbt = connection("<connectionId>");
25210
+
25211
+ export default async function handler(c: Context) {
25212
+ const { uniqueId } = await c.req.json<{ uniqueId?: string }>();
25213
+
25214
+ if (uniqueId) {
25215
+ const model = await dbt.getModelByUniqueId(uniqueId);
25216
+ return c.json({
25217
+ uniqueId: model.uniqueId,
25218
+ name: model.name,
25219
+ description: model.description,
25220
+ database: model.database,
25221
+ schema: model.schema,
25222
+ columns: model.catalog?.columns ?? [],
25223
+ });
25224
+ }
25225
+
25226
+ const models = await dbt.getModels({ limit: 100 });
25227
+ return c.json(
25228
+ models.map((m) => ({
25229
+ uniqueId: m.uniqueId,
25230
+ name: m.name,
25231
+ description: m.description,
25232
+ materializedType: m.materializedType,
25233
+ })),
25234
+ );
25235
+ }
25236
+ \`\`\`
25237
+
25238
+ ### dbt Cloud Discovery API Reference
24971
25239
 
24972
- ### List Models
25240
+ #### List Models
24973
25241
  \`\`\`graphql
24974
25242
  query($environmentId: BigInt!) {
24975
25243
  environment(id: $environmentId) {
@@ -24985,7 +25253,7 @@ query($environmentId: BigInt!) {
24985
25253
  \`\`\`
24986
25254
  variables: \`{ "environmentId": "{environmentId}" }\`
24987
25255
 
24988
- ### List Sources
25256
+ #### List Sources
24989
25257
  \`\`\`graphql
24990
25258
  query($environmentId: BigInt!) {
24991
25259
  environment(id: $environmentId) {
@@ -25001,14 +25269,21 @@ query($environmentId: BigInt!) {
25001
25269
  \`\`\`
25002
25270
  variables: \`{ "environmentId": "{environmentId}" }\`
25003
25271
 
25004
- ### Model Column Information
25272
+ #### Model Column Information
25273
+ Column metadata is available under \`applied.models[].catalog.columns\`. Use the \`uniqueIds\` filter (not \`uniqueId\`) to fetch one or more models.
25005
25274
  \`\`\`graphql
25006
- query($environmentId: BigInt!, $uniqueId: String!) {
25275
+ query($environmentId: BigInt!, $uniqueIds: [String!]!) {
25007
25276
  environment(id: $environmentId) {
25008
25277
  applied {
25009
- models(filter: { uniqueId: { eq: $uniqueId } }) {
25278
+ models(first: 100, filter: { uniqueIds: $uniqueIds }) {
25010
25279
  edges {
25011
- node { uniqueId name columns { name description type } }
25280
+ node {
25281
+ uniqueId
25282
+ name
25283
+ catalog {
25284
+ columns { name description type }
25285
+ }
25286
+ }
25012
25287
  }
25013
25288
  }
25014
25289
  }
@@ -25016,46 +25291,62 @@ query($environmentId: BigInt!, $uniqueId: String!) {
25016
25291
  }
25017
25292
  \`\`\`
25018
25293
 
25019
- ### Lineage (Dependencies)
25020
- - Traverse relationships using ancestors / children fields
25021
- - Get ancestors { uniqueId name } or children { uniqueId name } within node
25294
+ #### Lineage (Dependencies)
25295
+ - Traverse relationships using \`ancestors\` / \`children\` fields
25296
+ - Get \`ancestors { uniqueId name }\` or \`children { uniqueId name }\` within node`,
25297
+ ja: `### \u30C4\u30FC\u30EB
25298
+
25299
+ - \`dbt_request\`: dbt Cloud Discovery API (GraphQL) \u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30E2\u30C7\u30EB\u3001\u30BD\u30FC\u30B9\u3001\u30C6\u30B9\u30C8\u3001\u30E1\u30C8\u30EA\u30AF\u30B9\u3001\u30AB\u30E9\u30E0\u3001\u30EA\u30CD\u30FC\u30B8\u306E\u63A2\u7D22\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002GraphQL\u5909\u6570\u5185\u306E \`{environmentId}\` \u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u306Fprod-env-id\u3067\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059\u3002\u5229\u7528\u53EF\u80FD\u306AGraphQL\u30AF\u30A8\u30EA\u306F\u4E0B\u90E8\u306E\u300Cdbt Cloud Discovery API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
25022
25300
 
25023
25301
  ### Business Logic
25024
25302
 
25025
- The business logic type for this connector is "typescript". Write handler code using the connector SDK shown below. Do NOT access credentials directly from environment variables.
25303
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
25026
25304
 
25027
- #### Example
25305
+ SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
25306
+ - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
25307
+ - \`client.query(graphqlQuery, variables?)\` \u2014 \u4EFB\u610F\u306EGraphQL\u30AF\u30A8\u30EA\u3092\u5B9F\u884C
25308
+ - \`client.getModels(options?)\` \u2014 \u30E2\u30C7\u30EB\u4E00\u89A7\u3092\u30E1\u30BF\u30C7\u30FC\u30BF\u4ED8\u304D\u3067\u53D6\u5F97
25309
+ - \`client.getModelByUniqueId(uniqueId)\` \u2014 \u5358\u4E00\u30E2\u30C7\u30EB\u3092\u53D6\u5F97\uFF08catalog columns\u3092\u542B\u3080\uFF09
25310
+ - \`client.getSources(options?)\` \u2014 \u30BD\u30FC\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
25311
+ - \`client.getTests(options?)\` \u2014 \u30C6\u30B9\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
25312
+ - \`client.getMetrics(options?)\` \u2014 \u30E1\u30C8\u30EA\u30AF\u30B9\u4E00\u89A7\u3092\u53D6\u5F97
25028
25313
 
25029
25314
  \`\`\`ts
25315
+ import type { Context } from "hono";
25030
25316
  import { connection } from "@squadbase/vite-server/connectors/dbt";
25031
25317
 
25032
25318
  const dbt = connection("<connectionId>");
25033
25319
 
25034
- // Authenticated fetch (returns standard Response)
25035
- const res = await dbt.request("/graphql", {
25036
- method: "POST",
25037
- headers: { "Content-Type": "application/json" },
25038
- body: JSON.stringify({ query: "{ ... }", variables: {} }),
25039
- });
25040
- const data = await res.json();
25320
+ export default async function handler(c: Context) {
25321
+ const { uniqueId } = await c.req.json<{ uniqueId?: string }>();
25322
+
25323
+ if (uniqueId) {
25324
+ const model = await dbt.getModelByUniqueId(uniqueId);
25325
+ return c.json({
25326
+ uniqueId: model.uniqueId,
25327
+ name: model.name,
25328
+ description: model.description,
25329
+ database: model.database,
25330
+ schema: model.schema,
25331
+ columns: model.catalog?.columns ?? [],
25332
+ });
25333
+ }
25041
25334
 
25042
- // Convenience methods
25043
- const result = await dbt.query(\`
25044
- query($environmentId: BigInt!) {
25045
- environment(id: $environmentId) { applied { models(first: 10) { edges { node { name } } } } }
25046
- }
25047
- \`);
25048
- const models = await dbt.getModels({ limit: 100 });
25049
- const model = await dbt.getModelByUniqueId("model.project.my_model");
25050
- const sources = await dbt.getSources({ limit: 100 });
25051
- const tests = await dbt.getTests({ limit: 100 });
25052
- const metrics = await dbt.getMetrics({ limit: 100 });
25053
- \`\`\``,
25054
- ja: `### dbt Cloud Discovery API (GraphQL)
25055
- - \u8A8D\u8A3C\u6E08\u307F\u30EA\u30AF\u30A8\u30B9\u30C8\u30C4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066dbt Cloud Discovery API\u3092\u547C\u3073\u51FA\u3057\u307E\u3059
25056
- - GraphQL\u5909\u6570\u5185\u306E {environmentId} \u306Fprod-env-id\u3067\u81EA\u52D5\u7684\u306B\u7F6E\u63DB\u3055\u308C\u307E\u3059
25335
+ const models = await dbt.getModels({ limit: 100 });
25336
+ return c.json(
25337
+ models.map((m) => ({
25338
+ uniqueId: m.uniqueId,
25339
+ name: m.name,
25340
+ description: m.description,
25341
+ materializedType: m.materializedType,
25342
+ })),
25343
+ );
25344
+ }
25345
+ \`\`\`
25057
25346
 
25058
- ### \u30E2\u30C7\u30EB\u4E00\u89A7\u306E\u53D6\u5F97
25347
+ ### dbt Cloud Discovery API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
25348
+
25349
+ #### \u30E2\u30C7\u30EB\u4E00\u89A7\u306E\u53D6\u5F97
25059
25350
  \`\`\`graphql
25060
25351
  query($environmentId: BigInt!) {
25061
25352
  environment(id: $environmentId) {
@@ -25071,7 +25362,7 @@ query($environmentId: BigInt!) {
25071
25362
  \`\`\`
25072
25363
  variables: \`{ "environmentId": "{environmentId}" }\`
25073
25364
 
25074
- ### \u30BD\u30FC\u30B9\u4E00\u89A7\u306E\u53D6\u5F97
25365
+ #### \u30BD\u30FC\u30B9\u4E00\u89A7\u306E\u53D6\u5F97
25075
25366
  \`\`\`graphql
25076
25367
  query($environmentId: BigInt!) {
25077
25368
  environment(id: $environmentId) {
@@ -25087,14 +25378,21 @@ query($environmentId: BigInt!) {
25087
25378
  \`\`\`
25088
25379
  variables: \`{ "environmentId": "{environmentId}" }\`
25089
25380
 
25090
- ### \u30E2\u30C7\u30EB\u306E\u30AB\u30E9\u30E0\u60C5\u5831
25381
+ #### \u30E2\u30C7\u30EB\u306E\u30AB\u30E9\u30E0\u60C5\u5831
25382
+ \u30AB\u30E9\u30E0\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u306F \`applied.models[].catalog.columns\` \u304B\u3089\u53D6\u5F97\u3057\u307E\u3059\u3002\u30D5\u30A3\u30EB\u30BF\u306B\u306F \`uniqueId\` \u3067\u306F\u306A\u304F \`uniqueIds\` \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8907\u6570\u30E2\u30C7\u30EB\u4E00\u62EC\u53D6\u5F97\u53EF\u80FD\uFF09\u3002
25091
25383
  \`\`\`graphql
25092
- query($environmentId: BigInt!, $uniqueId: String!) {
25384
+ query($environmentId: BigInt!, $uniqueIds: [String!]!) {
25093
25385
  environment(id: $environmentId) {
25094
25386
  applied {
25095
- models(filter: { uniqueId: { eq: $uniqueId } }) {
25387
+ models(first: 100, filter: { uniqueIds: $uniqueIds }) {
25096
25388
  edges {
25097
- node { uniqueId name columns { name description type } }
25389
+ node {
25390
+ uniqueId
25391
+ name
25392
+ catalog {
25393
+ columns { name description type }
25394
+ }
25395
+ }
25098
25396
  }
25099
25397
  }
25100
25398
  }
@@ -25102,41 +25400,9 @@ query($environmentId: BigInt!, $uniqueId: String!) {
25102
25400
  }
25103
25401
  \`\`\`
25104
25402
 
25105
- ### \u30EA\u30CD\u30FC\u30B8\uFF08\u4F9D\u5B58\u95A2\u4FC2\uFF09
25106
- - ancestors / children \u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u4F7F\u7528\u3057\u3066\u95A2\u4FC2\u3092\u30C8\u30E9\u30D0\u30FC\u30B9\u3057\u307E\u3059
25107
- - node\u5185\u3067 ancestors { uniqueId name } \u307E\u305F\u306F children { uniqueId name } \u3092\u53D6\u5F97\u3057\u307E\u3059
25108
-
25109
- ### Business Logic
25110
-
25111
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u4EE5\u4E0B\u306B\u793A\u3059\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u30B3\u30FC\u30C9\u3092\u8A18\u8FF0\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u76F4\u63A5\u8A8D\u8A3C\u60C5\u5831\u306B\u30A2\u30AF\u30BB\u30B9\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
25112
-
25113
- #### Example
25114
-
25115
- \`\`\`ts
25116
- import { connection } from "@squadbase/vite-server/connectors/dbt";
25117
-
25118
- const dbt = connection("<connectionId>");
25119
-
25120
- // Authenticated fetch (returns standard Response)
25121
- const res = await dbt.request("/graphql", {
25122
- method: "POST",
25123
- headers: { "Content-Type": "application/json" },
25124
- body: JSON.stringify({ query: "{ ... }", variables: {} }),
25125
- });
25126
- const data = await res.json();
25127
-
25128
- // Convenience methods
25129
- const result = await dbt.query(\`
25130
- query($environmentId: BigInt!) {
25131
- environment(id: $environmentId) { applied { models(first: 10) { edges { node { name } } } } }
25132
- }
25133
- \`);
25134
- const models = await dbt.getModels({ limit: 100 });
25135
- const model = await dbt.getModelByUniqueId("model.project.my_model");
25136
- const sources = await dbt.getSources({ limit: 100 });
25137
- const tests = await dbt.getTests({ limit: 100 });
25138
- const metrics = await dbt.getMetrics({ limit: 100 });
25139
- \`\`\``
25403
+ #### \u30EA\u30CD\u30FC\u30B8\uFF08\u4F9D\u5B58\u95A2\u4FC2\uFF09
25404
+ - \`ancestors\` / \`children\` \u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u4F7F\u7528\u3057\u3066\u95A2\u4FC2\u3092\u30C8\u30E9\u30D0\u30FC\u30B9\u3057\u307E\u3059
25405
+ - node\u5185\u3067 \`ancestors { uniqueId name }\` \u307E\u305F\u306F \`children { uniqueId name }\` \u3092\u53D6\u5F97\u3057\u307E\u3059`
25140
25406
  },
25141
25407
  tools: tools21
25142
25408
  });
@@ -25253,26 +25519,34 @@ var squadbaseDbConnector = new ConnectorPlugin({
25253
25519
  releaseFlag: { dev1: true, dev2: true, prod: true },
25254
25520
  onboarding: squadbaseDbOnboarding,
25255
25521
  systemPrompt: {
25256
- en: `### SQL Reference
25522
+ en: `### Tools
25523
+
25524
+ - \`squadbase-db_executeQuery\`: Executes a Squadbase DB (PostgreSQL-based) SQL query and returns rows. Use this for schema exploration via \`information_schema.tables\`/\`columns\` and for sampling data. See the SQL Reference below for syntax notes.
25525
+
25526
+ ### Business Logic
25527
+
25528
+ The business logic type for this connector is "sql".
25529
+
25530
+ ### SQL Reference
25257
25531
  - Uses PostgreSQL based SQL syntax
25258
25532
  - Schema exploration:
25259
25533
  - List tables: \`SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'\`
25260
25534
  - List columns: \`SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'xxx'\`
25261
- - Always include LIMIT in queries
25535
+ - Always include LIMIT in queries`,
25536
+ ja: `### \u30C4\u30FC\u30EB
25537
+
25538
+ - \`squadbase-db_executeQuery\`: Squadbase DB (PostgreSQL\u30D9\u30FC\u30B9) SQL\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u3057\u3001\u884C\u30C7\u30FC\u30BF\u3092\u8FD4\u3057\u307E\u3059\u3002\`information_schema.tables\`/\`columns\` \u3092\u4F7F\u3063\u305F\u30B9\u30AD\u30FC\u30DE\u63A2\u7D22\u3084\u30C7\u30FC\u30BF\u306E\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u306B\u4F7F\u3044\u307E\u3059\u3002\u69CB\u6587\u306E\u6CE8\u610F\u70B9\u306F\u4E0B\u90E8\u306E\u300CSQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u300D\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
25262
25539
 
25263
25540
  ### Business Logic
25264
25541
 
25265
- The business logic type for this connector is "sql". Write SQL queries to define data retrieval logic.`,
25266
- ja: `### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
25542
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002
25543
+
25544
+ ### SQL \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
25267
25545
  - PostgreSQL \u30D9\u30FC\u30B9\u306E SQL \u69CB\u6587\u3092\u4F7F\u7528\u3057\u307E\u3059
25268
25546
  - \u30B9\u30AD\u30FC\u30DE\u63A2\u7D22:
25269
25547
  - \u30C6\u30FC\u30D6\u30EB\u4E00\u89A7: \`SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'\`
25270
25548
  - \u30AB\u30E9\u30E0\u4E00\u89A7: \`SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'xxx'\`
25271
- - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A LIMIT \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044
25272
-
25273
- ### Business Logic
25274
-
25275
- \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "sql" \u3067\u3059\u3002SQL\u30AF\u30A8\u30EA\u3092\u4F7F\u7528\u3057\u3066\u30C7\u30FC\u30BF\u53D6\u5F97\u30ED\u30B8\u30C3\u30AF\u3092\u5B9A\u7FA9\u3057\u3066\u304F\u3060\u3055\u3044\u3002`
25549
+ - \u30AF\u30A8\u30EA\u306B\u306F\u5FC5\u305A LIMIT \u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044`
25276
25550
  },
25277
25551
  tools: tools22,
25278
25552
  async checkConnection(params, _config) {
@@ -25333,35 +25607,51 @@ var openaiConnector = new ConnectorPlugin({
25333
25607
  parameters: parameters23,
25334
25608
  releaseFlag: { dev1: true, dev2: true, prod: true },
25335
25609
  systemPrompt: {
25336
- en: `### OpenAI SDK (TypeScript handler)
25337
- Use the OpenAI connector via the SDK in TypeScript handlers:
25610
+ en: `### Business Logic
25611
+
25612
+ The business logic type for this connector is "typescript". This connector exposes the API key via \`connection(connectionId)\`; pass it to the official \`openai\` SDK and call the OpenAI API from the handler. Do NOT read credentials from environment variables.
25338
25613
 
25339
25614
  \`\`\`ts
25615
+ import type { Context } from "hono";
25340
25616
  import { connection } from "@squadbase/vite-server/connectors/openai";
25341
25617
  import OpenAI from "openai";
25342
25618
 
25343
25619
  const { apiKey } = connection("<connectionId>");
25344
25620
  const client = new OpenAI({ apiKey });
25345
25621
 
25346
- const response = await client.chat.completions.create({
25347
- model: "gpt-4o",
25348
- messages: [{ role: "user", content: "Hello" }],
25349
- });
25622
+ export default async function handler(c: Context) {
25623
+ const { prompt } = await c.req.json<{ prompt: string }>();
25624
+
25625
+ const response = await client.chat.completions.create({
25626
+ model: "gpt-4o",
25627
+ messages: [{ role: "user", content: prompt }],
25628
+ });
25629
+
25630
+ return c.json({ text: response.choices[0]?.message?.content ?? "" });
25631
+ }
25350
25632
  \`\`\``,
25351
- ja: `### OpenAI SDK\uFF08TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\uFF09
25352
- TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\u3067OpenAI\u30B3\u30CD\u30AF\u30BF\u30FC\u3092SDK\u7D4C\u7531\u3067\u4F7F\u7528\u3057\u307E\u3059\uFF1A
25633
+ ja: `### Business Logic
25634
+
25635
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306F \`connection(connectionId)\` \u3067API\u30AD\u30FC\u3092\u516C\u958B\u3057\u3066\u304A\u308A\u3001\u516C\u5F0F\u306E \`openai\` SDK\u306B\u6E21\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u304B\u3089OpenAI API\u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
25353
25636
 
25354
25637
  \`\`\`ts
25638
+ import type { Context } from "hono";
25355
25639
  import { connection } from "@squadbase/vite-server/connectors/openai";
25356
25640
  import OpenAI from "openai";
25357
25641
 
25358
25642
  const { apiKey } = connection("<connectionId>");
25359
25643
  const client = new OpenAI({ apiKey });
25360
25644
 
25361
- const response = await client.chat.completions.create({
25362
- model: "gpt-4o",
25363
- messages: [{ role: "user", content: "Hello" }],
25364
- });
25645
+ export default async function handler(c: Context) {
25646
+ const { prompt } = await c.req.json<{ prompt: string }>();
25647
+
25648
+ const response = await client.chat.completions.create({
25649
+ model: "gpt-4o",
25650
+ messages: [{ role: "user", content: prompt }],
25651
+ });
25652
+
25653
+ return c.json({ text: response.choices[0]?.message?.content ?? "" });
25654
+ }
25365
25655
  \`\`\``
25366
25656
  },
25367
25657
  tools: tools23
@@ -25391,10 +25681,12 @@ var geminiConnector = new ConnectorPlugin({
25391
25681
  parameters: parameters24,
25392
25682
  releaseFlag: { dev1: true, dev2: true, prod: true },
25393
25683
  systemPrompt: {
25394
- en: `### Gemini SDK (TypeScript handler)
25395
- Use the Gemini connector via the SDK in TypeScript handlers:
25684
+ en: `### Business Logic
25685
+
25686
+ The business logic type for this connector is "typescript". This connector exposes the API key via \`connection(connectionId)\`; pass it to the official \`@google/generative-ai\` SDK and call the Gemini API from the handler. Do NOT read credentials from environment variables.
25396
25687
 
25397
25688
  \`\`\`ts
25689
+ import type { Context } from "hono";
25398
25690
  import { connection } from "@squadbase/vite-server/connectors/gemini";
25399
25691
  import { GoogleGenerativeAI } from "@google/generative-ai";
25400
25692
 
@@ -25402,13 +25694,19 @@ const { apiKey } = connection("<connectionId>");
25402
25694
  const genAI = new GoogleGenerativeAI(apiKey);
25403
25695
  const model = genAI.getGenerativeModel({ model: "gemini-2.0-flash" });
25404
25696
 
25405
- const result = await model.generateContent("Hello");
25406
- const text = result.response.text();
25697
+ export default async function handler(c: Context) {
25698
+ const { prompt } = await c.req.json<{ prompt: string }>();
25699
+
25700
+ const result = await model.generateContent(prompt);
25701
+ return c.json({ text: result.response.text() });
25702
+ }
25407
25703
  \`\`\``,
25408
- ja: `### Gemini SDK\uFF08TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\uFF09
25409
- TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\u3067Gemini\u30B3\u30CD\u30AF\u30BF\u30FC\u3092SDK\u7D4C\u7531\u3067\u4F7F\u7528\u3057\u307E\u3059\uFF1A
25704
+ ja: `### Business Logic
25705
+
25706
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306F \`connection(connectionId)\` \u3067API\u30AD\u30FC\u3092\u516C\u958B\u3057\u3066\u304A\u308A\u3001\u516C\u5F0F\u306E \`@google/generative-ai\` SDK\u306B\u6E21\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u304B\u3089Gemini API\u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
25410
25707
 
25411
25708
  \`\`\`ts
25709
+ import type { Context } from "hono";
25412
25710
  import { connection } from "@squadbase/vite-server/connectors/gemini";
25413
25711
  import { GoogleGenerativeAI } from "@google/generative-ai";
25414
25712
 
@@ -25416,8 +25714,12 @@ const { apiKey } = connection("<connectionId>");
25416
25714
  const genAI = new GoogleGenerativeAI(apiKey);
25417
25715
  const model = genAI.getGenerativeModel({ model: "gemini-2.0-flash" });
25418
25716
 
25419
- const result = await model.generateContent("Hello");
25420
- const text = result.response.text();
25717
+ export default async function handler(c: Context) {
25718
+ const { prompt } = await c.req.json<{ prompt: string }>();
25719
+
25720
+ const result = await model.generateContent(prompt);
25721
+ return c.json({ text: result.response.text() });
25722
+ }
25421
25723
  \`\`\``
25422
25724
  },
25423
25725
  tools: tools24
@@ -25447,42 +25749,74 @@ var anthropicConnector = new ConnectorPlugin({
25447
25749
  parameters: parameters25,
25448
25750
  releaseFlag: { dev1: true, dev2: true, prod: true },
25449
25751
  systemPrompt: {
25450
- en: `### Anthropic SDK (TypeScript handler)
25451
- Use the Anthropic connector via the SDK in TypeScript handlers:
25752
+ en: `### Business Logic
25753
+
25754
+ The business logic type for this connector is "typescript". This connector exposes the API key via \`connection(connectionId)\`; pass it to the official \`@anthropic-ai/sdk\` and call the Anthropic API from the handler. Do NOT read credentials from environment variables.
25452
25755
 
25453
25756
  \`\`\`ts
25757
+ import type { Context } from "hono";
25454
25758
  import { connection } from "@squadbase/vite-server/connectors/anthropic";
25455
25759
  import Anthropic from "@anthropic-ai/sdk";
25456
25760
 
25457
25761
  const { apiKey } = connection("<connectionId>");
25458
25762
  const client = new Anthropic({ apiKey });
25459
25763
 
25460
- const message = await client.messages.create({
25461
- model: "claude-sonnet-4-20250514",
25462
- max_tokens: 1024,
25463
- messages: [{ role: "user", content: "Hello" }],
25464
- });
25764
+ export default async function handler(c: Context) {
25765
+ const { prompt } = await c.req.json<{ prompt: string }>();
25766
+
25767
+ const message = await client.messages.create({
25768
+ model: "claude-sonnet-4-20250514",
25769
+ max_tokens: 1024,
25770
+ messages: [{ role: "user", content: prompt }],
25771
+ });
25772
+
25773
+ return c.json({ text: message.content[0]?.type === "text" ? message.content[0].text : "" });
25774
+ }
25465
25775
  \`\`\``,
25466
- ja: `### Anthropic SDK\uFF08TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\uFF09
25467
- TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\u3067Anthropic\u30B3\u30CD\u30AF\u30BF\u30FC\u3092SDK\u7D4C\u7531\u3067\u4F7F\u7528\u3057\u307E\u3059\uFF1A
25776
+ ja: `### Business Logic
25777
+
25778
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306F \`connection(connectionId)\` \u3067API\u30AD\u30FC\u3092\u516C\u958B\u3057\u3066\u304A\u308A\u3001\u516C\u5F0F\u306E \`@anthropic-ai/sdk\` \u306B\u6E21\u3057\u3066\u30CF\u30F3\u30C9\u30E9\u304B\u3089Anthropic API\u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
25468
25779
 
25469
25780
  \`\`\`ts
25781
+ import type { Context } from "hono";
25470
25782
  import { connection } from "@squadbase/vite-server/connectors/anthropic";
25471
25783
  import Anthropic from "@anthropic-ai/sdk";
25472
25784
 
25473
25785
  const { apiKey } = connection("<connectionId>");
25474
25786
  const client = new Anthropic({ apiKey });
25475
25787
 
25476
- const message = await client.messages.create({
25477
- model: "claude-sonnet-4-20250514",
25478
- max_tokens: 1024,
25479
- messages: [{ role: "user", content: "Hello" }],
25480
- });
25788
+ export default async function handler(c: Context) {
25789
+ const { prompt } = await c.req.json<{ prompt: string }>();
25790
+
25791
+ const message = await client.messages.create({
25792
+ model: "claude-sonnet-4-20250514",
25793
+ max_tokens: 1024,
25794
+ messages: [{ role: "user", content: prompt }],
25795
+ });
25796
+
25797
+ return c.json({ text: message.content[0]?.type === "text" ? message.content[0].text : "" });
25798
+ }
25481
25799
  \`\`\``
25482
25800
  },
25483
25801
  tools: tools25
25484
25802
  });
25485
25803
 
25804
+ // ../connectors/src/connectors/amplitude/setup.ts
25805
+ var amplitudeOnboarding = new ConnectorOnboarding({
25806
+ dataOverviewInstructions: {
25807
+ en: `1. Check the connection's region parameter: use https://analytics.eu.amplitude.com for EU, https://amplitude.com for US (default)
25808
+ 2. Call amplitude_request with GET {baseUrl}/api/2/events/list to list available event types
25809
+ 3. Call amplitude_request with GET {baseUrl}/api/2/export?start=YYYYMMDDTHH&end=YYYYMMDDTHH to export raw event data for a time range
25810
+ 4. Use GET {baseUrl}/api/2/usersearch?user=QUERY and GET {baseUrl}/api/2/useractivity?user=AMPLITUDE_ID to explore user-level data
25811
+ NOTE: The Dashboard REST API endpoints (events/segmentation, funnels, retention, etc.) require a paid Growth or Enterprise plan. If you get a 403 Forbidden error, fall back to the Export API (/api/2/export) to retrieve raw events and perform aggregation in code instead.`,
25812
+ ja: `1. \u63A5\u7D9A\u306Eregion\u30D1\u30E9\u30E1\u30FC\u30BF\u3092\u78BA\u8A8D\uFF1AEU\u306E\u5834\u5408\u306F https://analytics.eu.amplitude.com\u3001US\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\uFF09\u306E\u5834\u5408\u306F https://amplitude.com \u3092\u4F7F\u7528
25813
+ 2. amplitude_request \u3067 GET {baseUrl}/api/2/events/list \u3092\u547C\u3073\u51FA\u3057\u3001\u5229\u7528\u53EF\u80FD\u306A\u30A4\u30D9\u30F3\u30C8\u30BF\u30A4\u30D7\u4E00\u89A7\u3092\u53D6\u5F97
25814
+ 3. amplitude_request \u3067 GET {baseUrl}/api/2/export?start=YYYYMMDDTHH&end=YYYYMMDDTHH \u3092\u547C\u3073\u51FA\u3057\u3001\u6307\u5B9A\u671F\u9593\u306E\u751F\u30A4\u30D9\u30F3\u30C8\u30C7\u30FC\u30BF\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8
25815
+ 4. GET {baseUrl}/api/2/usersearch?user=QUERY \u3084 GET {baseUrl}/api/2/useractivity?user=AMPLITUDE_ID \u3067\u30E6\u30FC\u30B6\u30FC\u30EC\u30D9\u30EB\u306E\u30C7\u30FC\u30BF\u3092\u63A2\u7D22
25816
+ \u6CE8\u610F: Dashboard REST API\uFF08events/segmentation\u3001funnels\u3001retention\u7B49\uFF09\u306F\u6709\u6599\u306EGrowth\u307E\u305F\u306FEnterprise\u30D7\u30E9\u30F3\u304C\u5FC5\u8981\u3067\u3059\u3002403 Forbidden\u30A8\u30E9\u30FC\u304C\u8FD4\u3055\u308C\u305F\u5834\u5408\u306F\u3001Export API\uFF08/api/2/export\uFF09\u3067\u751F\u30A4\u30D9\u30F3\u30C8\u3092\u53D6\u5F97\u3057\u3001\u30B3\u30FC\u30C9\u4E0A\u3067\u96C6\u8A08\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002`
25817
+ }
25818
+ });
25819
+
25486
25820
  // ../connectors/src/connectors/amplitude/parameters.ts
25487
25821
  var parameters26 = {
25488
25822
  apiKey: new ParameterDefinition({
@@ -25502,70 +25836,262 @@ var parameters26 = {
25502
25836
  type: "text",
25503
25837
  secret: true,
25504
25838
  required: true
25839
+ }),
25840
+ region: new ParameterDefinition({
25841
+ slug: "region",
25842
+ name: "Region",
25843
+ description: 'Amplitude data region. Set to "eu" if your Amplitude project is hosted in the EU. Leave empty for US (default).',
25844
+ envVarBaseKey: "AMPLITUDE_REGION",
25845
+ type: "text",
25846
+ secret: false,
25847
+ required: false
25505
25848
  })
25506
25849
  };
25507
25850
 
25508
- // ../connectors/src/connectors/amplitude/index.ts
25509
- var tools26 = {};
25510
- var amplitudeConnector = new ConnectorPlugin({
25511
- slug: "amplitude",
25512
- authType: null,
25513
- name: "Amplitude",
25514
- description: "Connect to Amplitude for product analytics and user behavior data.",
25515
- iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/2UBJSdRlFJaLq52WUCTBEB/308b59b374cf6c662ac70989860bffd7/amplitude-icon.svg",
25516
- parameters: parameters26,
25851
+ // ../connectors/src/connectors/amplitude/tools/request.ts
25852
+ import { z as z30 } from "zod";
25853
+ var REQUEST_TIMEOUT_MS19 = 6e4;
25854
+ var inputSchema30 = z30.object({
25855
+ toolUseIntent: z30.string().optional().describe(
25856
+ "Brief description of what you intend to accomplish with this tool call"
25857
+ ),
25858
+ connectionId: z30.string().describe("ID of the Amplitude connection to use"),
25859
+ method: z30.enum(["GET", "POST"]).describe(
25860
+ "HTTP method. GET for most read endpoints (events/list, export, usersearch, useractivity). POST is rarely needed."
25861
+ ),
25862
+ url: z30.string().describe(
25863
+ "Full URL including query parameters (e.g., 'https://amplitude.com/api/2/events/list', 'https://amplitude.com/api/2/export?start=20240101T00&end=20240102T00')"
25864
+ ),
25865
+ body: z30.record(z30.string(), z30.unknown()).optional().describe("Request body (JSON) for POST requests")
25866
+ });
25867
+ var outputSchema30 = z30.discriminatedUnion("success", [
25868
+ z30.object({
25869
+ success: z30.literal(true),
25870
+ status: z30.number(),
25871
+ data: z30.record(z30.string(), z30.unknown())
25872
+ }),
25873
+ z30.object({
25874
+ success: z30.literal(false),
25875
+ error: z30.string()
25876
+ })
25877
+ ]);
25878
+ var requestTool13 = new ConnectorTool({
25879
+ name: "request",
25880
+ description: `Send authenticated requests to the Amplitude REST API.
25881
+ Authentication is handled automatically using Basic auth (API Key + Secret Key).
25882
+ Provide the full URL including any query parameters.
25883
+ Base URL by region: US \u2192 https://amplitude.com, EU \u2192 https://analytics.eu.amplitude.com. Check the connection's region parameter to determine which base URL to use.
25884
+
25885
+ Recommended endpoints (available on all plans):
25886
+ - GET {baseUrl}/api/2/events/list \u2014 list event types
25887
+ - GET {baseUrl}/api/2/export?start=YYYYMMDDTHH&end=YYYYMMDDTHH \u2014 export raw events
25888
+ - GET {baseUrl}/api/2/usersearch?user=QUERY \u2014 search users
25889
+ - GET {baseUrl}/api/2/useractivity?user=AMPLITUDE_ID \u2014 user activity
25890
+
25891
+ IMPORTANT: Dashboard REST API endpoints (events/segmentation, funnels, retention, revenue, etc.) require a paid Growth or Enterprise plan and will return 403 Forbidden on free plans. Always try the Export API first and aggregate data in code.`,
25892
+ inputSchema: inputSchema30,
25893
+ outputSchema: outputSchema30,
25894
+ async execute({ connectionId, method, url, body }, connections) {
25895
+ const connection = connections.find((c) => c.id === connectionId);
25896
+ if (!connection) {
25897
+ return {
25898
+ success: false,
25899
+ error: `Connection ${connectionId} not found`
25900
+ };
25901
+ }
25902
+ console.log(
25903
+ `[connector-request] amplitude/${connection.name}: ${method} ${url}`
25904
+ );
25905
+ try {
25906
+ const apiKey = parameters26.apiKey.getValue(connection);
25907
+ const secretKey = parameters26.secretKey.getValue(connection);
25908
+ const authToken = btoa(`${apiKey}:${secretKey}`);
25909
+ const controller = new AbortController();
25910
+ const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS19);
25911
+ try {
25912
+ const response = await fetch(url, {
25913
+ method,
25914
+ headers: {
25915
+ Authorization: `Basic ${authToken}`,
25916
+ "Content-Type": "application/json"
25917
+ },
25918
+ body: body ? JSON.stringify(body) : void 0,
25919
+ signal: controller.signal
25920
+ });
25921
+ const data = await response.json();
25922
+ if (!response.ok) {
25923
+ const errorMessage = typeof data?.error === "string" ? data.error : typeof data?.message === "string" ? data.message : `HTTP ${response.status} ${response.statusText}`;
25924
+ return { success: false, error: errorMessage };
25925
+ }
25926
+ return { success: true, status: response.status, data };
25927
+ } finally {
25928
+ clearTimeout(timeout);
25929
+ }
25930
+ } catch (err) {
25931
+ const msg = err instanceof Error ? err.message : String(err);
25932
+ return { success: false, error: msg };
25933
+ }
25934
+ }
25935
+ });
25936
+
25937
+ // ../connectors/src/connectors/amplitude/index.ts
25938
+ var tools26 = { request: requestTool13 };
25939
+ var amplitudeConnector = new ConnectorPlugin({
25940
+ slug: "amplitude",
25941
+ authType: null,
25942
+ name: "Amplitude",
25943
+ description: "Connect to Amplitude for product analytics and user behavior data.",
25944
+ iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/2UBJSdRlFJaLq52WUCTBEB/308b59b374cf6c662ac70989860bffd7/amplitude-icon.svg",
25945
+ parameters: parameters26,
25517
25946
  releaseFlag: { dev1: true, dev2: false, prod: false },
25947
+ onboarding: amplitudeOnboarding,
25518
25948
  systemPrompt: {
25519
- en: `### Amplitude SDK (TypeScript handler)
25520
- Use the Amplitude connector via the SDK in TypeScript handlers:
25949
+ en: `### Tools
25950
+
25951
+ - \`amplitude_request\`: The only way to call the Amplitude REST API. Use it for event segmentation, listing event types, user search, user activity, and data export. Authentication (Basic auth with API Key + Secret Key) is configured automatically. Provide the full URL including query parameters \u2014 the base URL varies by endpoint.
25952
+
25953
+ ### Business Logic
25954
+
25955
+ The business logic type for this connector is "typescript". Use the connector SDK in your handler. Do NOT read credentials from environment variables.
25956
+
25957
+ SDK methods (client created via \`connection(connectionId)\`):
25958
+ - \`client.request(url, init?)\` \u2014 low-level authenticated fetch (provide full URL)
25959
+ - \`client.listEventTypes()\` \u2014 list all event types
25960
+ - \`client.eventSegmentation(options)\` \u2014 run event segmentation query (e, start, end, m?, i?, g?)
25961
+ - \`client.userSearch(query)\` \u2014 search users by user or amplitude ID
25962
+ - \`client.userActivity(amplitudeId, options?)\` \u2014 get user activity by amplitude ID
25521
25963
 
25522
25964
  \`\`\`ts
25965
+ import type { Context } from "hono";
25523
25966
  import { connection } from "@squadbase/vite-server/connectors/amplitude";
25524
25967
 
25525
- const { apiKey, secretKey } = connection("<connectionId>");
25968
+ const amp = connection("<connectionId>");
25526
25969
 
25527
- // Use the Amplitude REST API with Basic auth (apiKey:secretKey)
25528
- const res = await fetch("https://amplitude.com/api/2/events/segmentation", {
25529
- headers: {
25530
- Authorization: "Basic " + btoa(apiKey + ":" + secretKey),
25531
- },
25532
- });
25533
- const data = await res.json();
25970
+ export default async function handler(c: Context) {
25971
+ const { eventType, start, end } = await c.req.json<{
25972
+ eventType: string;
25973
+ start: string;
25974
+ end: string;
25975
+ }>();
25976
+
25977
+ const result = await amp.eventSegmentation({
25978
+ e: { event_type: eventType },
25979
+ start,
25980
+ end,
25981
+ });
25982
+
25983
+ return c.json(result);
25984
+ }
25534
25985
  \`\`\`
25535
25986
 
25536
- ### Common Endpoints
25537
- - GET \`https://amplitude.com/api/2/events/segmentation\` \u2014 Event segmentation
25987
+ ### Amplitude REST API Reference
25988
+
25989
+ - Authentication: Basic auth (API Key:Secret Key, handled automatically)
25990
+ - All timestamps use YYYYMMDD format for date parameters
25991
+
25992
+ #### Endpoints Available on All Plans
25538
25993
  - GET \`https://amplitude.com/api/2/events/list\` \u2014 List event types
25539
- - GET \`https://amplitude.com/api/2/usersearch\` \u2014 Search users
25540
- - GET \`https://amplitude.com/api/2/useractivity\` \u2014 User activity
25541
- - POST \`https://amplitude.com/api/2/export\` \u2014 Export raw events`,
25542
- ja: `### Amplitude SDK\uFF08TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\uFF09
25543
- TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\u3067Amplitude\u30B3\u30CD\u30AF\u30BF\u30FC\u3092SDK\u7D4C\u7531\u3067\u4F7F\u7528\u3057\u307E\u3059\uFF1A
25994
+ - GET \`https://amplitude.com/api/2/export?start=YYYYMMDDTHH&end=YYYYMMDDTHH\` \u2014 Export raw events
25995
+ - GET \`https://amplitude.com/api/2/usersearch?user=QUERY\` \u2014 Search users
25996
+ - GET \`https://amplitude.com/api/2/useractivity?user=AMPLITUDE_ID\` \u2014 User activity
25997
+
25998
+ #### Endpoints Requiring Growth or Enterprise Plan (will return 403 on free/Starter plans)
25999
+ - GET \`https://amplitude.com/api/2/events/segmentation\` \u2014 Event segmentation
26000
+ - GET \`https://amplitude.com/api/2/funnels\` \u2014 Funnel analysis
26001
+ - GET \`https://amplitude.com/api/2/retention\` \u2014 Retention analysis
26002
+ - GET \`https://amplitude.com/api/2/revenue\` \u2014 Revenue analysis
26003
+
26004
+ IMPORTANT: Always start with the endpoints available on all plans. If you need aggregated analytics, use the Export API to retrieve raw events and aggregate in code. Only attempt the Dashboard REST API endpoints (segmentation, funnels, retention, revenue) if specifically requested, and handle 403 errors gracefully by falling back to the Export API.
26005
+
26006
+ #### Event Segmentation Query Parameters (Growth/Enterprise only)
26007
+ - \`e\` \u2014 JSON-encoded event definition (e.g., \`{"event_type":"Click"}\`)
26008
+ - \`start\` \u2014 Start date (YYYYMMDD)
26009
+ - \`end\` \u2014 End date (YYYYMMDD)
26010
+ - \`m\` \u2014 Metric type (uniques, totals, avg, etc.)
26011
+ - \`i\` \u2014 Interval (1=daily, 7=weekly, 30=monthly)
26012
+ - \`g\` \u2014 Group by property`,
26013
+ ja: `### \u30C4\u30FC\u30EB
26014
+
26015
+ - \`amplitude_request\`: Amplitude REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30A4\u30D9\u30F3\u30C8\u30BB\u30B0\u30E1\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3\u3001\u30A4\u30D9\u30F3\u30C8\u30BF\u30A4\u30D7\u4E00\u89A7\u3001\u30E6\u30FC\u30B6\u30FC\u691C\u7D22\u3001\u30E6\u30FC\u30B6\u30FC\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3\u3001\u30C7\u30FC\u30BF\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08API Key + Secret Key\u306B\u3088\u308BBasic\u8A8D\u8A3C\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\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\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u306B\u3088\u3063\u3066\u7570\u306A\u308A\u307E\u3059\u3002
26016
+
26017
+ ### Business Logic
26018
+
26019
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
26020
+
26021
+ SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
26022
+ - \`client.request(url, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch\uFF08\u5B8C\u5168\u306AURL\u3092\u6307\u5B9A\uFF09
26023
+ - \`client.listEventTypes()\` \u2014 \u5168\u30A4\u30D9\u30F3\u30C8\u30BF\u30A4\u30D7\u306E\u4E00\u89A7
26024
+ - \`client.eventSegmentation(options)\` \u2014 \u30A4\u30D9\u30F3\u30C8\u30BB\u30B0\u30E1\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3\u30AF\u30A8\u30EA\u306E\u5B9F\u884C\uFF08e, start, end, m?, i?, g?\uFF09
26025
+ - \`client.userSearch(query)\` \u2014 \u30E6\u30FC\u30B6\u30FC\u307E\u305F\u306Famplitude ID\u3067\u30E6\u30FC\u30B6\u30FC\u3092\u691C\u7D22
26026
+ - \`client.userActivity(amplitudeId, options?)\` \u2014 amplitude ID\u3067\u30E6\u30FC\u30B6\u30FC\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3\u3092\u53D6\u5F97
25544
26027
 
25545
26028
  \`\`\`ts
26029
+ import type { Context } from "hono";
25546
26030
  import { connection } from "@squadbase/vite-server/connectors/amplitude";
25547
26031
 
25548
- const { apiKey, secretKey } = connection("<connectionId>");
26032
+ const amp = connection("<connectionId>");
25549
26033
 
25550
- // Amplitude REST API\u3092Basic\u8A8D\u8A3C\uFF08apiKey:secretKey\uFF09\u3067\u4F7F\u7528
25551
- const res = await fetch("https://amplitude.com/api/2/events/segmentation", {
25552
- headers: {
25553
- Authorization: "Basic " + btoa(apiKey + ":" + secretKey),
25554
- },
25555
- });
25556
- const data = await res.json();
26034
+ export default async function handler(c: Context) {
26035
+ const { eventType, start, end } = await c.req.json<{
26036
+ eventType: string;
26037
+ start: string;
26038
+ end: string;
26039
+ }>();
26040
+
26041
+ const result = await amp.eventSegmentation({
26042
+ e: { event_type: eventType },
26043
+ start,
26044
+ end,
26045
+ });
26046
+
26047
+ return c.json(result);
26048
+ }
25557
26049
  \`\`\`
25558
26050
 
25559
- ### \u4E3B\u8981\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
25560
- - GET \`https://amplitude.com/api/2/events/segmentation\` \u2014 \u30A4\u30D9\u30F3\u30C8\u30BB\u30B0\u30E1\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3
26051
+ ### Amplitude REST API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
26052
+
26053
+ - \u8A8D\u8A3C: Basic\u8A8D\u8A3C\uFF08API Key:Secret Key\u3001\u81EA\u52D5\u8A2D\u5B9A\uFF09
26054
+ - \u65E5\u4ED8\u30D1\u30E9\u30E1\u30FC\u30BF\u306F\u3059\u3079\u3066YYYYMMDD\u5F62\u5F0F\u306E\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u3092\u4F7F\u7528
26055
+
26056
+ #### \u5168\u30D7\u30E9\u30F3\u3067\u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
25561
26057
  - GET \`https://amplitude.com/api/2/events/list\` \u2014 \u30A4\u30D9\u30F3\u30C8\u30BF\u30A4\u30D7\u4E00\u89A7
25562
- - GET \`https://amplitude.com/api/2/usersearch\` \u2014 \u30E6\u30FC\u30B6\u30FC\u691C\u7D22
25563
- - GET \`https://amplitude.com/api/2/useractivity\` \u2014 \u30E6\u30FC\u30B6\u30FC\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3
25564
- - POST \`https://amplitude.com/api/2/export\` \u2014 \u751F\u30A4\u30D9\u30F3\u30C8\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8`
26058
+ - GET \`https://amplitude.com/api/2/export?start=YYYYMMDDTHH&end=YYYYMMDDTHH\` \u2014 \u751F\u30A4\u30D9\u30F3\u30C8\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8
26059
+ - GET \`https://amplitude.com/api/2/usersearch?user=QUERY\` \u2014 \u30E6\u30FC\u30B6\u30FC\u691C\u7D22
26060
+ - GET \`https://amplitude.com/api/2/useractivity?user=AMPLITUDE_ID\` \u2014 \u30E6\u30FC\u30B6\u30FC\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3
26061
+
26062
+ #### Growth\u307E\u305F\u306FEnterprise\u30D7\u30E9\u30F3\u304C\u5FC5\u8981\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08\u7121\u6599/Starter\u30D7\u30E9\u30F3\u3067\u306F403\u30A8\u30E9\u30FC\uFF09
26063
+ - GET \`https://amplitude.com/api/2/events/segmentation\` \u2014 \u30A4\u30D9\u30F3\u30C8\u30BB\u30B0\u30E1\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3
26064
+ - GET \`https://amplitude.com/api/2/funnels\` \u2014 \u30D5\u30A1\u30CD\u30EB\u5206\u6790
26065
+ - GET \`https://amplitude.com/api/2/retention\` \u2014 \u30EA\u30C6\u30F3\u30B7\u30E7\u30F3\u5206\u6790
26066
+ - GET \`https://amplitude.com/api/2/revenue\` \u2014 \u53CE\u76CA\u5206\u6790
26067
+
26068
+ \u91CD\u8981: \u307E\u305A\u5168\u30D7\u30E9\u30F3\u3067\u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u96C6\u8A08\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\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002Dashboard REST API\uFF08segmentation\u3001funnels\u3001retention\u3001revenue\uFF09\u306F\u660E\u793A\u7684\u306B\u8981\u6C42\u3055\u308C\u305F\u5834\u5408\u306E\u307F\u8A66\u884C\u3057\u3001403\u30A8\u30E9\u30FC\u304C\u8FD4\u3055\u308C\u305F\u5834\u5408\u306FExport API\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002
26069
+
26070
+ #### \u30A4\u30D9\u30F3\u30C8\u30BB\u30B0\u30E1\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\uFF08Growth/Enterprise\u30D7\u30E9\u30F3\u306E\u307F\uFF09
26071
+ - \`e\` \u2014 JSON\u30A8\u30F3\u30B3\u30FC\u30C9\u3055\u308C\u305F\u30A4\u30D9\u30F3\u30C8\u5B9A\u7FA9\uFF08\u4F8B: \`{"event_type":"Click"}\`\uFF09
26072
+ - \`start\` \u2014 \u958B\u59CB\u65E5\uFF08YYYYMMDD\uFF09
26073
+ - \`end\` \u2014 \u7D42\u4E86\u65E5\uFF08YYYYMMDD\uFF09
26074
+ - \`m\` \u2014 \u30E1\u30C8\u30EA\u30AF\u30B9\u30BF\u30A4\u30D7\uFF08uniques, totals, avg\u306A\u3069\uFF09
26075
+ - \`i\` \u2014 \u30A4\u30F3\u30BF\u30FC\u30D0\u30EB\uFF081=\u65E5\u6B21\u30017=\u9031\u6B21\u300130=\u6708\u6B21\uFF09
26076
+ - \`g\` \u2014 \u30B0\u30EB\u30FC\u30D7\u5316\u30D7\u30ED\u30D1\u30C6\u30A3`
25565
26077
  },
25566
26078
  tools: tools26
25567
26079
  });
25568
26080
 
26081
+ // ../connectors/src/connectors/attio/setup.ts
26082
+ var attioOnboarding = new ConnectorOnboarding({
26083
+ dataOverviewInstructions: {
26084
+ en: `1. Call attio_request with GET /objects to list all available objects (people, companies, deals, etc.)
26085
+ 2. Call attio_request with GET /objects/people/attributes to explore the people object attributes
26086
+ 3. Call attio_request with POST /objects/people/records/query with { "limit": 5 } to sample people records
26087
+ 4. Explore other objects (companies, deals) as needed`,
26088
+ ja: `1. attio_request \u3067 GET /objects \u3092\u547C\u3073\u51FA\u3057\u3001\u5229\u7528\u53EF\u80FD\u306A\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97\uFF08people\u3001companies\u3001deals\u306A\u3069\uFF09
26089
+ 2. attio_request \u3067 GET /objects/people/attributes \u3092\u547C\u3073\u51FA\u3057\u3001people\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u5C5E\u6027\u3092\u78BA\u8A8D
26090
+ 3. attio_request \u3067 POST /objects/people/records/query \u3092 { "limit": 5 } \u3067\u547C\u3073\u51FA\u3057\u3001people\u30EC\u30B3\u30FC\u30C9\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0
26091
+ 4. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u4ED6\u306E\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\uFF08companies\u3001deals\uFF09\u3092\u63A2\u7D22`
26092
+ }
26093
+ });
26094
+
25569
26095
  // ../connectors/src/connectors/attio/parameters.ts
25570
26096
  var parameters27 = {
25571
26097
  apiKey: new ParameterDefinition({
@@ -25579,8 +26105,86 @@ var parameters27 = {
25579
26105
  })
25580
26106
  };
25581
26107
 
26108
+ // ../connectors/src/connectors/attio/tools/request.ts
26109
+ import { z as z31 } from "zod";
26110
+ var BASE_URL11 = "https://api.attio.com/v2";
26111
+ var REQUEST_TIMEOUT_MS20 = 6e4;
26112
+ var inputSchema31 = z31.object({
26113
+ toolUseIntent: z31.string().optional().describe(
26114
+ "Brief description of what you intend to accomplish with this tool call"
26115
+ ),
26116
+ connectionId: z31.string().describe("ID of the Attio connection to use"),
26117
+ method: z31.enum(["GET", "POST", "PATCH", "DELETE"]).describe(
26118
+ "HTTP method. GET for reading resources, POST for creating or querying records, PATCH for updating, DELETE for removing."
26119
+ ),
26120
+ path: z31.string().describe(
26121
+ "API path (e.g., '/objects', '/objects/people/records/query', '/objects/companies/records/{record_id}')"
26122
+ ),
26123
+ body: z31.record(z31.string(), z31.unknown()).optional().describe("Request body (JSON) for POST/PATCH requests")
26124
+ });
26125
+ var outputSchema31 = z31.discriminatedUnion("success", [
26126
+ z31.object({
26127
+ success: z31.literal(true),
26128
+ status: z31.number(),
26129
+ data: z31.record(z31.string(), z31.unknown())
26130
+ }),
26131
+ z31.object({
26132
+ success: z31.literal(false),
26133
+ error: z31.string()
26134
+ })
26135
+ ]);
26136
+ var requestTool14 = new ConnectorTool({
26137
+ name: "request",
26138
+ description: `Send authenticated requests to the Attio REST API.
26139
+ Authentication is handled automatically using the API Key (Bearer token).
26140
+ Use this tool for all Attio API interactions: querying records (people, companies, deals), listing objects and attributes, managing list entries, and working with notes.
26141
+ Note that querying records uses POST (not GET) with a request body for filters.`,
26142
+ inputSchema: inputSchema31,
26143
+ outputSchema: outputSchema31,
26144
+ async execute({ connectionId, method, path: path5, body }, connections) {
26145
+ const connection = connections.find((c) => c.id === connectionId);
26146
+ if (!connection) {
26147
+ return {
26148
+ success: false,
26149
+ error: `Connection ${connectionId} not found`
26150
+ };
26151
+ }
26152
+ console.log(
26153
+ `[connector-request] attio/${connection.name}: ${method} ${path5}`
26154
+ );
26155
+ try {
26156
+ const apiKey = parameters27.apiKey.getValue(connection);
26157
+ const url = `${BASE_URL11}${path5}`;
26158
+ const controller = new AbortController();
26159
+ const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS20);
26160
+ try {
26161
+ const response = await fetch(url, {
26162
+ method,
26163
+ headers: {
26164
+ Authorization: `Bearer ${apiKey}`,
26165
+ "Content-Type": "application/json"
26166
+ },
26167
+ body: body ? JSON.stringify(body) : void 0,
26168
+ signal: controller.signal
26169
+ });
26170
+ const data = await response.json();
26171
+ if (!response.ok) {
26172
+ const errorMessage = typeof data?.message === "string" ? data.message : typeof data?.error === "string" ? data.error : `HTTP ${response.status} ${response.statusText}`;
26173
+ return { success: false, error: errorMessage };
26174
+ }
26175
+ return { success: true, status: response.status, data };
26176
+ } finally {
26177
+ clearTimeout(timeout);
26178
+ }
26179
+ } catch (err) {
26180
+ const msg = err instanceof Error ? err.message : String(err);
26181
+ return { success: false, error: msg };
26182
+ }
26183
+ }
26184
+ });
26185
+
25582
26186
  // ../connectors/src/connectors/attio/index.ts
25583
- var tools27 = {};
26187
+ var tools27 = { request: requestTool14 };
25584
26188
  var attioConnector = new ConnectorPlugin({
25585
26189
  slug: "attio",
25586
26190
  authType: null,
@@ -25589,97 +26193,275 @@ var attioConnector = new ConnectorPlugin({
25589
26193
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/2qqx99vvXJojUM3tSrSWPX/1e7c35e13da6b365b8b475c1effe568f/attio.svg",
25590
26194
  parameters: parameters27,
25591
26195
  releaseFlag: { dev1: true, dev2: false, prod: false },
26196
+ onboarding: attioOnboarding,
25592
26197
  systemPrompt: {
25593
- en: `### Attio SDK (TypeScript handler)
25594
- Use the Attio connector via the SDK in TypeScript handlers:
26198
+ en: `### Tools
26199
+
26200
+ - \`attio_request\`: The only way to call the Attio REST API. Use it to query records (people, companies, deals), list objects and attributes, manage list entries, and work with notes. Authentication (Bearer token) is configured automatically. Note that querying records uses POST (not GET) with a request body containing filters.
26201
+
26202
+ ### Business Logic
26203
+
26204
+ The business logic type for this connector is "typescript". Use the connector SDK in your handler. Do NOT read credentials from environment variables.
26205
+
26206
+ SDK methods (client created via \`connection(connectionId)\`):
26207
+ - \`client.request(path, init?)\` \u2014 low-level authenticated fetch
26208
+ - \`client.listObjects()\` \u2014 list all objects (people, companies, deals, etc.)
26209
+ - \`client.listAttributes(object)\` \u2014 list attributes for an object
26210
+ - \`client.queryRecords(object, options?)\` \u2014 query records with filter/sort/pagination
26211
+ - \`client.getRecord(object, recordId)\` \u2014 fetch a single record
26212
+ - \`client.queryListEntries(listId, options?)\` \u2014 query list entries with filter/sort/pagination
25595
26213
 
25596
26214
  \`\`\`ts
26215
+ import type { Context } from "hono";
25597
26216
  import { connection } from "@squadbase/vite-server/connectors/attio";
25598
26217
 
25599
- const { apiKey } = connection("<connectionId>");
26218
+ const attio = connection("<connectionId>");
25600
26219
 
25601
- // Use the Attio REST API
25602
- const res = await fetch("https://api.attio.com/v2/objects/people/records/query", {
25603
- method: "POST",
25604
- headers: {
25605
- Authorization: "Bearer " + apiKey,
25606
- "Content-Type": "application/json",
25607
- },
25608
- body: JSON.stringify({ limit: 25 }),
25609
- });
25610
- const data = await res.json();
26220
+ export default async function handler(c: Context) {
26221
+ const { object = "people", limit = 25 } = await c.req.json<{
26222
+ object?: string;
26223
+ limit?: number;
26224
+ }>();
26225
+
26226
+ const { data } = await attio.queryRecords(object, { limit });
26227
+
26228
+ return c.json({ records: data });
26229
+ }
25611
26230
  \`\`\`
25612
26231
 
25613
- ### Common Endpoints (Base URL: https://api.attio.com/v2)
26232
+ ### Attio REST API Reference
26233
+
26234
+ - Base URL: \`https://api.attio.com/v2\`
26235
+ - Authentication: Bearer token (handled automatically)
26236
+ - Querying records uses POST with JSON body (not GET with query params)
26237
+
26238
+ #### Common Endpoints
26239
+ - GET \`/objects\` \u2014 List all objects
26240
+ - GET \`/objects/{object}/attributes\` \u2014 List attributes of an object
25614
26241
  - POST \`/objects/{object}/records/query\` \u2014 Query records (people, companies, deals, etc.)
25615
26242
  - GET \`/objects/{object}/records/{record_id}\` \u2014 Get a record
25616
26243
  - POST \`/objects/{object}/records\` \u2014 Create a record
25617
26244
  - PATCH \`/objects/{object}/records/{record_id}\` \u2014 Update a record
25618
26245
  - DELETE \`/objects/{object}/records/{record_id}\` \u2014 Delete a record
25619
- - GET \`/objects\` \u2014 List all objects
25620
- - GET \`/objects/{object}/attributes\` \u2014 List attributes of an object
25621
26246
  - POST \`/lists/{list_id}/entries/query\` \u2014 Query list entries
25622
26247
  - POST \`/notes\` \u2014 Create a note
25623
- - GET \`/notes?parent_object={object}&parent_record_id={id}\` \u2014 Get notes for a record`,
25624
- ja: `### Attio SDK\uFF08TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\uFF09
25625
- TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\u3067Attio\u30B3\u30CD\u30AF\u30BF\u30FC\u3092SDK\u7D4C\u7531\u3067\u4F7F\u7528\u3057\u307E\u3059\uFF1A
26248
+ - GET \`/notes?parent_object={object}&parent_record_id={id}\` \u2014 Get notes for a record
26249
+
26250
+ #### Query Body (for POST /objects/{object}/records/query)
26251
+ - \`filter\` \u2014 Filter conditions
26252
+ - \`sorts\` \u2014 Array of sort specifications
26253
+ - \`limit\` \u2014 Max records per page (default 25)
26254
+ - \`offset\` \u2014 Pagination offset`,
26255
+ ja: `### \u30C4\u30FC\u30EB
26256
+
26257
+ - \`attio_request\`: Attio REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30EC\u30B3\u30FC\u30C9\uFF08people\u3001companies\u3001deals\uFF09\u306E\u30AF\u30A8\u30EA\u3001\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3084\u5C5E\u6027\u306E\u4E00\u89A7\u8868\u793A\u3001\u30EA\u30B9\u30C8\u30A8\u30F3\u30C8\u30EA\u306E\u7BA1\u7406\u3001\u30CE\u30FC\u30C8\u306E\u64CD\u4F5C\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Bearer\u30C8\u30FC\u30AF\u30F3\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u30EC\u30B3\u30FC\u30C9\u306E\u30AF\u30A8\u30EA\u306B\u306FGET\u3067\u306F\u306A\u304FPOST\u3092\u30D5\u30A3\u30EB\u30BF\u4ED8\u304D\u306E\u30EA\u30AF\u30A8\u30B9\u30C8\u30DC\u30C7\u30A3\u3067\u4F7F\u7528\u3059\u308B\u70B9\u306B\u6CE8\u610F\u3057\u3066\u304F\u3060\u3055\u3044\u3002
26258
+
26259
+ ### Business Logic
26260
+
26261
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
26262
+
26263
+ SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
26264
+ - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
26265
+ - \`client.listObjects()\` \u2014 \u5168\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u4E00\u89A7\uFF08people\u3001companies\u3001deals\u306A\u3069\uFF09
26266
+ - \`client.listAttributes(object)\` \u2014 \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u5C5E\u6027\u4E00\u89A7
26267
+ - \`client.queryRecords(object, options?)\` \u2014 \u30D5\u30A3\u30EB\u30BF/\u30BD\u30FC\u30C8/\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u4ED8\u304D\u3067\u30EC\u30B3\u30FC\u30C9\u3092\u30AF\u30A8\u30EA
26268
+ - \`client.getRecord(object, recordId)\` \u2014 \u5358\u4E00\u30EC\u30B3\u30FC\u30C9\u3092\u53D6\u5F97
26269
+ - \`client.queryListEntries(listId, options?)\` \u2014 \u30D5\u30A3\u30EB\u30BF/\u30BD\u30FC\u30C8/\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u4ED8\u304D\u3067\u30EA\u30B9\u30C8\u30A8\u30F3\u30C8\u30EA\u3092\u30AF\u30A8\u30EA
25626
26270
 
25627
26271
  \`\`\`ts
26272
+ import type { Context } from "hono";
25628
26273
  import { connection } from "@squadbase/vite-server/connectors/attio";
25629
26274
 
25630
- const { apiKey } = connection("<connectionId>");
26275
+ const attio = connection("<connectionId>");
25631
26276
 
25632
- // Attio REST API\u3092\u4F7F\u7528
25633
- const res = await fetch("https://api.attio.com/v2/objects/people/records/query", {
25634
- method: "POST",
25635
- headers: {
25636
- Authorization: "Bearer " + apiKey,
25637
- "Content-Type": "application/json",
25638
- },
25639
- body: JSON.stringify({ limit: 25 }),
25640
- });
25641
- const data = await res.json();
26277
+ export default async function handler(c: Context) {
26278
+ const { object = "people", limit = 25 } = await c.req.json<{
26279
+ object?: string;
26280
+ limit?: number;
26281
+ }>();
26282
+
26283
+ const { data } = await attio.queryRecords(object, { limit });
26284
+
26285
+ return c.json({ records: data });
26286
+ }
25642
26287
  \`\`\`
25643
26288
 
25644
- ### \u4E3B\u8981\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08\u30D9\u30FC\u30B9URL: https://api.attio.com/v2\uFF09
26289
+ ### Attio REST API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
26290
+
26291
+ - \u30D9\u30FC\u30B9URL: \`https://api.attio.com/v2\`
26292
+ - \u8A8D\u8A3C: Bearer\u30C8\u30FC\u30AF\u30F3\uFF08\u81EA\u52D5\u8A2D\u5B9A\uFF09
26293
+ - \u30EC\u30B3\u30FC\u30C9\u306E\u30AF\u30A8\u30EA\u306B\u306FGET\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u3067\u306F\u306A\u304FPOST\u3067JSON\u30DC\u30C7\u30A3\u3092\u4F7F\u7528\u3057\u307E\u3059
26294
+
26295
+ #### \u4E3B\u8981\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
26296
+ - GET \`/objects\` \u2014 \u5168\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u4E00\u89A7
26297
+ - GET \`/objects/{object}/attributes\` \u2014 \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u5C5E\u6027\u4E00\u89A7
25645
26298
  - POST \`/objects/{object}/records/query\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u691C\u7D22\uFF08people\u3001companies\u3001deals\u306A\u3069\uFF09
25646
26299
  - GET \`/objects/{object}/records/{record_id}\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u53D6\u5F97
25647
26300
  - POST \`/objects/{object}/records\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u4F5C\u6210
25648
26301
  - PATCH \`/objects/{object}/records/{record_id}\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u66F4\u65B0
25649
26302
  - DELETE \`/objects/{object}/records/{record_id}\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u524A\u9664
25650
- - GET \`/objects\` \u2014 \u5168\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u4E00\u89A7
25651
- - GET \`/objects/{object}/attributes\` \u2014 \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u5C5E\u6027\u4E00\u89A7
25652
26303
  - POST \`/lists/{list_id}/entries/query\` \u2014 \u30EA\u30B9\u30C8\u30A8\u30F3\u30C8\u30EA\u306E\u691C\u7D22
25653
26304
  - POST \`/notes\` \u2014 \u30CE\u30FC\u30C8\u306E\u4F5C\u6210
25654
- - GET \`/notes?parent_object={object}&parent_record_id={id}\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u30CE\u30FC\u30C8\u3092\u53D6\u5F97`
26305
+ - GET \`/notes?parent_object={object}&parent_record_id={id}\` \u2014 \u30EC\u30B3\u30FC\u30C9\u306E\u30CE\u30FC\u30C8\u3092\u53D6\u5F97
26306
+
26307
+ #### \u30AF\u30A8\u30EA\u30DC\u30C7\u30A3 (POST /objects/{object}/records/query)
26308
+ - \`filter\` \u2014 \u30D5\u30A3\u30EB\u30BF\u6761\u4EF6
26309
+ - \`sorts\` \u2014 \u30BD\u30FC\u30C8\u6307\u5B9A\u306E\u914D\u5217
26310
+ - \`limit\` \u2014 \u30DA\u30FC\u30B8\u3042\u305F\u308A\u306E\u6700\u5927\u30EC\u30B3\u30FC\u30C9\u6570\uFF08\u30C7\u30D5\u30A9\u30EB\u30C825\uFF09
26311
+ - \`offset\` \u2014 \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u30AA\u30D5\u30BB\u30C3\u30C8`
25655
26312
  },
25656
26313
  tools: tools27
25657
26314
  });
25658
26315
 
25659
- // ../connectors/src/connectors/shopify/parameters.ts
25660
- var parameters28 = {
25661
- accessToken: new ParameterDefinition({
25662
- slug: "access-token",
25663
- name: "Shopify Admin API Access Token",
25664
- description: "The Shopify Admin API access token for authentication (starts with shpat_).",
25665
- envVarBaseKey: "SHOPIFY_ACCESS_TOKEN",
25666
- type: "text",
25667
- secret: true,
25668
- required: true
25669
- }),
25670
- storeDomain: new ParameterDefinition({
25671
- slug: "store-domain",
25672
- name: "Shopify Store Domain",
25673
- description: "Your Shopify store domain (e.g., mystore.myshopify.com).",
25674
- envVarBaseKey: "SHOPIFY_STORE_DOMAIN",
25675
- type: "text",
25676
- secret: false,
25677
- required: true
25678
- })
25679
- };
25680
-
26316
+ // ../connectors/src/connectors/shopify/setup.ts
26317
+ var shopifyOnboarding = new ConnectorOnboarding({
26318
+ dataOverviewInstructions: {
26319
+ en: `1. Call shopify_request with GET /admin/api/2024-10/products.json?limit=5 to explore products structure
26320
+ 2. Call shopify_request with GET /admin/api/2024-10/orders.json?limit=5&status=any to explore orders structure
26321
+ 3. Explore other endpoints (customers, inventory, collections) as needed`,
26322
+ ja: `1. shopify_request \u3067 GET /admin/api/2024-10/products.json?limit=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u5546\u54C1\u306E\u69CB\u9020\u3092\u78BA\u8A8D
26323
+ 2. shopify_request \u3067 GET /admin/api/2024-10/orders.json?limit=5&status=any \u3092\u547C\u3073\u51FA\u3057\u3001\u6CE8\u6587\u306E\u69CB\u9020\u3092\u78BA\u8A8D
26324
+ 3. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u4ED6\u306E\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08\u9867\u5BA2\u3001\u5728\u5EAB\u3001\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\uFF09\u3092\u63A2\u7D22`
26325
+ }
26326
+ });
26327
+
26328
+ // ../connectors/src/connectors/shopify/parameters.ts
26329
+ var parameters28 = {
26330
+ storeDomain: new ParameterDefinition({
26331
+ slug: "store-domain",
26332
+ name: "Shop Name",
26333
+ description: 'Your Shopify store name (the subdomain part of your .myshopify.com URL, e.g., "mystore" for mystore.myshopify.com).',
26334
+ envVarBaseKey: "SHOPIFY_STORE_DOMAIN",
26335
+ type: "text",
26336
+ secret: false,
26337
+ required: true
26338
+ }),
26339
+ clientId: new ParameterDefinition({
26340
+ slug: "client-id",
26341
+ name: "Client ID",
26342
+ description: "The Client ID (API Key) of your Shopify Custom App.",
26343
+ envVarBaseKey: "SHOPIFY_CLIENT_ID",
26344
+ type: "text",
26345
+ secret: false,
26346
+ required: true
26347
+ }),
26348
+ clientSecret: new ParameterDefinition({
26349
+ slug: "client-secret",
26350
+ name: "Client Secret",
26351
+ description: "The Client Secret (API Secret Key) of your Shopify Custom App.",
26352
+ envVarBaseKey: "SHOPIFY_CLIENT_SECRET",
26353
+ type: "text",
26354
+ secret: true,
26355
+ required: true
26356
+ })
26357
+ };
26358
+
26359
+ // ../connectors/src/connectors/shopify/tools/request.ts
26360
+ import { z as z32 } from "zod";
26361
+ var REQUEST_TIMEOUT_MS21 = 6e4;
26362
+ var inputSchema32 = z32.object({
26363
+ toolUseIntent: z32.string().optional().describe(
26364
+ "Brief description of what you intend to accomplish with this tool call"
26365
+ ),
26366
+ connectionId: z32.string().describe("ID of the Shopify connection to use"),
26367
+ method: z32.enum(["GET", "POST", "PUT", "DELETE"]).describe(
26368
+ "HTTP method. GET for reading resources (products, orders, customers), POST for creating, PUT for updating, DELETE for removing."
26369
+ ),
26370
+ path: z32.string().describe(
26371
+ "API path including version (e.g., '/admin/api/2024-10/products.json', '/admin/api/2024-10/orders.json?limit=50')"
26372
+ ),
26373
+ body: z32.record(z32.string(), z32.unknown()).optional().describe("Request body (JSON) for POST/PUT requests")
26374
+ });
26375
+ var outputSchema32 = z32.discriminatedUnion("success", [
26376
+ z32.object({
26377
+ success: z32.literal(true),
26378
+ status: z32.number(),
26379
+ data: z32.record(z32.string(), z32.unknown())
26380
+ }),
26381
+ z32.object({
26382
+ success: z32.literal(false),
26383
+ error: z32.string()
26384
+ })
26385
+ ]);
26386
+ var requestTool15 = new ConnectorTool({
26387
+ name: "request",
26388
+ description: `Send authenticated requests to the Shopify Admin REST API.
26389
+ Authentication is handled automatically using Custom App credentials (Client ID + Client Secret). An access token is obtained on each request.
26390
+ The store domain is resolved from the connection \u2014 only provide the path starting with /admin/api/.
26391
+ Use this tool for all Shopify API interactions: listing products, orders, customers, inventory, collections, and more.`,
26392
+ inputSchema: inputSchema32,
26393
+ outputSchema: outputSchema32,
26394
+ async execute({ connectionId, method, path: path5, body }, connections) {
26395
+ const connection = connections.find((c) => c.id === connectionId);
26396
+ if (!connection) {
26397
+ return {
26398
+ success: false,
26399
+ error: `Connection ${connectionId} not found`
26400
+ };
26401
+ }
26402
+ console.log(
26403
+ `[connector-request] shopify/${connection.name}: ${method} ${path5}`
26404
+ );
26405
+ try {
26406
+ const storeDomain = parameters28.storeDomain.getValue(connection);
26407
+ const clientId = parameters28.clientId.getValue(connection);
26408
+ const clientSecret = parameters28.clientSecret.getValue(connection);
26409
+ const tokenRes = await fetch(
26410
+ `https://${storeDomain}/admin/oauth/access_token`,
26411
+ {
26412
+ method: "POST",
26413
+ headers: { "Content-Type": "application/json" },
26414
+ body: JSON.stringify({
26415
+ client_id: clientId,
26416
+ client_secret: clientSecret
26417
+ })
26418
+ }
26419
+ );
26420
+ if (!tokenRes.ok) {
26421
+ const tokenBody = await tokenRes.text().catch(() => "(unreadable body)");
26422
+ return {
26423
+ success: false,
26424
+ error: `Failed to obtain access token: ${tokenRes.status} ${tokenRes.statusText} \u2014 ${tokenBody}`
26425
+ };
26426
+ }
26427
+ const tokenJson = await tokenRes.json();
26428
+ if (!tokenJson.access_token) {
26429
+ return {
26430
+ success: false,
26431
+ error: "access_token not found in token response"
26432
+ };
26433
+ }
26434
+ const url = `https://${storeDomain}${path5}`;
26435
+ const controller = new AbortController();
26436
+ const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS21);
26437
+ try {
26438
+ const response = await fetch(url, {
26439
+ method,
26440
+ headers: {
26441
+ "X-Shopify-Access-Token": tokenJson.access_token,
26442
+ "Content-Type": "application/json"
26443
+ },
26444
+ body: body ? JSON.stringify(body) : void 0,
26445
+ signal: controller.signal
26446
+ });
26447
+ const data = await response.json();
26448
+ if (!response.ok) {
26449
+ const errorMessage = typeof data?.errors === "string" ? data.errors : typeof data?.error === "string" ? data.error : `HTTP ${response.status} ${response.statusText}`;
26450
+ return { success: false, error: errorMessage };
26451
+ }
26452
+ return { success: true, status: response.status, data };
26453
+ } finally {
26454
+ clearTimeout(timeout);
26455
+ }
26456
+ } catch (err) {
26457
+ const msg = err instanceof Error ? err.message : String(err);
26458
+ return { success: false, error: msg };
26459
+ }
26460
+ }
26461
+ });
26462
+
25681
26463
  // ../connectors/src/connectors/shopify/index.ts
25682
- var tools28 = {};
26464
+ var tools28 = { request: requestTool15 };
25683
26465
  var shopifyConnector = new ConnectorPlugin({
25684
26466
  slug: "shopify",
25685
26467
  authType: null,
@@ -25688,89 +26470,152 @@ var shopifyConnector = new ConnectorPlugin({
25688
26470
  iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/57KEjZCBskKgSxgKyU4Sm0/117d681a410f48dc36f97cdd9c0593c5/shopify-icon.svg",
25689
26471
  parameters: parameters28,
25690
26472
  releaseFlag: { dev1: true, dev2: false, prod: false },
26473
+ onboarding: shopifyOnboarding,
25691
26474
  systemPrompt: {
25692
- en: `### Shopify SDK (TypeScript handler)
25693
- Use the Shopify connector via the SDK in TypeScript handlers:
26475
+ en: `### Tools
26476
+
26477
+ - \`shopify_request\`: The only way to call the Shopify Admin REST API. Use it to query products, orders, customers, inventory, collections, and more. Authentication (Custom App Client ID + Client Secret) is configured automatically \u2014 an access token is obtained on each request. Only provide the path starting with \`/admin/api/\`. Shopify uses cursor-based pagination via the \`page_info\` query parameter (obtained from the Link header in the response).
26478
+
26479
+ ### Business Logic
26480
+
26481
+ The business logic type for this connector is "typescript". Use the connector SDK in your handler. Do NOT read credentials from environment variables.
26482
+
26483
+ SDK methods (client created via \`connection(connectionId)\`):
26484
+ - \`client.request(path, init?)\` \u2014 low-level authenticated fetch
26485
+ - \`client.listProducts(options?)\` \u2014 list products with filters (status, date range) and pagination
26486
+ - \`client.getProduct(productId)\` \u2014 fetch a single product
26487
+ - \`client.listOrders(options?)\` \u2014 list orders with filters (status, financial_status, fulfillment_status, date range)
26488
+ - \`client.getOrder(orderId)\` \u2014 fetch a single order
26489
+ - \`client.listCustomers(options?)\` \u2014 list customers with filters and pagination
26490
+ - \`client.getCustomer(customerId)\` \u2014 fetch a single customer
26491
+ - \`client.listCustomCollections(options?)\` \u2014 list custom collections
26492
+ - \`client.listSmartCollections(options?)\` \u2014 list smart collections
25694
26493
 
25695
26494
  \`\`\`ts
26495
+ import type { Context } from "hono";
25696
26496
  import { connection } from "@squadbase/vite-server/connectors/shopify";
25697
26497
 
25698
- const { accessToken, storeDomain } = connection("<connectionId>");
26498
+ const shopify = connection("<connectionId>");
25699
26499
 
25700
- // Use the Shopify Admin REST API
25701
- const res = await fetch(
25702
- \`https://\${storeDomain}/admin/api/2024-10/products.json\`,
25703
- {
25704
- headers: {
25705
- "X-Shopify-Access-Token": accessToken,
25706
- "Content-Type": "application/json",
25707
- },
25708
- },
25709
- );
25710
- const data = await res.json();
26500
+ export default async function handler(c: Context) {
26501
+ const { status = "active", limit = 50 } = await c.req.json<{
26502
+ status?: "active" | "draft" | "archived";
26503
+ limit?: number;
26504
+ }>();
26505
+
26506
+ const { products } = await shopify.listProducts({ status, limit });
26507
+
26508
+ return c.json({
26509
+ products: products.map((p: Record<string, unknown>) => ({
26510
+ id: p.id,
26511
+ title: p.title,
26512
+ status: p.status,
26513
+ vendor: p.vendor,
26514
+ created_at: p.created_at,
26515
+ })),
26516
+ });
26517
+ }
25711
26518
  \`\`\`
25712
26519
 
25713
- ### Common Endpoints (Base URL: https://{storeDomain}/admin/api/2024-10)
25714
- - GET \`/products.json\` \u2014 List products
25715
- - GET \`/products/{id}.json\` \u2014 Get a product
25716
- - GET \`/orders.json\` \u2014 List orders
25717
- - GET \`/orders/{id}.json\` \u2014 Get an order
25718
- - GET \`/customers.json\` \u2014 List customers
25719
- - GET \`/customers/{id}.json\` \u2014 Get a customer
25720
- - GET \`/inventory_items.json?ids={ids}\` \u2014 List inventory items
25721
- - GET \`/locations.json\` \u2014 List locations
25722
- - GET \`/collects.json\` \u2014 List collects
25723
- - GET \`/custom_collections.json\` \u2014 List custom collections
25724
- - GET \`/smart_collections.json\` \u2014 List smart collections
26520
+ ### Shopify Admin REST API Reference
25725
26521
 
25726
- ### Query Parameters
26522
+ - Base URL: \`https://{storeDomain}/admin/api/2024-10\`
26523
+ - Authentication: Custom App (Client ID + Client Secret \u2192 access token obtained per request)
26524
+ - Pagination: cursor-based via \`page_info\` query parameter (from Link header)
26525
+ - Max 250 records per page
26526
+
26527
+ #### Common Endpoints
26528
+ - GET \`/admin/api/2024-10/products.json\` \u2014 List products
26529
+ - GET \`/admin/api/2024-10/products/{id}.json\` \u2014 Get a product
26530
+ - GET \`/admin/api/2024-10/orders.json\` \u2014 List orders
26531
+ - GET \`/admin/api/2024-10/orders/{id}.json\` \u2014 Get an order
26532
+ - GET \`/admin/api/2024-10/customers.json\` \u2014 List customers
26533
+ - GET \`/admin/api/2024-10/customers/{id}.json\` \u2014 Get a customer
26534
+ - GET \`/admin/api/2024-10/inventory_items.json?ids={ids}\` \u2014 List inventory items
26535
+ - GET \`/admin/api/2024-10/locations.json\` \u2014 List locations
26536
+ - GET \`/admin/api/2024-10/collects.json\` \u2014 List collects
26537
+ - GET \`/admin/api/2024-10/custom_collections.json\` \u2014 List custom collections
26538
+ - GET \`/admin/api/2024-10/smart_collections.json\` \u2014 List smart collections
26539
+
26540
+ #### Common Query Parameters
25727
26541
  - \`limit\` \u2014 Max records per page (max 250)
25728
26542
  - \`page_info\` \u2014 Cursor for pagination (from Link header)
25729
26543
  - \`fields\` \u2014 Comma-separated list of fields to return
25730
- - \`created_at_min\`, \`created_at_max\` \u2014 Date filters
25731
- - \`updated_at_min\`, \`updated_at_max\` \u2014 Date filters
25732
- - \`status\` \u2014 Filter by status (e.g., active, draft, archived for products)`,
25733
- ja: `### Shopify SDK\uFF08TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\uFF09
25734
- TypeScript\u30CF\u30F3\u30C9\u30E9\u30FC\u3067Shopify\u30B3\u30CD\u30AF\u30BF\u30FC\u3092SDK\u7D4C\u7531\u3067\u4F7F\u7528\u3057\u307E\u3059\uFF1A
26544
+ - \`created_at_min\`, \`created_at_max\` \u2014 Date filters (ISO 8601)
26545
+ - \`updated_at_min\`, \`updated_at_max\` \u2014 Date filters (ISO 8601)
26546
+ - \`status\` \u2014 Filter by status (e.g., active, draft, archived for products; open, closed, cancelled, any for orders)`,
26547
+ ja: `### \u30C4\u30FC\u30EB
26548
+
26549
+ - \`shopify_request\`: Shopify Admin REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u5546\u54C1\u3001\u6CE8\u6587\u3001\u9867\u5BA2\u3001\u5728\u5EAB\u3001\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u306A\u3069\u306E\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08\u30AB\u30B9\u30BF\u30E0\u30A2\u30D7\u30EA\u306E Client ID + Client Secret\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u3001\u30EA\u30AF\u30A8\u30B9\u30C8\u3054\u3068\u306B\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\`/admin/api/\` \u304B\u3089\u59CB\u307E\u308B\u30D1\u30B9\u306E\u307F\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002Shopify\u306F\u30EC\u30B9\u30DD\u30F3\u30B9\u306E Link \u30D8\u30C3\u30C0\u30FC\u304B\u3089\u53D6\u5F97\u3059\u308B \`page_info\` \u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u306B\u3088\u308B\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002
26550
+
26551
+ ### Business Logic
26552
+
26553
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
26554
+
26555
+ SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
26556
+ - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
26557
+ - \`client.listProducts(options?)\` \u2014 \u30D5\u30A3\u30EB\u30BF\uFF08\u30B9\u30C6\u30FC\u30BF\u30B9\u3001\u65E5\u4ED8\u7BC4\u56F2\uFF09\u3068\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u4ED8\u304D\u3067\u5546\u54C1\u3092\u4E00\u89A7\u53D6\u5F97
26558
+ - \`client.getProduct(productId)\` \u2014 \u5358\u4E00\u5546\u54C1\u3092\u53D6\u5F97
26559
+ - \`client.listOrders(options?)\` \u2014 \u30D5\u30A3\u30EB\u30BF\uFF08\u30B9\u30C6\u30FC\u30BF\u30B9\u3001\u652F\u6255\u3044\u72B6\u6CC1\u3001\u914D\u9001\u72B6\u6CC1\u3001\u65E5\u4ED8\u7BC4\u56F2\uFF09\u4ED8\u304D\u3067\u6CE8\u6587\u3092\u4E00\u89A7\u53D6\u5F97
26560
+ - \`client.getOrder(orderId)\` \u2014 \u5358\u4E00\u6CE8\u6587\u3092\u53D6\u5F97
26561
+ - \`client.listCustomers(options?)\` \u2014 \u30D5\u30A3\u30EB\u30BF\u3068\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u4ED8\u304D\u3067\u9867\u5BA2\u3092\u4E00\u89A7\u53D6\u5F97
26562
+ - \`client.getCustomer(customerId)\` \u2014 \u5358\u4E00\u9867\u5BA2\u3092\u53D6\u5F97
26563
+ - \`client.listCustomCollections(options?)\` \u2014 \u30AB\u30B9\u30BF\u30E0\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092\u4E00\u89A7\u53D6\u5F97
26564
+ - \`client.listSmartCollections(options?)\` \u2014 \u30B9\u30DE\u30FC\u30C8\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092\u4E00\u89A7\u53D6\u5F97
25735
26565
 
25736
26566
  \`\`\`ts
26567
+ import type { Context } from "hono";
25737
26568
  import { connection } from "@squadbase/vite-server/connectors/shopify";
25738
26569
 
25739
- const { accessToken, storeDomain } = connection("<connectionId>");
26570
+ const shopify = connection("<connectionId>");
25740
26571
 
25741
- // Shopify Admin REST API\u3092\u4F7F\u7528
25742
- const res = await fetch(
25743
- \`https://\${storeDomain}/admin/api/2024-10/products.json\`,
25744
- {
25745
- headers: {
25746
- "X-Shopify-Access-Token": accessToken,
25747
- "Content-Type": "application/json",
25748
- },
25749
- },
25750
- );
25751
- const data = await res.json();
26572
+ export default async function handler(c: Context) {
26573
+ const { status = "active", limit = 50 } = await c.req.json<{
26574
+ status?: "active" | "draft" | "archived";
26575
+ limit?: number;
26576
+ }>();
26577
+
26578
+ const { products } = await shopify.listProducts({ status, limit });
26579
+
26580
+ return c.json({
26581
+ products: products.map((p: Record<string, unknown>) => ({
26582
+ id: p.id,
26583
+ title: p.title,
26584
+ status: p.status,
26585
+ vendor: p.vendor,
26586
+ created_at: p.created_at,
26587
+ })),
26588
+ });
26589
+ }
25752
26590
  \`\`\`
25753
26591
 
25754
- ### \u4E3B\u8981\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\uFF08\u30D9\u30FC\u30B9URL: https://{storeDomain}/admin/api/2024-10\uFF09
25755
- - GET \`/products.json\` \u2014 \u5546\u54C1\u4E00\u89A7
25756
- - GET \`/products/{id}.json\` \u2014 \u5546\u54C1\u306E\u53D6\u5F97
25757
- - GET \`/orders.json\` \u2014 \u6CE8\u6587\u4E00\u89A7
25758
- - GET \`/orders/{id}.json\` \u2014 \u6CE8\u6587\u306E\u53D6\u5F97
25759
- - GET \`/customers.json\` \u2014 \u9867\u5BA2\u4E00\u89A7
25760
- - GET \`/customers/{id}.json\` \u2014 \u9867\u5BA2\u306E\u53D6\u5F97
25761
- - GET \`/inventory_items.json?ids={ids}\` \u2014 \u5728\u5EAB\u30A2\u30A4\u30C6\u30E0\u4E00\u89A7
25762
- - GET \`/locations.json\` \u2014 \u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\u4E00\u89A7
25763
- - GET \`/collects.json\` \u2014 \u30B3\u30EC\u30AF\u30C8\u4E00\u89A7
25764
- - GET \`/custom_collections.json\` \u2014 \u30AB\u30B9\u30BF\u30E0\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u4E00\u89A7
25765
- - GET \`/smart_collections.json\` \u2014 \u30B9\u30DE\u30FC\u30C8\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u4E00\u89A7
25766
-
25767
- ### \u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF
26592
+ ### Shopify Admin REST API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
26593
+
26594
+ - \u30D9\u30FC\u30B9URL: \`https://{storeDomain}/admin/api/2024-10\`
26595
+ - \u8A8D\u8A3C: \u30AB\u30B9\u30BF\u30E0\u30A2\u30D7\u30EA\uFF08Client ID + Client Secret \u2192 \u30EA\u30AF\u30A8\u30B9\u30C8\u3054\u3068\u306B\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u53D6\u5F97\uFF09
26596
+ - \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3: Link \u30D8\u30C3\u30C0\u30FC\u304B\u3089\u306E \`page_info\` \u306B\u3088\u308B\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9
26597
+ - \u30DA\u30FC\u30B8\u3042\u305F\u308A\u6700\u5927250\u30EC\u30B3\u30FC\u30C9
26598
+
26599
+ #### \u4E3B\u8981\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
26600
+ - GET \`/admin/api/2024-10/products.json\` \u2014 \u5546\u54C1\u4E00\u89A7
26601
+ - GET \`/admin/api/2024-10/products/{id}.json\` \u2014 \u5546\u54C1\u306E\u53D6\u5F97
26602
+ - GET \`/admin/api/2024-10/orders.json\` \u2014 \u6CE8\u6587\u4E00\u89A7
26603
+ - GET \`/admin/api/2024-10/orders/{id}.json\` \u2014 \u6CE8\u6587\u306E\u53D6\u5F97
26604
+ - GET \`/admin/api/2024-10/customers.json\` \u2014 \u9867\u5BA2\u4E00\u89A7
26605
+ - GET \`/admin/api/2024-10/customers/{id}.json\` \u2014 \u9867\u5BA2\u306E\u53D6\u5F97
26606
+ - GET \`/admin/api/2024-10/inventory_items.json?ids={ids}\` \u2014 \u5728\u5EAB\u30A2\u30A4\u30C6\u30E0\u4E00\u89A7
26607
+ - GET \`/admin/api/2024-10/locations.json\` \u2014 \u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\u4E00\u89A7
26608
+ - GET \`/admin/api/2024-10/collects.json\` \u2014 \u30B3\u30EC\u30AF\u30C8\u4E00\u89A7
26609
+ - GET \`/admin/api/2024-10/custom_collections.json\` \u2014 \u30AB\u30B9\u30BF\u30E0\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u4E00\u89A7
26610
+ - GET \`/admin/api/2024-10/smart_collections.json\` \u2014 \u30B9\u30DE\u30FC\u30C8\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u4E00\u89A7
26611
+
26612
+ #### \u4E3B\u8981\u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF
25768
26613
  - \`limit\` \u2014 \u30DA\u30FC\u30B8\u3042\u305F\u308A\u306E\u6700\u5927\u30EC\u30B3\u30FC\u30C9\u6570\uFF08\u6700\u5927250\uFF09
25769
26614
  - \`page_info\` \u2014 \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u7528\u30AB\u30FC\u30BD\u30EB\uFF08Link\u30D8\u30C3\u30C0\u30FC\u304B\u3089\u53D6\u5F97\uFF09
25770
26615
  - \`fields\` \u2014 \u8FD4\u5374\u3059\u308B\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u30AB\u30F3\u30DE\u533A\u5207\u308A\u30EA\u30B9\u30C8
25771
- - \`created_at_min\`, \`created_at_max\` \u2014 \u4F5C\u6210\u65E5\u30D5\u30A3\u30EB\u30BF\u30FC
25772
- - \`updated_at_min\`, \`updated_at_max\` \u2014 \u66F4\u65B0\u65E5\u30D5\u30A3\u30EB\u30BF\u30FC
25773
- - \`status\` \u2014 \u30B9\u30C6\u30FC\u30BF\u30B9\u3067\u30D5\u30A3\u30EB\u30BF\u30FC\uFF08\u4F8B: \u5546\u54C1\u306E\u5834\u5408 active, draft, archived\uFF09`
26616
+ - \`created_at_min\`, \`created_at_max\` \u2014 \u4F5C\u6210\u65E5\u30D5\u30A3\u30EB\u30BF\u30FC\uFF08ISO 8601\uFF09
26617
+ - \`updated_at_min\`, \`updated_at_max\` \u2014 \u66F4\u65B0\u65E5\u30D5\u30A3\u30EB\u30BF\u30FC\uFF08ISO 8601\uFF09
26618
+ - \`status\` \u2014 \u30B9\u30C6\u30FC\u30BF\u30B9\u3067\u30D5\u30A3\u30EB\u30BF\u30FC\uFF08\u4F8B: \u5546\u54C1\u306E\u5834\u5408 active, draft, archived\u3001\u6CE8\u6587\u306E\u5834\u5408 open, closed, cancelled, any\uFF09`
25774
26619
  },
25775
26620
  tools: tools28
25776
26621
  });
@@ -25943,8 +26788,8 @@ const data = await res.json();
25943
26788
  });
25944
26789
 
25945
26790
  // ../connectors/src/connectors/shopify-oauth/tools/request.ts
25946
- import { z as z30 } from "zod";
25947
- var REQUEST_TIMEOUT_MS19 = 6e4;
26791
+ import { z as z33 } from "zod";
26792
+ var REQUEST_TIMEOUT_MS22 = 6e4;
25948
26793
  var cachedToken13 = null;
25949
26794
  async function getProxyToken13(config) {
25950
26795
  if (cachedToken13 && cachedToken13.expiresAt > Date.now() + 6e4) {
@@ -25976,35 +26821,35 @@ async function getProxyToken13(config) {
25976
26821
  };
25977
26822
  return data.token;
25978
26823
  }
25979
- var inputSchema30 = z30.object({
25980
- toolUseIntent: z30.string().optional().describe(
26824
+ var inputSchema33 = z33.object({
26825
+ toolUseIntent: z33.string().optional().describe(
25981
26826
  "Brief description of what you intend to accomplish with this tool call"
25982
26827
  ),
25983
- connectionId: z30.string().describe("ID of the Shopify OAuth connection to use"),
25984
- method: z30.enum(["GET", "POST", "PUT", "DELETE"]).describe("HTTP method"),
25985
- path: z30.string().describe(
26828
+ connectionId: z33.string().describe("ID of the Shopify OAuth connection to use"),
26829
+ method: z33.enum(["GET", "POST", "PUT", "DELETE"]).describe("HTTP method"),
26830
+ path: z33.string().describe(
25986
26831
  "API path (e.g., '/admin/api/2024-10/products.json', '/admin/api/2024-10/orders.json')"
25987
26832
  ),
25988
- queryParams: z30.record(z30.string(), z30.string()).optional().describe("Query parameters to append to the URL"),
25989
- body: z30.record(z30.string(), z30.unknown()).optional().describe("Request body (JSON) for POST/PUT requests")
25990
- });
25991
- var outputSchema30 = z30.discriminatedUnion("success", [
25992
- z30.object({
25993
- success: z30.literal(true),
25994
- status: z30.number(),
25995
- data: z30.record(z30.string(), z30.unknown())
26833
+ queryParams: z33.record(z33.string(), z33.string()).optional().describe("Query parameters to append to the URL"),
26834
+ body: z33.record(z33.string(), z33.unknown()).optional().describe("Request body (JSON) for POST/PUT requests")
26835
+ });
26836
+ var outputSchema33 = z33.discriminatedUnion("success", [
26837
+ z33.object({
26838
+ success: z33.literal(true),
26839
+ status: z33.number(),
26840
+ data: z33.record(z33.string(), z33.unknown())
25996
26841
  }),
25997
- z30.object({
25998
- success: z30.literal(false),
25999
- error: z30.string()
26842
+ z33.object({
26843
+ success: z33.literal(false),
26844
+ error: z33.string()
26000
26845
  })
26001
26846
  ]);
26002
- var requestTool13 = new ConnectorTool({
26847
+ var requestTool16 = new ConnectorTool({
26003
26848
  name: "request",
26004
26849
  description: `Send authenticated requests to the Shopify Admin API.
26005
26850
  Authentication is handled automatically via OAuth proxy.`,
26006
- inputSchema: inputSchema30,
26007
- outputSchema: outputSchema30,
26851
+ inputSchema: inputSchema33,
26852
+ outputSchema: outputSchema33,
26008
26853
  async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
26009
26854
  const connection = connections.find((c) => c.id === connectionId);
26010
26855
  if (!connection) {
@@ -26025,7 +26870,7 @@ Authentication is handled automatically via OAuth proxy.`,
26025
26870
  const token = await getProxyToken13(config.oauthProxy);
26026
26871
  const proxyUrl = `https://${config.oauthProxy.sandboxId}.${config.oauthProxy.previewBaseDomain}/_sqcore/connections/${connectionId}/request`;
26027
26872
  const controller = new AbortController();
26028
- const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS19);
26873
+ const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS22);
26029
26874
  try {
26030
26875
  const response = await fetch(proxyUrl, {
26031
26876
  method: "POST",
@@ -26057,7 +26902,7 @@ Authentication is handled automatically via OAuth proxy.`,
26057
26902
  });
26058
26903
 
26059
26904
  // ../connectors/src/connectors/shopify-oauth/setup.ts
26060
- var requestToolName5 = `shopify-oauth_${requestTool13.name}`;
26905
+ var requestToolName5 = `shopify-oauth_${requestTool16.name}`;
26061
26906
  var shopifyOauthOnboarding = new ConnectorOnboarding({
26062
26907
  connectionSetupInstructions: {
26063
26908
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3067Shopify\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u306E\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044\u3002
@@ -26101,7 +26946,7 @@ var shopifyOauthOnboarding = new ConnectorOnboarding({
26101
26946
  var parameters30 = {};
26102
26947
 
26103
26948
  // ../connectors/src/connectors/shopify-oauth/index.ts
26104
- var tools30 = { request: requestTool13 };
26949
+ var tools30 = { request: requestTool16 };
26105
26950
  var shopifyOauthConnector = new ConnectorPlugin({
26106
26951
  slug: "shopify",
26107
26952
  authType: AUTH_TYPES.OAUTH,
@@ -26120,9 +26965,13 @@ var shopifyOauthConnector = new ConnectorPlugin({
26120
26965
  ]
26121
26966
  },
26122
26967
  systemPrompt: {
26123
- en: `### Shopify API (OAuth)
26968
+ en: `### Tools
26969
+
26970
+ - \`shopify-oauth_request\`: The only way to call the Shopify Admin REST API. Use it to query products, orders, customers, inventory, collections, and more. Authentication is configured automatically via OAuth proxy. Shopify uses cursor-based pagination via the \`page_info\` query parameter (obtained from the Link header in the response).
26124
26971
 
26125
- ### Available Endpoints (API version: 2024-10)
26972
+ ### Shopify Admin REST API Reference
26973
+
26974
+ #### Available Endpoints (API version: 2024-10)
26126
26975
  - GET \`/admin/api/2024-10/shop.json\` \u2014 Get shop info
26127
26976
  - GET \`/admin/api/2024-10/products.json\` \u2014 List products
26128
26977
  - GET \`/admin/api/2024-10/products/{id}.json\` \u2014 Get a product
@@ -26163,9 +27012,13 @@ const shopify = connection("<connectionId>");
26163
27012
  const res = await shopify.request("/admin/api/2024-10/products.json?limit=10");
26164
27013
  const data = await res.json();
26165
27014
  \`\`\``,
26166
- ja: `### Shopify API (OAuth)
27015
+ ja: `### \u30C4\u30FC\u30EB
27016
+
27017
+ - \`shopify-oauth_request\`: Shopify Admin REST API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u5546\u54C1\u3001\u6CE8\u6587\u3001\u9867\u5BA2\u3001\u5728\u5EAB\u3001\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u306A\u3069\u306E\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002OAuth\u30D7\u30ED\u30AD\u30B7\u7D4C\u7531\u3067\u8A8D\u8A3C\u306F\u81EA\u52D5\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002Shopify\u306F\u30EC\u30B9\u30DD\u30F3\u30B9\u306E Link \u30D8\u30C3\u30C0\u30FC\u304B\u3089\u53D6\u5F97\u3059\u308B \`page_info\` \u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF\u306B\u3088\u308B\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002
26167
27018
 
26168
- ### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8 (API\u30D0\u30FC\u30B8\u30E7\u30F3: 2024-10)
27019
+ ### Shopify Admin REST API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
27020
+
27021
+ #### \u5229\u7528\u53EF\u80FD\u306A\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8 (API\u30D0\u30FC\u30B8\u30E7\u30F3: 2024-10)
26169
27022
  - GET \`/admin/api/2024-10/shop.json\` \u2014 \u30B7\u30E7\u30C3\u30D7\u60C5\u5831\u3092\u53D6\u5F97
26170
27023
  - GET \`/admin/api/2024-10/products.json\` \u2014 \u5546\u54C1\u4E00\u89A7\u3092\u53D6\u5F97
26171
27024
  - GET \`/admin/api/2024-10/products/{id}.json\` \u2014 \u5546\u54C1\u3092\u53D6\u5F97
@@ -26424,9 +27277,9 @@ const data = await res.json();
26424
27277
  });
26425
27278
 
26426
27279
  // ../connectors/src/connectors/ms-teams-oauth/tools/request.ts
26427
- import { z as z31 } from "zod";
26428
- var BASE_URL11 = "https://graph.microsoft.com";
26429
- var REQUEST_TIMEOUT_MS20 = 6e4;
27280
+ import { z as z34 } from "zod";
27281
+ var BASE_URL12 = "https://graph.microsoft.com";
27282
+ var REQUEST_TIMEOUT_MS23 = 6e4;
26430
27283
  var cachedToken14 = null;
26431
27284
  async function getProxyToken14(config) {
26432
27285
  if (cachedToken14 && cachedToken14.expiresAt > Date.now() + 6e4) {
@@ -26458,35 +27311,35 @@ async function getProxyToken14(config) {
26458
27311
  };
26459
27312
  return data.token;
26460
27313
  }
26461
- var inputSchema31 = z31.object({
26462
- toolUseIntent: z31.string().optional().describe(
27314
+ var inputSchema34 = z34.object({
27315
+ toolUseIntent: z34.string().optional().describe(
26463
27316
  "Brief description of what you intend to accomplish with this tool call"
26464
27317
  ),
26465
- connectionId: z31.string().describe("ID of the Microsoft Teams OAuth connection to use"),
26466
- method: z31.enum(["GET", "POST", "PATCH", "DELETE"]).describe("HTTP method"),
26467
- path: z31.string().describe(
27318
+ connectionId: z34.string().describe("ID of the Microsoft Teams OAuth connection to use"),
27319
+ method: z34.enum(["GET", "POST", "PATCH", "DELETE"]).describe("HTTP method"),
27320
+ path: z34.string().describe(
26468
27321
  "API path appended to https://graph.microsoft.com (e.g., '/v1.0/me/joinedTeams', '/v1.0/teams/{id}/channels')"
26469
27322
  ),
26470
- queryParams: z31.record(z31.string(), z31.string()).optional().describe("Query parameters to append to the URL"),
26471
- body: z31.record(z31.string(), z31.unknown()).optional().describe("Request body (JSON) for POST/PATCH requests")
26472
- });
26473
- var outputSchema31 = z31.discriminatedUnion("success", [
26474
- z31.object({
26475
- success: z31.literal(true),
26476
- status: z31.number(),
26477
- data: z31.record(z31.string(), z31.unknown())
27323
+ queryParams: z34.record(z34.string(), z34.string()).optional().describe("Query parameters to append to the URL"),
27324
+ body: z34.record(z34.string(), z34.unknown()).optional().describe("Request body (JSON) for POST/PATCH requests")
27325
+ });
27326
+ var outputSchema34 = z34.discriminatedUnion("success", [
27327
+ z34.object({
27328
+ success: z34.literal(true),
27329
+ status: z34.number(),
27330
+ data: z34.record(z34.string(), z34.unknown())
26478
27331
  }),
26479
- z31.object({
26480
- success: z31.literal(false),
26481
- error: z31.string()
27332
+ z34.object({
27333
+ success: z34.literal(false),
27334
+ error: z34.string()
26482
27335
  })
26483
27336
  ]);
26484
- var requestTool14 = new ConnectorTool({
27337
+ var requestTool17 = new ConnectorTool({
26485
27338
  name: "request",
26486
27339
  description: `Send authenticated requests to the Microsoft Graph API.
26487
27340
  Authentication is handled automatically via OAuth proxy.`,
26488
- inputSchema: inputSchema31,
26489
- outputSchema: outputSchema31,
27341
+ inputSchema: inputSchema34,
27342
+ outputSchema: outputSchema34,
26490
27343
  async execute({ connectionId, method, path: path5, queryParams, body }, connections, config) {
26491
27344
  const connection = connections.find((c) => c.id === connectionId);
26492
27345
  if (!connection) {
@@ -26499,7 +27352,7 @@ Authentication is handled automatically via OAuth proxy.`,
26499
27352
  `[connector-request] ms-teams-oauth/${connection.name}: ${method} ${path5}`
26500
27353
  );
26501
27354
  try {
26502
- let url = `${BASE_URL11}${path5.startsWith("/") ? "" : "/"}${path5}`;
27355
+ let url = `${BASE_URL12}${path5.startsWith("/") ? "" : "/"}${path5}`;
26503
27356
  if (queryParams) {
26504
27357
  const searchParams = new URLSearchParams(queryParams);
26505
27358
  url += `?${searchParams.toString()}`;
@@ -26507,7 +27360,7 @@ Authentication is handled automatically via OAuth proxy.`,
26507
27360
  const token = await getProxyToken14(config.oauthProxy);
26508
27361
  const proxyUrl = `https://${config.oauthProxy.sandboxId}.${config.oauthProxy.previewBaseDomain}/_sqcore/connections/${connectionId}/request`;
26509
27362
  const controller = new AbortController();
26510
- const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS20);
27363
+ const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS23);
26511
27364
  try {
26512
27365
  const response = await fetch(proxyUrl, {
26513
27366
  method: "POST",
@@ -26539,7 +27392,7 @@ Authentication is handled automatically via OAuth proxy.`,
26539
27392
  });
26540
27393
 
26541
27394
  // ../connectors/src/connectors/ms-teams-oauth/setup.ts
26542
- var requestToolName6 = `microsoft-teams-oauth_${requestTool14.name}`;
27395
+ var requestToolName6 = `microsoft-teams-oauth_${requestTool17.name}`;
26543
27396
  var msTeamsOauthOnboarding = new ConnectorOnboarding({
26544
27397
  connectionSetupInstructions: {
26545
27398
  ja: `\u4EE5\u4E0B\u306E\u624B\u9806\u3092\u6B63\u78BA\u306B\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u624B\u9806\u306B\u8A18\u8F09\u306E\u306A\u3044\u8FFD\u52A0\u306EAPI\u30EA\u30AF\u30A8\u30B9\u30C8\u306F\u4E00\u5207\u884C\u308F\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
@@ -26585,7 +27438,7 @@ var msTeamsOauthOnboarding = new ConnectorOnboarding({
26585
27438
  var parameters32 = {};
26586
27439
 
26587
27440
  // ../connectors/src/connectors/ms-teams-oauth/index.ts
26588
- var tools32 = { request: requestTool14 };
27441
+ var tools32 = { request: requestTool17 };
26589
27442
  var msTeamsOauthConnector = new ConnectorPlugin({
26590
27443
  slug: "microsoft-teams",
26591
27444
  authType: AUTH_TYPES.OAUTH,
@@ -26719,6 +27572,257 @@ const data = await res.json();
26719
27572
  }
26720
27573
  });
26721
27574
 
27575
+ // ../connectors/src/connectors/hubspot/setup.ts
27576
+ var hubspotOnboarding2 = new ConnectorOnboarding({
27577
+ dataOverviewInstructions: {
27578
+ en: `1. Call hubspot_request with GET /crm/v3/objects/contacts?limit=5 to explore contacts structure
27579
+ 2. Call hubspot_request with GET /crm/v3/objects/deals?limit=5 to explore deals structure
27580
+ 3. Explore other object types (companies, tickets, etc.) as needed to understand available data`,
27581
+ ja: `1. hubspot_request \u3067 GET /crm/v3/objects/contacts?limit=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u30B3\u30F3\u30BF\u30AF\u30C8\u306E\u69CB\u9020\u3092\u78BA\u8A8D
27582
+ 2. hubspot_request \u3067 GET /crm/v3/objects/deals?limit=5 \u3092\u547C\u3073\u51FA\u3057\u3001\u53D6\u5F15\u306E\u69CB\u9020\u3092\u78BA\u8A8D
27583
+ 3. \u5FC5\u8981\u306B\u5FDC\u3058\u3066\u4ED6\u306E\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u30BF\u30A4\u30D7\uFF08\u4F01\u696D\u3001\u30C1\u30B1\u30C3\u30C8\u306A\u3069\uFF09\u3092\u63A2\u7D22\u3057\u3001\u5229\u7528\u53EF\u80FD\u306A\u30C7\u30FC\u30BF\u3092\u628A\u63E1`
27584
+ }
27585
+ });
27586
+
27587
+ // ../connectors/src/connectors/hubspot/parameters.ts
27588
+ var parameters33 = {
27589
+ apiKey: new ParameterDefinition({
27590
+ slug: "api-key",
27591
+ name: "HubSpot Private App Access Token",
27592
+ description: "The HubSpot private app access token for authentication (starts with pat-).",
27593
+ envVarBaseKey: "HUBSPOT_API_KEY",
27594
+ type: "text",
27595
+ secret: true,
27596
+ required: true
27597
+ })
27598
+ };
27599
+
27600
+ // ../connectors/src/connectors/hubspot/tools/request.ts
27601
+ import { z as z35 } from "zod";
27602
+ var BASE_URL13 = "https://api.hubapi.com";
27603
+ var REQUEST_TIMEOUT_MS24 = 6e4;
27604
+ var inputSchema35 = z35.object({
27605
+ toolUseIntent: z35.string().optional().describe(
27606
+ "Brief description of what you intend to accomplish with this tool call"
27607
+ ),
27608
+ connectionId: z35.string().describe("ID of the HubSpot connection to use"),
27609
+ method: z35.enum(["GET", "POST", "PATCH", "DELETE"]).describe(
27610
+ "HTTP method. GET for reading resources, POST for creating or searching, PATCH for updating, DELETE for removing."
27611
+ ),
27612
+ path: z35.string().describe(
27613
+ "API path appended to https://api.hubapi.com (e.g., '/crm/v3/objects/contacts', '/crm/v3/objects/deals', '/crm/v3/objects/contacts/search')"
27614
+ ),
27615
+ body: z35.record(z35.string(), z35.unknown()).optional().describe("Request body (JSON) for POST/PATCH requests")
27616
+ });
27617
+ var outputSchema35 = z35.discriminatedUnion("success", [
27618
+ z35.object({
27619
+ success: z35.literal(true),
27620
+ status: z35.number(),
27621
+ data: z35.record(z35.string(), z35.unknown())
27622
+ }),
27623
+ z35.object({
27624
+ success: z35.literal(false),
27625
+ error: z35.string()
27626
+ })
27627
+ ]);
27628
+ var requestTool18 = new ConnectorTool({
27629
+ name: "request",
27630
+ description: `Send authenticated requests to the HubSpot API.
27631
+ Authentication is handled automatically using the Private App Access Token (Bearer token).
27632
+ Use this tool for all HubSpot API interactions: querying contacts, deals, companies, tickets, and other CRM objects.
27633
+ Use the search endpoint (POST /crm/v3/objects/{objectType}/search) for complex queries with filters.`,
27634
+ inputSchema: inputSchema35,
27635
+ outputSchema: outputSchema35,
27636
+ async execute({ connectionId, method, path: path5, body }, connections) {
27637
+ const connection = connections.find((c) => c.id === connectionId);
27638
+ if (!connection) {
27639
+ return {
27640
+ success: false,
27641
+ error: `Connection ${connectionId} not found`
27642
+ };
27643
+ }
27644
+ console.log(
27645
+ `[connector-request] hubspot/${connection.name}: ${method} ${path5}`
27646
+ );
27647
+ try {
27648
+ const apiKey = parameters33.apiKey.getValue(connection);
27649
+ const url = `${BASE_URL13}${path5.startsWith("/") ? "" : "/"}${path5}`;
27650
+ const controller = new AbortController();
27651
+ const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS24);
27652
+ try {
27653
+ const response = await fetch(url, {
27654
+ method,
27655
+ headers: {
27656
+ Authorization: `Bearer ${apiKey}`,
27657
+ "Content-Type": "application/json"
27658
+ },
27659
+ body: body ? JSON.stringify(body) : void 0,
27660
+ signal: controller.signal
27661
+ });
27662
+ const data = await response.json();
27663
+ if (!response.ok) {
27664
+ const errorMessage = typeof data?.message === "string" ? data.message : typeof data?.error === "string" ? data.error : `HTTP ${response.status} ${response.statusText}`;
27665
+ return { success: false, error: errorMessage };
27666
+ }
27667
+ return { success: true, status: response.status, data };
27668
+ } finally {
27669
+ clearTimeout(timeout);
27670
+ }
27671
+ } catch (err) {
27672
+ const msg = err instanceof Error ? err.message : String(err);
27673
+ return { success: false, error: msg };
27674
+ }
27675
+ }
27676
+ });
27677
+
27678
+ // ../connectors/src/connectors/hubspot/index.ts
27679
+ var tools33 = { request: requestTool18 };
27680
+ var hubspotConnector = new ConnectorPlugin({
27681
+ slug: "hubspot",
27682
+ authType: null,
27683
+ name: "HubSpot",
27684
+ description: "Connect to HubSpot CRM for contacts, deals, companies, and marketing data using a Private App Access Token.",
27685
+ iconUrl: "https://images.ctfassets.net/9ncizv60xc5y/5UcSkKkzhUMA4RsM45ynuo/43b967e36915ca0fc5d277684b204320/hubspot.svg",
27686
+ parameters: parameters33,
27687
+ releaseFlag: { dev1: true, dev2: false, prod: false },
27688
+ onboarding: hubspotOnboarding2,
27689
+ systemPrompt: {
27690
+ en: `### Tools
27691
+
27692
+ - \`hubspot_request\`: The only way to call the HubSpot API. Use it to query contacts, deals, companies, tickets, and other CRM objects. Authentication (Bearer token) is configured automatically. HubSpot uses cursor-based pagination with the \`after\` parameter from \`paging.next.after\` in the response. Use the search endpoint for complex queries with filters.
27693
+
27694
+ ### Business Logic
27695
+
27696
+ The business logic type for this connector is "typescript". Use the connector SDK in your handler. Do NOT read credentials from environment variables.
27697
+
27698
+ SDK methods (client created via \`connection(connectionId)\`):
27699
+ - \`client.request(path, init?)\` \u2014 low-level authenticated fetch
27700
+ - \`client.listObjects(objectType, options?)\` \u2014 list CRM objects with pagination (limit, after, properties, associations)
27701
+ - \`client.getObject(objectType, objectId, options?)\` \u2014 fetch a single CRM object
27702
+ - \`client.searchObjects(objectType, options?)\` \u2014 search CRM objects with filters, sorts, and pagination
27703
+
27704
+ \`\`\`ts
27705
+ import type { Context } from "hono";
27706
+ import { connection } from "@squadbase/vite-server/connectors/hubspot";
27707
+
27708
+ const hubspot = connection("<connectionId>");
27709
+
27710
+ export default async function handler(c: Context) {
27711
+ const { limit = 10 } = await c.req.json<{ limit?: number }>();
27712
+
27713
+ const { results, paging } = await hubspot.listObjects("contacts", {
27714
+ limit,
27715
+ properties: ["email", "firstname", "lastname"],
27716
+ });
27717
+
27718
+ return c.json({
27719
+ contacts: results,
27720
+ nextPage: paging?.next?.after,
27721
+ });
27722
+ }
27723
+ \`\`\`
27724
+
27725
+ ### HubSpot API Reference
27726
+
27727
+ - Base URL: \`https://api.hubapi.com\`
27728
+ - Authentication: Bearer token (handled automatically)
27729
+ - Pagination: cursor-based with \`after\` parameter from \`paging.next.after\`
27730
+
27731
+ #### Common Endpoints
27732
+ - GET \`/crm/v3/objects/contacts\` \u2014 List contacts
27733
+ - GET \`/crm/v3/objects/contacts/{contactId}\` \u2014 Get a contact
27734
+ - GET \`/crm/v3/objects/deals\` \u2014 List deals
27735
+ - GET \`/crm/v3/objects/deals/{dealId}\` \u2014 Get a deal
27736
+ - GET \`/crm/v3/objects/companies\` \u2014 List companies
27737
+ - GET \`/crm/v3/objects/companies/{companyId}\` \u2014 Get a company
27738
+ - POST \`/crm/v3/objects/contacts\` \u2014 Create a contact
27739
+ - POST \`/crm/v3/objects/deals\` \u2014 Create a deal
27740
+ - PATCH \`/crm/v3/objects/contacts/{contactId}\` \u2014 Update a contact
27741
+ - PATCH \`/crm/v3/objects/deals/{dealId}\` \u2014 Update a deal
27742
+ - POST \`/crm/v3/objects/{objectType}/search\` \u2014 Search objects
27743
+
27744
+ #### Query Parameters
27745
+ - \`limit\` \u2014 Number of results per page (max 100)
27746
+ - \`after\` \u2014 Pagination cursor
27747
+ - \`properties\` \u2014 Comma-separated list of properties to return
27748
+ - \`associations\` \u2014 Comma-separated list of association types to include
27749
+
27750
+ #### Search Body (POST /crm/v3/objects/{objectType}/search)
27751
+ - \`filterGroups\` \u2014 Array of filter groups with \`filters\` (propertyName, operator, value)
27752
+ - \`sorts\` \u2014 Array of sort specifications
27753
+ - \`properties\` \u2014 Array of properties to return
27754
+ - \`limit\` \u2014 Max results per page (max 100)
27755
+ - \`after\` \u2014 Pagination offset`,
27756
+ ja: `### \u30C4\u30FC\u30EB
27757
+
27758
+ - \`hubspot_request\`: HubSpot API\u3092\u547C\u3073\u51FA\u3059\u552F\u4E00\u306E\u624B\u6BB5\u3067\u3059\u3002\u30B3\u30F3\u30BF\u30AF\u30C8\u3001\u53D6\u5F15\u3001\u4F1A\u793E\u3001\u30C1\u30B1\u30C3\u30C8\u3001\u305D\u306E\u4ED6\u306ECRM\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u30AF\u30A8\u30EA\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002\u8A8D\u8A3C\uFF08Bearer\u30C8\u30FC\u30AF\u30F3\uFF09\u306F\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002HubSpot\u306F\u30EC\u30B9\u30DD\u30F3\u30B9\u306E \`paging.next.after\` \u304B\u3089\u306E \`after\` \u30D1\u30E9\u30E1\u30FC\u30BF\u306B\u3088\u308B\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9\u306E\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002\u8907\u96D1\u306A\u30AF\u30A8\u30EA\u306B\u306F\u30D5\u30A3\u30EB\u30BF\u4ED8\u304D\u306Esearch\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002
27759
+
27760
+ ### Business Logic
27761
+
27762
+ \u3053\u306E\u30B3\u30CD\u30AF\u30BF\u306E\u30D3\u30B8\u30CD\u30B9\u30ED\u30B8\u30C3\u30AF\u30BF\u30A4\u30D7\u306F "typescript" \u3067\u3059\u3002\u30CF\u30F3\u30C9\u30E9\u5185\u3067\u306F\u30B3\u30CD\u30AF\u30BFSDK\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u74B0\u5883\u5909\u6570\u304B\u3089\u8A8D\u8A3C\u60C5\u5831\u3092\u8AAD\u307F\u53D6\u3089\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
27763
+
27764
+ SDK\u30E1\u30BD\u30C3\u30C9 (\`connection(connectionId)\` \u3067\u4F5C\u6210\u3057\u305F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8):
27765
+ - \`client.request(path, init?)\` \u2014 \u4F4E\u30EC\u30D9\u30EB\u306E\u8A8D\u8A3C\u4ED8\u304Dfetch
27766
+ - \`client.listObjects(objectType, options?)\` \u2014 \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u4ED8\u304D\u3067CRM\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u4E00\u89A7\u53D6\u5F97\uFF08limit, after, properties, associations\uFF09
27767
+ - \`client.getObject(objectType, objectId, options?)\` \u2014 \u5358\u4E00CRM\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u53D6\u5F97
27768
+ - \`client.searchObjects(objectType, options?)\` \u2014 \u30D5\u30A3\u30EB\u30BF\u3001\u30BD\u30FC\u30C8\u3001\u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u4ED8\u304D\u3067CRM\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u691C\u7D22
27769
+
27770
+ \`\`\`ts
27771
+ import type { Context } from "hono";
27772
+ import { connection } from "@squadbase/vite-server/connectors/hubspot";
27773
+
27774
+ const hubspot = connection("<connectionId>");
27775
+
27776
+ export default async function handler(c: Context) {
27777
+ const { limit = 10 } = await c.req.json<{ limit?: number }>();
27778
+
27779
+ const { results, paging } = await hubspot.listObjects("contacts", {
27780
+ limit,
27781
+ properties: ["email", "firstname", "lastname"],
27782
+ });
27783
+
27784
+ return c.json({
27785
+ contacts: results,
27786
+ nextPage: paging?.next?.after,
27787
+ });
27788
+ }
27789
+ \`\`\`
27790
+
27791
+ ### HubSpot API \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9
27792
+
27793
+ - \u30D9\u30FC\u30B9URL: \`https://api.hubapi.com\`
27794
+ - \u8A8D\u8A3C: Bearer\u30C8\u30FC\u30AF\u30F3\uFF08\u81EA\u52D5\u8A2D\u5B9A\uFF09
27795
+ - \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3: \`paging.next.after\` \u304B\u3089\u306E \`after\` \u30D1\u30E9\u30E1\u30FC\u30BF\u306B\u3088\u308B\u30AB\u30FC\u30BD\u30EB\u30D9\u30FC\u30B9
27796
+
27797
+ #### \u4E3B\u8981\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8
27798
+ - GET \`/crm/v3/objects/contacts\` \u2014 \u30B3\u30F3\u30BF\u30AF\u30C8\u4E00\u89A7\u3092\u53D6\u5F97
27799
+ - GET \`/crm/v3/objects/contacts/{contactId}\` \u2014 \u30B3\u30F3\u30BF\u30AF\u30C8\u3092\u53D6\u5F97
27800
+ - GET \`/crm/v3/objects/deals\` \u2014 \u53D6\u5F15\u4E00\u89A7\u3092\u53D6\u5F97
27801
+ - GET \`/crm/v3/objects/deals/{dealId}\` \u2014 \u53D6\u5F15\u3092\u53D6\u5F97
27802
+ - GET \`/crm/v3/objects/companies\` \u2014 \u4F1A\u793E\u4E00\u89A7\u3092\u53D6\u5F97
27803
+ - GET \`/crm/v3/objects/companies/{companyId}\` \u2014 \u4F1A\u793E\u3092\u53D6\u5F97
27804
+ - POST \`/crm/v3/objects/contacts\` \u2014 \u30B3\u30F3\u30BF\u30AF\u30C8\u3092\u4F5C\u6210
27805
+ - POST \`/crm/v3/objects/deals\` \u2014 \u53D6\u5F15\u3092\u4F5C\u6210
27806
+ - PATCH \`/crm/v3/objects/contacts/{contactId}\` \u2014 \u30B3\u30F3\u30BF\u30AF\u30C8\u3092\u66F4\u65B0
27807
+ - PATCH \`/crm/v3/objects/deals/{dealId}\` \u2014 \u53D6\u5F15\u3092\u66F4\u65B0
27808
+ - POST \`/crm/v3/objects/{objectType}/search\` \u2014 \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3092\u691C\u7D22
27809
+
27810
+ #### \u30AF\u30A8\u30EA\u30D1\u30E9\u30E1\u30FC\u30BF
27811
+ - \`limit\` \u2014 \u30DA\u30FC\u30B8\u3042\u305F\u308A\u306E\u7D50\u679C\u6570\uFF08\u6700\u5927100\uFF09
27812
+ - \`after\` \u2014 \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u30AB\u30FC\u30BD\u30EB
27813
+ - \`properties\` \u2014 \u8FD4\u5374\u3059\u308B\u30D7\u30ED\u30D1\u30C6\u30A3\u306E\u30AB\u30F3\u30DE\u533A\u5207\u308A\u30EA\u30B9\u30C8
27814
+ - \`associations\` \u2014 \u542B\u3081\u308B\u30A2\u30BD\u30B7\u30A8\u30FC\u30B7\u30E7\u30F3\u30BF\u30A4\u30D7\u306E\u30AB\u30F3\u30DE\u533A\u5207\u308A\u30EA\u30B9\u30C8
27815
+
27816
+ #### \u691C\u7D22\u30DC\u30C7\u30A3 (POST /crm/v3/objects/{objectType}/search)
27817
+ - \`filterGroups\` \u2014 \u30D5\u30A3\u30EB\u30BF\u30B0\u30EB\u30FC\u30D7\u306E\u914D\u5217\uFF08\`filters\`: propertyName, operator, value\uFF09
27818
+ - \`sorts\` \u2014 \u30BD\u30FC\u30C8\u6307\u5B9A\u306E\u914D\u5217
27819
+ - \`properties\` \u2014 \u8FD4\u5374\u3059\u308B\u30D7\u30ED\u30D1\u30C6\u30A3\u306E\u914D\u5217
27820
+ - \`limit\` \u2014 \u30DA\u30FC\u30B8\u3042\u305F\u308A\u306E\u6700\u5927\u7D50\u679C\u6570\uFF08\u6700\u5927100\uFF09
27821
+ - \`after\` \u2014 \u30DA\u30FC\u30B8\u30CD\u30FC\u30B7\u30E7\u30F3\u30AA\u30D5\u30BB\u30C3\u30C8`
27822
+ },
27823
+ tools: tools33
27824
+ });
27825
+
26722
27826
  // ../connectors/src/connectors/registry.ts
26723
27827
  var plugins = {
26724
27828
  snowflake: snowflakeConnector,
@@ -26752,7 +27856,8 @@ var plugins = {
26752
27856
  slack: slackConnector,
26753
27857
  shopifyOauth: shopifyOauthConnector,
26754
27858
  msTeams: msTeamsConnector,
26755
- msTeamsOauth: msTeamsOauthConnector
27859
+ msTeamsOauth: msTeamsOauthConnector,
27860
+ hubspot: hubspotConnector
26756
27861
  };
26757
27862
  var connectors = {
26758
27863
  ...plugins,
@@ -26969,62 +28074,62 @@ import { watch as fsWatch2 } from "fs";
26969
28074
  import path2 from "path";
26970
28075
 
26971
28076
  // src/types/server-logic.ts
26972
- import { z as z32 } from "zod";
26973
- var parameterMetaSchema = z32.object({
26974
- name: z32.string(),
26975
- type: z32.enum(["string", "number", "boolean"]),
26976
- description: z32.string(),
26977
- required: z32.boolean().optional(),
26978
- default: z32.union([z32.string(), z32.number(), z32.boolean()]).optional()
26979
- });
26980
- var serverLogicCacheConfigSchema = z32.object({
26981
- ttl: z32.number(),
26982
- staleWhileRevalidate: z32.boolean().optional()
26983
- });
26984
- var serverLogicSchemaObjectSchema = z32.lazy(
26985
- () => z32.object({
26986
- type: z32.enum(["string", "number", "integer", "boolean", "object", "array", "null"]).optional(),
26987
- format: z32.string().optional(),
26988
- description: z32.string().optional(),
26989
- nullable: z32.boolean().optional(),
26990
- enum: z32.array(z32.union([z32.string(), z32.number(), z32.boolean(), z32.null()])).optional(),
28077
+ import { z as z36 } from "zod";
28078
+ var parameterMetaSchema = z36.object({
28079
+ name: z36.string(),
28080
+ type: z36.enum(["string", "number", "boolean"]),
28081
+ description: z36.string(),
28082
+ required: z36.boolean().optional(),
28083
+ default: z36.union([z36.string(), z36.number(), z36.boolean()]).optional()
28084
+ });
28085
+ var serverLogicCacheConfigSchema = z36.object({
28086
+ ttl: z36.number(),
28087
+ staleWhileRevalidate: z36.boolean().optional()
28088
+ });
28089
+ var serverLogicSchemaObjectSchema = z36.lazy(
28090
+ () => z36.object({
28091
+ type: z36.enum(["string", "number", "integer", "boolean", "object", "array", "null"]).optional(),
28092
+ format: z36.string().optional(),
28093
+ description: z36.string().optional(),
28094
+ nullable: z36.boolean().optional(),
28095
+ enum: z36.array(z36.union([z36.string(), z36.number(), z36.boolean(), z36.null()])).optional(),
26991
28096
  items: serverLogicSchemaObjectSchema.optional(),
26992
- properties: z32.record(z32.string(), serverLogicSchemaObjectSchema).optional(),
26993
- required: z32.array(z32.string()).optional(),
26994
- additionalProperties: z32.union([z32.boolean(), serverLogicSchemaObjectSchema]).optional(),
26995
- minimum: z32.number().optional(),
26996
- maximum: z32.number().optional(),
26997
- minLength: z32.number().optional(),
26998
- maxLength: z32.number().optional(),
26999
- pattern: z32.string().optional()
28097
+ properties: z36.record(z36.string(), serverLogicSchemaObjectSchema).optional(),
28098
+ required: z36.array(z36.string()).optional(),
28099
+ additionalProperties: z36.union([z36.boolean(), serverLogicSchemaObjectSchema]).optional(),
28100
+ minimum: z36.number().optional(),
28101
+ maximum: z36.number().optional(),
28102
+ minLength: z36.number().optional(),
28103
+ maxLength: z36.number().optional(),
28104
+ pattern: z36.string().optional()
27000
28105
  })
27001
28106
  );
27002
- var serverLogicMediaTypeSchema = z32.object({
28107
+ var serverLogicMediaTypeSchema = z36.object({
27003
28108
  schema: serverLogicSchemaObjectSchema.optional(),
27004
- example: z32.unknown().optional()
28109
+ example: z36.unknown().optional()
27005
28110
  });
27006
- var serverLogicResponseSchema = z32.object({
27007
- description: z32.string().optional(),
27008
- content: z32.record(z32.string(), serverLogicMediaTypeSchema).optional()
28111
+ var serverLogicResponseSchema = z36.object({
28112
+ description: z36.string().optional(),
28113
+ content: z36.record(z36.string(), serverLogicMediaTypeSchema).optional()
27009
28114
  });
27010
28115
  var jsonBaseFields = {
27011
- description: z32.string(),
27012
- parameters: z32.array(parameterMetaSchema).optional(),
28116
+ description: z36.string(),
28117
+ parameters: z36.array(parameterMetaSchema).optional(),
27013
28118
  response: serverLogicResponseSchema.optional(),
27014
28119
  cache: serverLogicCacheConfigSchema.optional()
27015
28120
  };
27016
- var jsonSqlServerLogicSchema = z32.object({
28121
+ var jsonSqlServerLogicSchema = z36.object({
27017
28122
  ...jsonBaseFields,
27018
- type: z32.literal("sql").optional(),
27019
- query: z32.string(),
27020
- connectionId: z32.string()
28123
+ type: z36.literal("sql").optional(),
28124
+ query: z36.string(),
28125
+ connectionId: z36.string()
27021
28126
  });
27022
- var jsonTypeScriptServerLogicSchema = z32.object({
28127
+ var jsonTypeScriptServerLogicSchema = z36.object({
27023
28128
  ...jsonBaseFields,
27024
- type: z32.literal("typescript"),
27025
- handlerPath: z32.string()
28129
+ type: z36.literal("typescript"),
28130
+ handlerPath: z36.string()
27026
28131
  });
27027
- var anyJsonServerLogicSchema = z32.union([
28132
+ var anyJsonServerLogicSchema = z36.union([
27028
28133
  jsonTypeScriptServerLogicSchema,
27029
28134
  jsonSqlServerLogicSchema
27030
28135
  ]);