@hubspot/cli 7.9.0 → 7.9.1-experimental.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.
Files changed (214) hide show
  1. package/bin/cli.js +5 -4
  2. package/commands/__tests__/getStarted.test.js +10 -0
  3. package/commands/__tests__/project.test.js +2 -0
  4. package/commands/account/__tests__/rename.test.js +42 -0
  5. package/commands/account/auth.js +10 -14
  6. package/commands/account/clean.js +11 -19
  7. package/commands/account/createOverride.js +17 -23
  8. package/commands/account/info.js +8 -5
  9. package/commands/account/list.js +13 -18
  10. package/commands/account/remove.js +23 -22
  11. package/commands/account/removeOverride.js +8 -16
  12. package/commands/account/rename.d.ts +1 -1
  13. package/commands/account/rename.js +6 -3
  14. package/commands/account/use.js +19 -8
  15. package/commands/app/__tests__/migrate.test.js +8 -4
  16. package/commands/app/migrate.js +2 -2
  17. package/commands/auth.js +18 -14
  18. package/commands/cms/theme/preview.js +1 -4
  19. package/commands/config/migrate.js +5 -5
  20. package/commands/config/set.js +1 -2
  21. package/commands/customObject/createSchema.js +2 -3
  22. package/commands/customObject/updateSchema.js +2 -3
  23. package/commands/getStarted.js +15 -22
  24. package/commands/hubdb/__tests__/list.test.js +1 -0
  25. package/commands/hubdb/list.js +2 -2
  26. package/commands/hubdb.d.ts +1 -1
  27. package/commands/init.js +36 -32
  28. package/commands/project/__tests__/deploy.test.js +10 -5
  29. package/commands/project/__tests__/devUnifiedFlow.test.js +6 -4
  30. package/commands/project/__tests__/logs.test.js +4 -0
  31. package/commands/project/__tests__/updateDeps.test.js +142 -0
  32. package/commands/project/__tests__/validate.test.js +2 -2
  33. package/commands/project/cloneApp.js +2 -2
  34. package/commands/project/create.js +0 -1
  35. package/commands/project/deploy.js +2 -2
  36. package/commands/project/dev/deprecatedFlow.js +4 -5
  37. package/commands/project/dev/index.js +14 -4
  38. package/commands/project/dev/unifiedFlow.js +4 -5
  39. package/commands/project/listBuilds.js +7 -1
  40. package/commands/project/logs.js +2 -3
  41. package/commands/project/profile/add.js +6 -7
  42. package/commands/project/profile/delete.js +2 -2
  43. package/commands/project/updateDeps.d.ts +6 -0
  44. package/commands/project/updateDeps.js +80 -0
  45. package/commands/project/upload.js +9 -3
  46. package/commands/project/validate.js +9 -3
  47. package/commands/project/watch.js +7 -2
  48. package/commands/project.js +2 -0
  49. package/commands/sandbox/__tests__/create.test.js +14 -5
  50. package/commands/sandbox/create.js +4 -5
  51. package/commands/sandbox/delete.js +23 -20
  52. package/commands/testAccount/__tests__/create.test.js +68 -0
  53. package/commands/testAccount/create.d.ts +8 -0
  54. package/commands/testAccount/create.js +135 -45
  55. package/commands/testAccount/delete.js +9 -8
  56. package/commands/testAccount/importData.d.ts +1 -1
  57. package/lang/en.d.ts +3199 -3185
  58. package/lang/en.js +52 -14
  59. package/lib/__tests__/buildAccount.test.js +22 -30
  60. package/lib/__tests__/commonOpts.test.js +9 -13
  61. package/lib/__tests__/dependencyManagement.test.js +273 -1
  62. package/lib/__tests__/developerTestAccounts.test.js +29 -17
  63. package/lib/__tests__/importData.test.js +20 -10
  64. package/lib/__tests__/oauth.test.js +19 -8
  65. package/lib/__tests__/sandboxSync.test.js +33 -11
  66. package/lib/__tests__/sandboxes.test.js +30 -19
  67. package/lib/__tests__/usageTracking.test.js +10 -10
  68. package/lib/__tests__/validation.test.js +32 -32
  69. package/lib/accountTypes.d.ts +9 -9
  70. package/lib/accountTypes.js +2 -4
  71. package/lib/app/__tests__/migrate.test.js +15 -0
  72. package/lib/app/__tests__/migrate_legacy.test.js +9 -0
  73. package/lib/app/migrate_legacy.d.ts +2 -2
  74. package/lib/buildAccount.d.ts +4 -4
  75. package/lib/buildAccount.js +7 -14
  76. package/lib/commonOpts.js +5 -8
  77. package/lib/configMigrate.d.ts +2 -2
  78. package/lib/configMigrate.js +42 -18
  79. package/lib/configOptions.js +3 -2
  80. package/lib/constants.d.ts +1 -0
  81. package/lib/constants.js +6 -0
  82. package/lib/dependencyManagement.d.ts +8 -2
  83. package/lib/dependencyManagement.js +75 -12
  84. package/lib/developerTestAccounts.d.ts +3 -3
  85. package/lib/developerTestAccounts.js +4 -7
  86. package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -1
  87. package/lib/doctor/DiagnosticInfoBuilder.js +9 -6
  88. package/lib/doctor/Doctor.js +4 -3
  89. package/lib/doctor/__tests__/Diagnosis.test.js +4 -3
  90. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.js +17 -9
  91. package/lib/doctor/__tests__/Doctor.test.js +14 -0
  92. package/lib/importData.js +8 -7
  93. package/lib/links.js +5 -5
  94. package/lib/mcp/__tests__/setup.test.d.ts +1 -0
  95. package/lib/mcp/__tests__/setup.test.js +127 -0
  96. package/lib/mcp/setup.d.ts +4 -12
  97. package/lib/mcp/setup.js +34 -1
  98. package/lib/middleware/__test__/commandTargetingUtils.test.js +3 -3
  99. package/lib/middleware/__test__/configMiddleware.test.js +23 -22
  100. package/lib/middleware/__test__/gitMiddleware.test.js +9 -7
  101. package/lib/middleware/autoUpdateMiddleware.d.ts +3 -1
  102. package/lib/middleware/autoUpdateMiddleware.js +10 -2
  103. package/lib/middleware/commandTargetingUtils.js +2 -2
  104. package/lib/middleware/configMiddleware.d.ts +6 -1
  105. package/lib/middleware/configMiddleware.js +36 -15
  106. package/lib/middleware/gitMiddleware.js +8 -4
  107. package/lib/npm.d.ts +3 -0
  108. package/lib/npm.js +6 -0
  109. package/lib/oauth.d.ts +2 -2
  110. package/lib/oauth.js +8 -10
  111. package/lib/projects/__tests__/AppDevModeInterface.test.js +17 -6
  112. package/lib/projects/__tests__/DevServerManager.test.js +1 -0
  113. package/lib/projects/__tests__/LocalDevProcess.test.js +1 -0
  114. package/lib/projects/__tests__/components.test.js +148 -24
  115. package/lib/projects/__tests__/deploy.test.js +1 -0
  116. package/lib/projects/__tests__/platformVersion.test.js +5 -1
  117. package/lib/projects/__tests__/projects.test.js +13 -42
  118. package/lib/projects/components.js +76 -20
  119. package/lib/projects/config.js +5 -9
  120. package/lib/projects/create/__tests__/v2.test.js +11 -0
  121. package/lib/projects/localDev/AppDevModeInterface.js +2 -2
  122. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +2 -2
  123. package/lib/projects/localDev/LocalDevLogger.js +4 -4
  124. package/lib/projects/localDev/LocalDevManager_DEPRECATED.js +3 -3
  125. package/lib/projects/localDev/helpers/account.d.ts +10 -10
  126. package/lib/projects/localDev/helpers/account.js +6 -11
  127. package/lib/projects/platformVersion.js +1 -1
  128. package/lib/projects/urls.js +5 -6
  129. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.d.ts +1 -0
  130. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.js +153 -0
  131. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +7 -5
  132. package/lib/prompts/accountNamePrompt.js +3 -3
  133. package/lib/prompts/accountsPrompt.d.ts +1 -1
  134. package/lib/prompts/accountsPrompt.js +6 -7
  135. package/lib/prompts/confirmImportDataPrompt.js +2 -2
  136. package/lib/prompts/createDeveloperTestAccountConfigPrompt.d.ts +5 -0
  137. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +76 -66
  138. package/lib/prompts/downloadProjectPrompt.d.ts +1 -0
  139. package/lib/prompts/downloadProjectPrompt.js +5 -2
  140. package/lib/prompts/importDataTestAccountSelectPrompt.js +4 -5
  141. package/lib/prompts/personalAccessKeyPrompt.js +2 -2
  142. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +3 -3
  143. package/lib/prompts/projectDevTargetAccountPrompt.js +5 -7
  144. package/lib/prompts/sandboxesPrompt.js +7 -8
  145. package/lib/prompts/setAsDefaultAccountPrompt.js +7 -6
  146. package/lib/sandboxSync.d.ts +2 -2
  147. package/lib/sandboxSync.js +3 -9
  148. package/lib/sandboxes.d.ts +4 -4
  149. package/lib/sandboxes.js +6 -11
  150. package/lib/serverlessLogs.js +2 -2
  151. package/lib/theme/__tests__/migrate.test.js +15 -0
  152. package/lib/ui/index.js +6 -3
  153. package/lib/usageTracking.js +15 -8
  154. package/lib/validation.js +13 -11
  155. package/mcp-server/tools/cms/HsCreateFunctionTool.js +8 -2
  156. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +4 -4
  157. package/mcp-server/tools/cms/HsCreateModuleTool.js +8 -2
  158. package/mcp-server/tools/cms/HsCreateTemplateTool.js +8 -2
  159. package/mcp-server/tools/cms/HsFunctionLogsTool.d.ts +4 -4
  160. package/mcp-server/tools/cms/HsFunctionLogsTool.js +6 -2
  161. package/mcp-server/tools/cms/HsListFunctionsTool.js +5 -1
  162. package/mcp-server/tools/cms/HsListTool.js +5 -1
  163. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.js +1 -0
  164. package/mcp-server/tools/index.js +4 -0
  165. package/mcp-server/tools/project/AddFeatureToProjectTool.d.ts +1 -1
  166. package/mcp-server/tools/project/AddFeatureToProjectTool.js +9 -3
  167. package/mcp-server/tools/project/CreateProjectTool.js +8 -2
  168. package/mcp-server/tools/project/CreateTestAccountTool.d.ts +41 -0
  169. package/mcp-server/tools/project/CreateTestAccountTool.js +150 -0
  170. package/mcp-server/tools/project/DeployProjectTool.d.ts +1 -1
  171. package/mcp-server/tools/project/DeployProjectTool.js +8 -2
  172. package/mcp-server/tools/project/DocFetchTool.d.ts +1 -1
  173. package/mcp-server/tools/project/DocFetchTool.js +9 -5
  174. package/mcp-server/tools/project/DocsSearchTool.d.ts +1 -1
  175. package/mcp-server/tools/project/DocsSearchTool.js +12 -8
  176. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +1 -1
  177. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +11 -7
  178. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +1 -1
  179. package/mcp-server/tools/project/GetApplicationInfoTool.js +11 -7
  180. package/mcp-server/tools/project/GetBuildStatusTool.d.ts +26 -0
  181. package/mcp-server/tools/project/GetBuildStatusTool.js +164 -0
  182. package/mcp-server/tools/project/GetConfigValuesTool.d.ts +1 -1
  183. package/mcp-server/tools/project/GetConfigValuesTool.js +11 -7
  184. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +1 -1
  185. package/mcp-server/tools/project/GuidedWalkthroughTool.js +7 -3
  186. package/mcp-server/tools/project/UploadProjectTools.d.ts +9 -3
  187. package/mcp-server/tools/project/UploadProjectTools.js +51 -5
  188. package/mcp-server/tools/project/ValidateProjectTool.d.ts +1 -1
  189. package/mcp-server/tools/project/ValidateProjectTool.js +7 -3
  190. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.d.ts +1 -0
  191. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.js +454 -0
  192. package/mcp-server/tools/project/__tests__/DocFetchTool.test.js +5 -1
  193. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +25 -13
  194. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +7 -5
  195. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +7 -5
  196. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.d.ts +1 -0
  197. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.js +240 -0
  198. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +8 -6
  199. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.js +56 -4
  200. package/mcp-server/utils/__tests__/content.test.js +21 -20
  201. package/mcp-server/utils/__tests__/feedbackTracking.test.js +33 -28
  202. package/mcp-server/utils/content.d.ts +1 -1
  203. package/mcp-server/utils/content.js +2 -2
  204. package/mcp-server/utils/feedbackTracking.d.ts +1 -1
  205. package/mcp-server/utils/feedbackTracking.js +3 -3
  206. package/mcp-server/utils/toolUsageTracking.js +4 -3
  207. package/package.json +8 -7
  208. package/lang/en.lyaml +0 -1508
  209. package/lib/lang.d.ts +0 -8
  210. package/lib/lang.js +0 -72
  211. package/mcp-server/utils/__tests__/cliConfig.test.js +0 -110
  212. package/mcp-server/utils/cliConfig.d.ts +0 -1
  213. package/mcp-server/utils/cliConfig.js +0 -12
  214. /package/{mcp-server/utils/__tests__/cliConfig.test.d.ts → commands/project/__tests__/updateDeps.test.d.ts} +0 -0
