@acquis-consulting/asm 1.0.5

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 (203) hide show
  1. package/README.md +0 -0
  2. package/dist/apps/gitDiffReview/gitDiffParser.d.ts +6 -0
  3. package/dist/apps/gitDiffReview/gitDiffParser.js +1 -0
  4. package/dist/apps/gitDiffReview/packageXml.d.ts +8 -0
  5. package/dist/apps/gitDiffReview/packageXml.js +1 -0
  6. package/dist/apps/gitDiffReview/tools.d.ts +42 -0
  7. package/dist/apps/gitDiffReview/tools.js +1 -0
  8. package/dist/apps/gitDiffReview/types.d.ts +19 -0
  9. package/dist/apps/gitDiffReview/types.js +1 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.js +193 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/metadata-diff.html +98 -0
  14. package/dist/tools/aggregateQuery.d.ts +85 -0
  15. package/dist/tools/aggregateQuery.js +110 -0
  16. package/dist/tools/aggregateQuery.js.map +1 -0
  17. package/dist/tools/bulkExportAbort.d.ts +37 -0
  18. package/dist/tools/bulkExportAbort.js +44 -0
  19. package/dist/tools/bulkExportAbort.js.map +1 -0
  20. package/dist/tools/bulkExportResults.d.ts +51 -0
  21. package/dist/tools/bulkExportResults.js +76 -0
  22. package/dist/tools/bulkExportResults.js.map +1 -0
  23. package/dist/tools/bulkExportStart.d.ts +61 -0
  24. package/dist/tools/bulkExportStart.js +68 -0
  25. package/dist/tools/bulkExportStart.js.map +1 -0
  26. package/dist/tools/bulkExportStatus.d.ts +37 -0
  27. package/dist/tools/bulkExportStatus.js +54 -0
  28. package/dist/tools/bulkExportStatus.js.map +1 -0
  29. package/dist/tools/crossObjectSearch.d.ts +155 -0
  30. package/dist/tools/crossObjectSearch.js +145 -0
  31. package/dist/tools/crossObjectSearch.js.map +1 -0
  32. package/dist/tools/debugLogs.d.ts +106 -0
  33. package/dist/tools/debugLogs.js +189 -0
  34. package/dist/tools/debugLogs.js.map +1 -0
  35. package/dist/tools/deployMetadata.d.ts +60 -0
  36. package/dist/tools/deployMetadata.js +106 -0
  37. package/dist/tools/deployMetadata.js.map +1 -0
  38. package/dist/tools/deployPackage.d.ts +49 -0
  39. package/dist/tools/deployPackage.js +1 -0
  40. package/dist/tools/dml.d.ts +70 -0
  41. package/dist/tools/dml.js +105 -0
  42. package/dist/tools/dml.js.map +1 -0
  43. package/dist/tools/dmlDelete.d.ts +51 -0
  44. package/dist/tools/dmlDelete.js +71 -0
  45. package/dist/tools/dmlDelete.js.map +1 -0
  46. package/dist/tools/executeAnonymous.d.ts +63 -0
  47. package/dist/tools/executeAnonymous.js +77 -0
  48. package/dist/tools/executeAnonymous.js.map +1 -0
  49. package/dist/tools/fieldManagement.d.ts +222 -0
  50. package/dist/tools/fieldManagement.js +234 -0
  51. package/dist/tools/fieldManagement.js.map +1 -0
  52. package/dist/tools/fieldPermissions.d.ts +94 -0
  53. package/dist/tools/fieldPermissions.js +191 -0
  54. package/dist/tools/fieldPermissions.js.map +1 -0
  55. package/dist/tools/getDependencies.d.ts +58 -0
  56. package/dist/tools/getDependencies.js +105 -0
  57. package/dist/tools/getDependencies.js.map +1 -0
  58. package/dist/tools/listUserPermissions.d.ts +36 -0
  59. package/dist/tools/listUserPermissions.js +59 -0
  60. package/dist/tools/listUserPermissions.js.map +1 -0
  61. package/dist/tools/metadataDescribe.d.ts +37 -0
  62. package/dist/tools/metadataDescribe.js +35 -0
  63. package/dist/tools/metadataDescribe.js.map +1 -0
  64. package/dist/tools/metadataDiff.d.ts +66 -0
  65. package/dist/tools/metadataDiff.js +215 -0
  66. package/dist/tools/metadataDiff.js.map +1 -0
  67. package/dist/tools/metadataDiffFileDetail.d.ts +44 -0
  68. package/dist/tools/metadataDiffFileDetail.js +84 -0
  69. package/dist/tools/metadataDiffFileDetail.js.map +1 -0
  70. package/dist/tools/metadataDiffFiles.d.ts +37 -0
  71. package/dist/tools/metadataDiffFiles.js +72 -0
  72. package/dist/tools/metadataDiffFiles.js.map +1 -0
  73. package/dist/tools/metadataDiffGeneratePackage.d.ts +73 -0
  74. package/dist/tools/metadataDiffGeneratePackage.js +122 -0
  75. package/dist/tools/metadataDiffGeneratePackage.js.map +1 -0
  76. package/dist/tools/metadataImport.d.ts +63 -0
  77. package/dist/tools/metadataImport.js +122 -0
  78. package/dist/tools/metadataImport.js.map +1 -0
  79. package/dist/tools/metadataJobStatus.d.ts +44 -0
  80. package/dist/tools/metadataJobStatus.js +101 -0
  81. package/dist/tools/metadataJobStatus.js.map +1 -0
  82. package/dist/tools/metadataList.d.ts +44 -0
  83. package/dist/tools/metadataList.js +49 -0
  84. package/dist/tools/metadataList.js.map +1 -0
  85. package/dist/tools/metadataRead.d.ts +47 -0
  86. package/dist/tools/metadataRead.js +52 -0
  87. package/dist/tools/metadataRead.js.map +1 -0
  88. package/dist/tools/metadataTypeSchema.d.ts +44 -0
  89. package/dist/tools/metadataTypeSchema.js +101 -0
  90. package/dist/tools/metadataTypeSchema.js.map +1 -0
  91. package/dist/tools/metadataWsdl.d.ts +19 -0
  92. package/dist/tools/metadataWsdl.js +1 -0
  93. package/dist/tools/objectManagement.d.ts +107 -0
  94. package/dist/tools/objectManagement.js +123 -0
  95. package/dist/tools/objectManagement.js.map +1 -0
  96. package/dist/tools/objectPermissions.d.ts +101 -0
  97. package/dist/tools/objectPermissions.js +157 -0
  98. package/dist/tools/objectPermissions.js.map +1 -0
  99. package/dist/tools/objectSchema.d.ts +37 -0
  100. package/dist/tools/objectSchema.js +66 -0
  101. package/dist/tools/objectSchema.js.map +1 -0
  102. package/dist/tools/objectSearch.d.ts +37 -0
  103. package/dist/tools/objectSearch.js +44 -0
  104. package/dist/tools/objectSearch.js.map +1 -0
  105. package/dist/tools/packageStatus.d.ts +24 -0
  106. package/dist/tools/packageStatus.js +1 -0
  107. package/dist/tools/permissionSetAssignment.d.ts +39 -0
  108. package/dist/tools/permissionSetAssignment.js +1 -0
  109. package/dist/tools/readApexClasses.d.ts +50 -0
  110. package/dist/tools/readApexClasses.js +83 -0
  111. package/dist/tools/readApexClasses.js.map +1 -0
  112. package/dist/tools/readApexTriggers.d.ts +50 -0
  113. package/dist/tools/readApexTriggers.js +82 -0
  114. package/dist/tools/readApexTriggers.js.map +1 -0
  115. package/dist/tools/recordPicker.d.ts +48 -0
  116. package/dist/tools/recordPicker.js +1 -0
  117. package/dist/tools/recordQuery.d.ts +68 -0
  118. package/dist/tools/recordQuery.js +131 -0
  119. package/dist/tools/recordQuery.js.map +1 -0
  120. package/dist/tools/retrieveJobStatus.d.ts +51 -0
  121. package/dist/tools/retrieveJobStatus.js +192 -0
  122. package/dist/tools/retrieveJobStatus.js.map +1 -0
  123. package/dist/tools/retrieveMetadata.d.ts +79 -0
  124. package/dist/tools/retrieveMetadata.js +225 -0
  125. package/dist/tools/retrieveMetadata.js.map +1 -0
  126. package/dist/tools/retrievePackage.d.ts +37 -0
  127. package/dist/tools/retrievePackage.js +1 -0
  128. package/dist/tools/salesforceLogin.d.ts +36 -0
  129. package/dist/tools/salesforceLogin.js +75 -0
  130. package/dist/tools/salesforceLogin.js.map +1 -0
  131. package/dist/tools/selectOrg.d.ts +25 -0
  132. package/dist/tools/selectOrg.js +91 -0
  133. package/dist/tools/selectOrg.js.map +1 -0
  134. package/dist/tools/toolingQuery.d.ts +37 -0
  135. package/dist/tools/toolingQuery.js +54 -0
  136. package/dist/tools/toolingQuery.js.map +1 -0
  137. package/dist/tools/userPermissions.d.ts +76 -0
  138. package/dist/tools/userPermissions.js +130 -0
  139. package/dist/tools/userPermissions.js.map +1 -0
  140. package/dist/tools/versionMetadataComplete.d.ts +45 -0
  141. package/dist/tools/versionMetadataComplete.js +1 -0
  142. package/dist/tools/versionMetadataStart.d.ts +25 -0
  143. package/dist/tools/versionMetadataStart.js +1 -0
  144. package/dist/tools/versionMetadataStatus.d.ts +25 -0
  145. package/dist/tools/versionMetadataStatus.js +1 -0
  146. package/dist/tools/writeApexClasses.d.ts +64 -0
  147. package/dist/tools/writeApexClasses.js +79 -0
  148. package/dist/tools/writeApexClasses.js.map +1 -0
  149. package/dist/tools/writeApexTriggers.d.ts +71 -0
  150. package/dist/tools/writeApexTriggers.js +96 -0
  151. package/dist/tools/writeApexTriggers.js.map +1 -0
  152. package/dist/types/connection.d.ts +20 -0
  153. package/dist/types/connection.js +9 -0
  154. package/dist/types/connection.js.map +1 -0
  155. package/dist/types/index.d.ts +3 -0
  156. package/dist/types/index.js +4 -0
  157. package/dist/types/index.js.map +1 -0
  158. package/dist/types/metadata.d.ts +44 -0
  159. package/dist/types/metadata.js +2 -0
  160. package/dist/types/metadata.js.map +1 -0
  161. package/dist/types/salesforce.d.ts +38 -0
  162. package/dist/types/salesforce.js +2 -0
  163. package/dist/types/salesforce.js.map +1 -0
  164. package/dist/utils/apexContainer.d.ts +18 -0
  165. package/dist/utils/apexContainer.js +79 -0
  166. package/dist/utils/apexContainer.js.map +1 -0
  167. package/dist/utils/connection.d.ts +3 -0
  168. package/dist/utils/connection.js +135 -0
  169. package/dist/utils/connection.js.map +1 -0
  170. package/dist/utils/decomposePermissions.d.ts +16 -0
  171. package/dist/utils/decomposePermissions.js +188 -0
  172. package/dist/utils/decomposePermissions.js.map +1 -0
  173. package/dist/utils/dxPathMapper.d.ts +16 -0
  174. package/dist/utils/dxPathMapper.js +217 -0
  175. package/dist/utils/dxPathMapper.js.map +1 -0
  176. package/dist/utils/errors.d.ts +8 -0
  177. package/dist/utils/errors.js +40 -0
  178. package/dist/utils/errors.js.map +1 -0
  179. package/dist/utils/index.d.ts +2 -0
  180. package/dist/utils/index.js +3 -0
  181. package/dist/utils/index.js.map +1 -0
  182. package/dist/utils/oauthWebFlow.d.ts +8 -0
  183. package/dist/utils/oauthWebFlow.js +172 -0
  184. package/dist/utils/oauthWebFlow.js.map +1 -0
  185. package/dist/utils/packageJobs.d.ts +17 -0
  186. package/dist/utils/packageJobs.js +1 -0
  187. package/dist/utils/packageXml.d.ts +18 -0
  188. package/dist/utils/packageXml.js +1 -0
  189. package/dist/utils/permissionSetResolver.d.ts +14 -0
  190. package/dist/utils/permissionSetResolver.js +1 -0
  191. package/dist/utils/preSelectMatcher.d.ts +18 -0
  192. package/dist/utils/preSelectMatcher.js +1 -0
  193. package/dist/utils/profileCleanup.d.ts +18 -0
  194. package/dist/utils/profileCleanup.js +1 -0
  195. package/dist/utils/retrieveStore.d.ts +12 -0
  196. package/dist/utils/retrieveStore.js +1 -0
  197. package/dist/utils/sfCli.d.ts +18 -0
  198. package/dist/utils/sfCli.js +130 -0
  199. package/dist/utils/sfCli.js.map +1 -0
  200. package/dist/utils/tokenBroker.d.ts +13 -0
  201. package/dist/utils/tokenBroker.js +73 -0
  202. package/dist/utils/tokenBroker.js.map +1 -0
  203. package/package.json +54 -0