@@ -4,7 +4,7 @@ import { formatTextContents } from '../../utils/content.js';
4
4
  import { absoluteCurrentWorkingDirectory } from './constants.js';
5
5
  import { getIntermediateRepresentationSchema, mapToInternalType, } from '@hubspot/project-parsing-lib';
6
6
  import { isV2Project } from '../../../lib/projects/platformVersion.js';
7
- import { getAccountIdFromCliConfig } from '../../utils/cliConfig.js';
7
+ import { getConfigDefaultAccountIfExists } from '@hubspot/local-dev-lib/config';
8
8
  const inputSchema = {
9
9
  absoluteCurrentWorkingDirectory,
10
10
  platformVersion: z
@@ -23,15 +23,15 @@ export class GetConfigValuesTool extends Tool {
23
23
  constructor(mcpServer) {
24
24
  super(mcpServer);
25
25
  }
26
- async handler({ absoluteCurrentWorkingDirectory, platformVersion, featureType, }) {
26
+ async handler({ platformVersion, featureType, }) {
27
27
  try {
28
28
  if (!isV2Project(platformVersion)) {
29
- return formatTextContents(absoluteCurrentWorkingDirectory, `Can only be used on projects with a minimum platformVersion of 2025.2`);
29
+ return formatTextContents(`Can only be used on projects with a minimum platformVersion of 2025.2`);
30
30
  }
31
- const accountId = getAccountIdFromCliConfig(absoluteCurrentWorkingDirectory);
31
+ const accountId = getConfigDefaultAccountIfExists()?.accountId;
32
32
  if (!accountId) {
33
33
  const authErrorMessage = `No account ID found. Please run \`hs account auth\` to configure an account, or set a default account with \`hs account use <account>\``;
34
- return formatTextContents(absoluteCurrentWorkingDirectory, authErrorMessage);
34
+ return formatTextContents(authErrorMessage);
35
35
  }
36
36
  const schema = await getIntermediateRepresentationSchema({
37
37
  platformVersion,
@@ -40,11 +40,11 @@ export class GetConfigValuesTool extends Tool {
40
40
  });
41
41
  const internalComponentType = mapToInternalType(featureType);
42
42
  if (schema[internalComponentType]) {
43
- return formatTextContents(absoluteCurrentWorkingDirectory, JSON.stringify({ config: schema[internalComponentType] }));
43
+ return formatTextContents(JSON.stringify({ config: schema[internalComponentType] }));
44
44
  }
45
45
  }
46
46
  catch (error) { }
47
- return formatTextContents(absoluteCurrentWorkingDirectory, `Unable to locate JSON schema for type ${featureType}`);
47
+ return formatTextContents(`Unable to locate JSON schema for type ${featureType}`);
48
48
  }
49
49
  register() {
50
50
  return this.mcpServer.registerTool(toolName, {
@@ -53,6 +53,10 @@ export class GetConfigValuesTool extends Tool {
53
53
  This should be called before editing a '-hsmeta.json' file to get the list of possible values and restrictions on those values.
54
54
  This will only work for projects with platformVersion 2025.2 and beyond`,
55
55
  inputSchema,
56
+ annotations: {
57
+ readOnlyHint: true,
58
+ openWorldHint: false,
59
+ },
56
60
  }, this.handler);
57
61
  }
58
62
  }
@@ -14,7 +14,7 @@ declare const inputSchemaZodObject: z.ZodObject<{
14
14
  type InputSchemaType = z.infer<typeof inputSchemaZodObject>;
15
15
  export declare class GuidedWalkthroughTool extends Tool<InputSchemaType> {
16
16
  constructor(mcpServer: McpServer);
17
- handler({ absoluteCurrentWorkingDirectory, command, }: InputSchemaType): Promise<TextContentResponse>;
17
+ handler({ command }: InputSchemaType): Promise<TextContentResponse>;
18
18
  register(): RegisteredTool;
19
19
  }
20
20
  export {};
@@ -31,19 +31,23 @@ export class GuidedWalkthroughTool extends Tool {
31
31
  constructor(mcpServer) {
32
32
  super(mcpServer);
33
33
  }
34
- async handler({ absoluteCurrentWorkingDirectory, command, }) {
34
+ async handler({ command }) {
35
35
  await trackToolUsage(toolName);
36
36
  if (command) {
37
37
  const { stdout } = await execAsync(`${command} --help`);
38
- return formatTextContents(absoluteCurrentWorkingDirectory, `Display this help output for the user amd wait for them to acknowledge: ${stdout}. ${nextCommands[command] ? `Once they are ready, A good command to look at next is ${nextCommands[command]}` : ''}`);
38
+ return formatTextContents(`Display this help output for the user amd wait for them to acknowledge: ${stdout}. ${nextCommands[command] ? `Once they are ready, A good command to look at next is ${nextCommands[command]}` : ''}`);
39
39
  }
40
- return formatTextContents(absoluteCurrentWorkingDirectory, 'Is there another command you would like to learn more about?');
40
+ return formatTextContents('Is there another command you would like to learn more about?');
41
41
  }
42
42
  register() {
43
43
  return this.mcpServer.registerTool(toolName, {
44
44
  title: 'Guided walkthrough of the CLI',
45
45
  description: 'Give the user a guided walkthrough of the HubSpot CLI.',
46
46
  inputSchema,
47
+ annotations: {
48
+ readOnlyHint: true,
49
+ openWorldHint: false,
50
+ },
47
51
  }, this.handler);
48
52
  }
49
53
  }
@@ -1,20 +1,26 @@
1
- import { TextContentResponse, Tool } from '../../types.js';
2
- import { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';
3
1
  import z from 'zod';
2
+ import { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { TextContentResponse, Tool } from '../../types.js';
4
4
  declare const inputSchemaZodObject: z.ZodObject<{
5
5
  absoluteProjectPath: z.ZodString;
6
6
  absoluteCurrentWorkingDirectory: z.ZodString;
7
+ uploadMessage: z.ZodString;
8
+ profile: z.ZodOptional<z.ZodString>;
7
9
  }, "strip", z.ZodTypeAny, {
10
+ uploadMessage: string;
8
11
  absoluteProjectPath: string;
9
12
  absoluteCurrentWorkingDirectory: string;
13
+ profile?: string | undefined;
10
14
  }, {
15
+ uploadMessage: string;
11
16
  absoluteProjectPath: string;
12
17
  absoluteCurrentWorkingDirectory: string;
18
+ profile?: string | undefined;
13
19
  }>;
14
20
  type InputSchemaType = z.infer<typeof inputSchemaZodObject>;
15
21
  export declare class UploadProjectTools extends Tool<InputSchemaType> {
16
22
  constructor(mcpServer: McpServer);
17
- handler({ absoluteProjectPath, absoluteCurrentWorkingDirectory, }: InputSchemaType): Promise<TextContentResponse>;
23
+ handler({ absoluteProjectPath, profile, uploadMessage, }: InputSchemaType): Promise<TextContentResponse>;
18
24
  register(): RegisteredTool;
19
25
  }
20
26
  export {};
@@ -1,12 +1,22 @@
1
+ import path from 'path';
2
+ import z from 'zod';
3
+ import { getAllHsProfiles } from '@hubspot/project-parsing-lib';
4
+ import { getProjectConfig } from '../../../lib/projects/config.js';
1
5
  import { Tool } from '../../types.js';
2
6
  import { runCommandInDir } from '../../utils/project.js';
3
7
  import { absoluteCurrentWorkingDirectory, absoluteProjectPath, } from './constants.js';
4
- import z from 'zod';
5
- import { formatTextContents } from '../../utils/content.js';
8
+ import { formatTextContent, formatTextContents } from '../../utils/content.js';
6
9
  import { trackToolUsage } from '../../utils/toolUsageTracking.js';
10
+ import { addFlag } from '../../utils/command.js';
7
11
  const inputSchema = {
8
12
  absoluteProjectPath,
9
13
  absoluteCurrentWorkingDirectory,
14
+ uploadMessage: z
15
+ .string()
16
+ .describe('A 1 sentence message that concisely describes the changes that are being uploaded.'),
17
+ profile: z
18
+ .optional(z.string())
19
+ .describe('CRITICAL: If the user has not explicitly specified a profile name, you MUST ask them which profile to use. NEVER automatically choose a profile based on files you see in the directory (e.g., seeing "hsprofile.prod.json" does NOT mean you should use "prod"). The profile to be used for the upload. All projects configured to use profiles must specify a profile when uploading. Profile files have the following format: "hsprofile.<profile>.json".'),
10
20
  };
11
21
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
12
22
  const inputSchemaZodObject = z.object({
@@ -17,16 +27,52 @@ export class UploadProjectTools extends Tool {
17
27
  constructor(mcpServer) {
18
28
  super(mcpServer);
19
29
  }
20
- async handler({ absoluteProjectPath, absoluteCurrentWorkingDirectory, }) {
30
+ async handler({ absoluteProjectPath, profile, uploadMessage, }) {
21
31
  await trackToolUsage(toolName);
22
- const { stdout, stderr } = await runCommandInDir(absoluteProjectPath, `hs project upload --force-create`);
23
- return formatTextContents(absoluteCurrentWorkingDirectory, stdout, stderr);
32
+ let command = addFlag('hs project upload', 'force-create', true);
33
+ const content = [];
34
+ if (uploadMessage) {
35
+ command = addFlag(command, 'message', uploadMessage);
36
+ }
37
+ if (profile) {
38
+ command = addFlag(command, 'profile', profile);
39
+ }
40
+ else {
41
+ let hasProfiles = false;
42
+ try {
43
+ const { projectConfig } = await getProjectConfig(absoluteProjectPath);
44
+ if (projectConfig) {
45
+ const profiles = await getAllHsProfiles(path.join(absoluteProjectPath, projectConfig.srcDir));
46
+ hasProfiles = profiles.length > 0;
47
+ }
48
+ }
49
+ catch (e) {
50
+ // If any of these checks fail, the safest thing to do is to assume there are no profiles.
51
+ hasProfiles = false;
52
+ }
53
+ if (hasProfiles) {
54
+ content.push(formatTextContent(`Ask the user which profile they would like to use for the upload.`));
55
+ }
56
+ }
57
+ if (content.length > 0) {
58
+ return {
59
+ content,
60
+ };
61
+ }
62
+ const { stdout, stderr } = await runCommandInDir(absoluteProjectPath, command);
63
+ return formatTextContents(stdout, stderr);
24
64
  }
25
65
  register() {
26
66
  return this.mcpServer.registerTool(toolName, {
27
67
  title: 'Upload HubSpot Project',
28
68
  description: 'DO NOT run this tool unless the user specifies they would like to upload the project, it is potentially destructive. Uploads the HubSpot project in current working directory. If the project does not exist, it will be created. MUST be ran from within the project directory.',
29
69
  inputSchema,
70
+ annotations: {
71
+ readOnlyHint: false,
72
+ destructiveHint: true,
73
+ idempotentHint: true,
74
+ openWorldHint: true,
75
+ },
30
76
  }, this.handler);
31
77
  }
32
78
  }
@@ -14,7 +14,7 @@ declare const inputSchemaZodObject: z.ZodObject<{
14
14
  export type CreateProjectInputSchema = z.infer<typeof inputSchemaZodObject>;
15
15
  export declare class ValidateProjectTool extends Tool<CreateProjectInputSchema> {
16
16
  constructor(mcpServer: McpServer);
17
- handler({ absoluteProjectPath, absoluteCurrentWorkingDirectory, }: CreateProjectInputSchema): Promise<TextContentResponse>;
17
+ handler({ absoluteProjectPath, }: CreateProjectInputSchema): Promise<TextContentResponse>;
18
18
  register(): RegisteredTool;
19
19
  }
20
20
  export {};
@@ -15,14 +15,14 @@ export class ValidateProjectTool extends Tool {
15
15
  constructor(mcpServer) {
16
16
  super(mcpServer);
17
17
  }
18
- async handler({ absoluteProjectPath, absoluteCurrentWorkingDirectory, }) {
18
+ async handler({ absoluteProjectPath, }) {
19
19
  await trackToolUsage(toolName);
20
20
  try {
21
21
  const { stdout, stderr } = await runCommandInDir(absoluteProjectPath, 'hs project validate');
22
- return formatTextContents(absoluteCurrentWorkingDirectory, stdout, stderr);
22
+ return formatTextContents(stdout, stderr);
23
23
  }
24
24
  catch (error) {
25
- return formatTextContents(absoluteCurrentWorkingDirectory, error instanceof Error ? error.message : `${error}`);
25
+ return formatTextContents(error instanceof Error ? error.message : `${error}`);
26
26
  }
27
27
  }
28
28
  register() {
@@ -30,6 +30,10 @@ export class ValidateProjectTool extends Tool {
30
30
  title: 'Validate HubSpot Project',
31
31
  description: 'Validates the HubSpot project and its configuration files. This tool does not need to be ran before uploading the project',
32
32
  inputSchema,
33
+ annotations: {
34
+ readOnlyHint: true,
35
+ openWorldHint: false,
36
+ },
33
37
  }, this.handler);
34
38
  }
35
39
  }