package/README.md ADDED
File without changes
@@ -0,0 +1,6 @@
1
+ import type { CategorizedChanges } from './types.js';
2
+ /**
3
+ * Run git diff and parse the results into categorized Salesforce metadata changes.
4
+ * Captures both committed branch differences and uncommitted working tree/staged changes.
5
+ */
6
+ export declare function parseGitDiff(projectDir: string, baseBranch?: string): CategorizedChanges;
@@ -0,0 +1 @@
1
+ import{execSync as e}from"node:child_process";import t from"node:path";const a={classes:"ApexClass",triggers:"ApexTrigger",lwc:"LightningComponentBundle",aura:"AuraDefinitionBundle",flows:"Flow",objects:"CustomObject",layouts:"Layout",permissionsets:"PermissionSet",profiles:"Profile",flexipages:"FlexiPage",staticresources:"StaticResource",pages:"ApexPage",components:"ApexComponent",labels:"CustomLabels",tabs:"CustomTab",customMetadata:"CustomMetadata",email:"EmailTemplate"},n={fields:"CustomField",validationRules:"ValidationRule",recordTypes:"RecordType",listViews:"ListView",webLinks:"WebLink",compactLayouts:"CompactLayout",fieldSets:"FieldSet"},o={A:"Added",M:"Modified",D:"Deleted",R:"Renamed"};function s(e){const t=e.replace(/\\/g,"/").match(/(?:.*\/)?main\/default\/(.+)/);if(!t)return null;const o=t[1].split("/");if(0===o.length)return null;const s=o[0];if("objects"===s&&o.length>=4){const e=o[1],t=o[2],a=n[t];if(a)return{metadataType:a,componentName:`${e}.${o[3].replace(/\.[^.]+(-meta\.xml)?$/,"").replace(/-meta$/,"")}`}}if("objects"===s&&o.length>=2)return{metadataType:"CustomObject",componentName:o[1]};const i=a[s];if(!i)return null;if("lwc"===s||"aura"===s)return o.length<2?null:{metadataType:i,componentName:o[1]};if("labels"===s)return{metadataType:"CustomLabels",componentName:"CustomLabels"};if("email"===s&&o.length>=3)return{metadataType:i,componentName:`${o[1]}/${o[2].replace(/\.[^.]+(-meta\.xml)?$/,"").replace(/-meta$/,"")}`};if(o.length<2)return null;const r=o[o.length-1];return r.endsWith("-meta.xml")&&"objects"!==s?{metadataType:i,componentName:r.replace(/\.[^.]*-meta\.xml$/,"").replace(/-meta\.xml$/,"")}:{metadataType:i,componentName:r.replace(/\.[^.]+$/,"")}}function i(e,t){const a=[];for(const n of e.split("\n")){if(!n.trim())continue;const e=n.split("\t");if(e.length<2)continue;const i=e[0].charAt(0),r=o[i];if(!r)continue;const c="R"===i?e[2]:e[1];if(!c)continue;const m=s(c);if(!m)continue;const l=`${m.metadataType}:${m.componentName}`;t.has(l)||(t.add(l),a.push({status:r,filePath:c,metadataType:m.metadataType,componentName:m.componentName}))}return a}export function parseGitDiff(a,n){const o=t.resolve(a),s=function(t,a){const n={cwd:t,encoding:"utf-8"};if(a)try{return e(`git rev-parse --verify ${a}`,n),a}catch{throw new Error(`Base branch "${a}" does not exist in this repository.`)}for(const t of["origin/main","origin/master","main","master"])try{return e(`git rev-parse --verify ${t}`,n),t}catch{}throw new Error("Could not auto-detect base branch. Please specify baseBranch explicitly.")}(o,n),r={cwd:o,encoding:"utf-8",maxBuffer:10485760},c=e("git diff --relative --name-status HEAD",r),m=new Set,l=i(c,m),p=e("git rev-parse HEAD",r).trim();let u;try{u=e(`git rev-parse ${s}`,r).trim()}catch{u=""}if(p!==u){const t=e(`git diff --relative --name-status ${s}...HEAD`,r);l.push(...i(t,m))}const f={};for(const e of l)f[e.metadataType]||(f[e.metadataType]=[]),f[e.metadataType].push(e);return f}
@@ -0,0 +1,8 @@
1
+ import type { SelectedComponent } from './types.js';
2
+ /**
3
+ * Generate package.xml and optional destructiveChangesPost.xml from selected components.
4
+ */
5
+ export declare function generatePackageXml(components: SelectedComponent[]): {
6
+ packageXml: string;
7
+ destructiveChangesXml: string | null;
8
+ };
@@ -0,0 +1 @@
1
+ function e(e){const s=['<?xml version="1.0" encoding="UTF-8"?>','<Package xmlns="http://soap.sforce.com/2006/04/metadata">'],a=[...e.keys()].sort();for(const n of a){const a=[...e.get(n)].sort();s.push(" <types>");for(const e of a)s.push(` <members>${t(e)}</members>`);s.push(` <name>${n}</name>`),s.push(" </types>")}return s.push(" <version>62.0</version>"),s.push("</Package>"),s.join("\n")}function t(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}export function generatePackageXml(t){const s=new Map,a=new Map;for(const e of t){const t="Deleted"===e.status?a:s;t.has(e.metadataType)||t.set(e.metadataType,[]),t.get(e.metadataType).push(e.componentName)}const n=e(s.size>0?s:a);let o=null;return a.size>0&&s.size>0&&(o=e(a)),{packageXml:n,destructiveChangesXml:o}}
@@ -0,0 +1,42 @@
1
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { CategorizedChanges, SelectedComponent } from './types.js';
3
+ export declare const gitDiffReviewTool: Tool;
4
+ export interface GitDiffReviewArgs {
5
+ projectDir: string;
6
+ baseBranch?: string;
7
+ }
8
+ export declare function handleGitDiffReview(args: GitDiffReviewArgs): Promise<{
9
+ content: {
10
+ type: "text";
11
+ text: string;
12
+ }[];
13
+ isError: boolean;
14
+ } | {
15
+ content: ({
16
+ type: "text";
17
+ text: string;
18
+ resource?: undefined;
19
+ } | {
20
+ type: "resource";
21
+ resource: {
22
+ uri: string;
23
+ mimeType: string;
24
+ text: string;
25
+ };
26
+ text?: undefined;
27
+ })[];
28
+ structuredContent: {
29
+ categorizedChanges: CategorizedChanges;
30
+ };
31
+ }>;
32
+ export declare const gitDiffSubmitSelectionTool: Tool;
33
+ export interface GitDiffSubmitSelectionArgs {
34
+ selectedComponents: SelectedComponent[];
35
+ }
36
+ export declare function handleGitDiffSubmitSelection(args: GitDiffSubmitSelectionArgs): Promise<{
37
+ content: {
38
+ type: "text";
39
+ text: string;
40
+ }[];
41
+ isError: boolean;
42
+ }>;
@@ -0,0 +1 @@
1
+ import{toolResponse as e}from"../../utils/errors.js";import{parseGitDiff as t}from"./gitDiffParser.js";import{generatePackageXml as o}from"./packageXml.js";export const gitDiffReviewTool={name:"salesforce_git_diff_review",description:"Analyze git diff of an SFDX project to identify changed Salesforce metadata components. Returns categorized changes (ApexClass, LWC, CustomField, etc.) with status (Added/Modified/Deleted). Does NOT require a Salesforce connection — works purely on local git history.",inputSchema:{type:"object",properties:{projectDir:{type:"string",description:"Absolute path to the SFDX project root (must contain force-app/)."},baseBranch:{type:"string",description:'Git branch to diff against (e.g. "origin/main"). If omitted, auto-detects main/master.'}},required:["projectDir"]},_meta:{ui:{resourceUri:"ui://salesforce-git-diff-review/mcp-app.html"}}};export async function handleGitDiffReview(o){try{const{projectDir:s,baseBranch:r}=o;if(!s)return e("Missing required parameter: projectDir",!0);const a=t(s,r),n=Object.keys(a).length,i=Object.values(a).reduce((e,t)=>e+t.length,0);if(0===i)return e("No Salesforce metadata changes detected in git diff.");const c=[`Found ${i} changed component(s) across ${n} metadata type(s):`,""];for(const[e,t]of Object.entries(a).sort(([e],[t])=>e.localeCompare(t))){c.push(`## ${e} (${t.length})`);for(const e of t){const t="Added"===e.status?"+":"Deleted"===e.status?"-":"~";c.push(` ${t} ${e.componentName}`)}c.push("")}return c.push("Use the UI to select components and generate a package.xml for deployment."),{content:[{type:"text",text:c.join("\n")},{type:"resource",resource:{uri:"ui://salesforce-git-diff-review/mcp-app.html",mimeType:"text/html;profile=mcp-app",text:""}}],structuredContent:{categorizedChanges:a}}}catch(t){return e(`Git diff analysis failed: ${t.message}`,!0)}}export const gitDiffSubmitSelectionTool={name:"salesforce_git_diff_submit_selection",description:"Generate package.xml from user-selected Salesforce metadata components. App-only tool — called from the git diff review UI.",inputSchema:{type:"object",properties:{selectedComponents:{type:"array",description:"Array of selected components with metadataType, componentName, and status.",items:{type:"object",properties:{metadataType:{type:"string"},componentName:{type:"string"},status:{type:"string",enum:["Added","Modified","Deleted","Renamed"]}},required:["metadataType","componentName","status"]}}},required:["selectedComponents"]},annotations:{visibility:["app"]}};export async function handleGitDiffSubmitSelection(t){try{const{selectedComponents:s}=t;if(!s||!Array.isArray(s)||0===s.length)return e("No components selected.",!0);const{packageXml:r,destructiveChangesXml:a}=o(s),n=[`Generated package.xml for ${s.length} component(s):`,"","```xml",r,"```"];return a&&n.push("","Destructive changes (deletions) — destructiveChangesPost.xml:","","```xml",a,"```"),e(n.join("\n"))}catch(t){return e(`Package.xml generation failed: ${t.message}`,!0)}}
@@ -0,0 +1,19 @@
1
+ export type ChangeStatus = 'Added' | 'Modified' | 'Deleted' | 'Renamed';
2
+ export interface GitDiffEntry {
3
+ /** Raw git status letter (A, M, D, R) */
4
+ status: ChangeStatus;
5
+ /** Original file path from git diff */
6
+ filePath: string;
7
+ /** Salesforce metadata type (ApexClass, LightningComponentBundle, etc.) */
8
+ metadataType: string;
9
+ /** Component API name (e.g. MyController, Account.MyField__c) */
10
+ componentName: string;
11
+ }
12
+ export interface CategorizedChanges {
13
+ [metadataType: string]: GitDiffEntry[];
14
+ }
15
+ export interface SelectedComponent {
16
+ metadataType: string;
17
+ componentName: string;
18
+ status: ChangeStatus;
19
+ }
@@ -0,0 +1 @@
1
+ export{};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
package/dist/index.js ADDED
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { registerAppTool, registerAppResource, RESOURCE_MIME_TYPE } from '@modelcontextprotocol/ext-apps/server';
6
+ import fs from 'node:fs/promises';
7
+ import path from 'node:path';
8
+ import { createConnection, toolResponse } from './utils/index.js';
9
+ import { objectSearchDescriptor } from './tools/objectSearch.js';
10
+ import { objectSchemaDescriptor } from './tools/objectSchema.js';
11
+ import { recordQueryDescriptor } from './tools/recordQuery.js';
12
+ import { aggregateQueryDescriptor } from './tools/aggregateQuery.js';
13
+ import { dmlDescriptor } from './tools/dml.js';
14
+ import { objectManagementDescriptor } from './tools/objectManagement.js';
15
+ import { fieldManagementDescriptor } from './tools/fieldManagement.js';
16
+ import { fieldPermissionsDescriptor } from './tools/fieldPermissions.js';
17
+ import { crossObjectSearchDescriptor } from './tools/crossObjectSearch.js';
18
+ import { readApexClassesDescriptor } from './tools/readApexClasses.js';
19
+ import { writeApexClassesDescriptor } from './tools/writeApexClasses.js';
20
+ import { readApexTriggersDescriptor } from './tools/readApexTriggers.js';
21
+ import { writeApexTriggersDescriptor } from './tools/writeApexTriggers.js';
22
+ import { executeAnonymousDescriptor } from './tools/executeAnonymous.js';
23
+ import { debugLogsDescriptor } from './tools/debugLogs.js';
24
+ import { toolingQueryDescriptor } from './tools/toolingQuery.js';
25
+ import { bulkExportStartDescriptor } from './tools/bulkExportStart.js';
26
+ import { bulkExportStatusDescriptor } from './tools/bulkExportStatus.js';
27
+ import { bulkExportResultsDescriptor } from './tools/bulkExportResults.js';
28
+ import { bulkExportAbortDescriptor } from './tools/bulkExportAbort.js';
29
+ import { selectOrgDescriptor } from './tools/selectOrg.js';
30
+ import { salesforceLoginDescriptor } from './tools/salesforceLogin.js';
31
+ import { metadataDescribeDescriptor } from './tools/metadataDescribe.js';
32
+ import { metadataListDescriptor } from './tools/metadataList.js';
33
+ import { metadataReadDescriptor } from './tools/metadataRead.js';
34
+ import { metadataTypeSchemaDescriptor } from './tools/metadataTypeSchema.js';
35
+ import { metadataImportDescriptor } from './tools/metadataImport.js';
36
+ import { getDependenciesDescriptor } from './tools/getDependencies.js';
37
+ import { dmlDeleteDescriptor } from './tools/dmlDelete.js';
38
+ import { retrieveMetadataDescriptor } from './tools/retrieveMetadata.js';
39
+ import { deployMetadataDescriptor } from './tools/deployMetadata.js';
40
+ import { deployJobStatusDescriptor } from './tools/metadataJobStatus.js';
41
+ import { retrieveJobStatusDescriptor } from './tools/retrieveJobStatus.js';
42
+ import { metadataDiffDescriptor } from './tools/metadataDiff.js';
43
+ import { metadataDiffGeneratePackageDescriptor } from './tools/metadataDiffGeneratePackage.js';
44
+ import { metadataDiffFileDetailDescriptor } from './tools/metadataDiffFileDetail.js';
45
+ import { metadataDiffFilesDescriptor } from './tools/metadataDiffFiles.js';
46
+ import { objectPermissionsDescriptor } from './tools/objectPermissions.js';
47
+ import { userPermissionsDescriptor } from './tools/userPermissions.js';
48
+ import { listUserPermissionsDescriptor } from './tools/listUserPermissions.js';
49
+ const DIST_DIR = import.meta.filename?.endsWith('.ts')
50
+ ? path.join(import.meta.dirname, '..', 'dist')
51
+ : import.meta.dirname;
52
+ const server = new McpServer({ name: 'acquis-salesforce-mcp', version: '1.0.0' });
53
+ // Tools that require a Salesforce connection
54
+ const connectedTools = [
55
+ objectSearchDescriptor,
56
+ objectSchemaDescriptor,
57
+ recordQueryDescriptor,
58
+ aggregateQueryDescriptor,
59
+ dmlDescriptor,
60
+ objectManagementDescriptor,
61
+ fieldManagementDescriptor,
62
+ fieldPermissionsDescriptor,
63
+ crossObjectSearchDescriptor,
64
+ readApexClassesDescriptor,
65
+ writeApexClassesDescriptor,
66
+ readApexTriggersDescriptor,
67
+ writeApexTriggersDescriptor,
68
+ executeAnonymousDescriptor,
69
+ debugLogsDescriptor,
70
+ toolingQueryDescriptor,
71
+ bulkExportStartDescriptor,
72
+ bulkExportStatusDescriptor,
73
+ bulkExportResultsDescriptor,
74
+ bulkExportAbortDescriptor,
75
+ metadataDescribeDescriptor,
76
+ metadataListDescriptor,
77
+ metadataReadDescriptor,
78
+ metadataTypeSchemaDescriptor,
79
+ metadataImportDescriptor,
80
+ getDependenciesDescriptor,
81
+ dmlDeleteDescriptor,
82
+ retrieveMetadataDescriptor,
83
+ deployMetadataDescriptor,
84
+ deployJobStatusDescriptor,
85
+ retrieveJobStatusDescriptor,
86
+ objectPermissionsDescriptor,
87
+ userPermissionsDescriptor,
88
+ listUserPermissionsDescriptor,
89
+ ];
90
+ // Tools that don't need a Salesforce connection
91
+ const standaloneTools = [
92
+ selectOrgDescriptor,
93
+ salesforceLoginDescriptor,
94
+ ];
95
+ // Register connected tools (auto-creates connection per call)
96
+ for (const tool of connectedTools) {
97
+ server.registerTool(tool.name, {
98
+ description: tool.description,
99
+ inputSchema: tool.schema,
100
+ }, async (args) => {
101
+ try {
102
+ const conn = await createConnection();
103
+ return tool.handler(conn, args);
104
+ }
105
+ catch (error) {
106
+ return toolResponse(`Tool execution failed: ${error.message}`, true);
107
+ }
108
+ });
109
+ }
110
+ // Register standalone tools (no connection)
111
+ for (const tool of standaloneTools) {
112
+ server.registerTool(tool.name, {
113
+ description: tool.description,
114
+ inputSchema: tool.schema,
115
+ }, async (args) => {
116
+ try {
117
+ return tool.handler(args);
118
+ }
119
+ catch (error) {
120
+ return toolResponse(`Tool execution failed: ${error.message}`, true);
121
+ }
122
+ });
123
+ }
124
+ // --- App tools (with UI) ---
125
+ const diffResourceUri = 'ui://salesforce-metadata-diff/metadata-diff.html';
126
+ registerAppTool(server, 'salesforce_metadata_diff', {
127
+ title: 'Metadata Diff',
128
+ description: metadataDiffDescriptor.description,
129
+ inputSchema: metadataDiffDescriptor.schema,
130
+ _meta: { ui: { resourceUri: diffResourceUri } },
131
+ }, async (args) => {
132
+ try {
133
+ return metadataDiffDescriptor.handler(args);
134
+ }
135
+ catch (error) {
136
+ return toolResponse(`Tool execution failed: ${error.message}`, true);
137
+ }
138
+ });
139
+ registerAppTool(server, 'salesforce_generate_diff_package', {
140
+ title: 'Generate Diff Package',
141
+ description: metadataDiffGeneratePackageDescriptor.description,
142
+ inputSchema: metadataDiffGeneratePackageDescriptor.schema,
143
+ _meta: { ui: { resourceUri: diffResourceUri, visibility: ['app'] } },
144
+ }, async (args) => {
145
+ try {
146
+ return metadataDiffGeneratePackageDescriptor.handler(args);
147
+ }
148
+ catch (error) {
149
+ return toolResponse(`Tool execution failed: ${error.message}`, true);
150
+ }
151
+ });
152
+ registerAppTool(server, 'salesforce_metadata_diff_files', {
153
+ title: 'Metadata Diff Files',
154
+ description: metadataDiffFilesDescriptor.description,
155
+ inputSchema: metadataDiffFilesDescriptor.schema,
156
+ _meta: { ui: { resourceUri: diffResourceUri, visibility: ['app'] } },
157
+ }, async (args) => {
158
+ try {
159
+ return metadataDiffFilesDescriptor.handler(args);
160
+ }
161
+ catch (error) {
162
+ return toolResponse(`Tool execution failed: ${error.message}`, true);
163
+ }
164
+ });
165
+ registerAppTool(server, 'salesforce_metadata_diff_file_detail', {
166
+ title: 'Metadata Diff File Detail',
167
+ description: metadataDiffFileDetailDescriptor.description,
168
+ inputSchema: metadataDiffFileDetailDescriptor.schema,
169
+ _meta: { ui: { resourceUri: diffResourceUri, visibility: ['app'] } },
170
+ }, async (args) => {
171
+ try {
172
+ return metadataDiffFileDetailDescriptor.handler(args);
173
+ }
174
+ catch (error) {
175
+ return toolResponse(`Tool execution failed: ${error.message}`, true);
176
+ }
177
+ });
178
+ registerAppResource(server, diffResourceUri, diffResourceUri, { mimeType: RESOURCE_MIME_TYPE }, async () => {
179
+ const html = await fs.readFile(path.join(DIST_DIR, 'metadata-diff.html'), 'utf-8');
180
+ return {
181
+ contents: [{ uri: diffResourceUri, mimeType: RESOURCE_MIME_TYPE, text: html }],
182
+ };
183
+ });
184
+ async function main() {
185
+ const transport = new StdioServerTransport();
186
+ await server.connect(transport);
187
+ console.error('Salesforce MCP Server running on stdio');
188
+ }
189
+ main().catch((error) => {
190
+ console.error('Fatal error:', error);
191
+ process.exit(1);
192
+ });
193
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}