salesforce-metadata-mcp 2.0.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 (91) hide show
  1. package/AGENTFORCE.md +125 -0
  2. package/APEX_LWC.md +214 -0
  3. package/CHANGELOG.md +120 -0
  4. package/README.md +207 -0
  5. package/SETUP.md +208 -0
  6. package/TOOLS.md +193 -0
  7. package/dist/index.d.ts +2 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +53 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schemas/index.d.ts +3406 -0
  12. package/dist/schemas/index.d.ts.map +1 -0
  13. package/dist/schemas/index.js +992 -0
  14. package/dist/schemas/index.js.map +1 -0
  15. package/dist/services/deployment.d.ts +36 -0
  16. package/dist/services/deployment.d.ts.map +1 -0
  17. package/dist/services/deployment.js +215 -0
  18. package/dist/services/deployment.js.map +1 -0
  19. package/dist/services/mcpgen.d.ts +16 -0
  20. package/dist/services/mcpgen.d.ts.map +1 -0
  21. package/dist/services/mcpgen.js +229 -0
  22. package/dist/services/mcpgen.js.map +1 -0
  23. package/dist/services/salesforce.d.ts +598 -0
  24. package/dist/services/salesforce.d.ts.map +1 -0
  25. package/dist/services/salesforce.js +1317 -0
  26. package/dist/services/salesforce.js.map +1 -0
  27. package/dist/services/tooling.d.ts +23 -0
  28. package/dist/services/tooling.d.ts.map +1 -0
  29. package/dist/services/tooling.js +173 -0
  30. package/dist/services/tooling.js.map +1 -0
  31. package/dist/tools/agentforce.d.ts +3 -0
  32. package/dist/tools/agentforce.d.ts.map +1 -0
  33. package/dist/tools/agentforce.js +73 -0
  34. package/dist/tools/agentforce.js.map +1 -0
  35. package/dist/tools/apex.d.ts +3 -0
  36. package/dist/tools/apex.d.ts.map +1 -0
  37. package/dist/tools/apex.js +95 -0
  38. package/dist/tools/apex.js.map +1 -0
  39. package/dist/tools/automation.d.ts +3 -0
  40. package/dist/tools/automation.d.ts.map +1 -0
  41. package/dist/tools/automation.js +186 -0
  42. package/dist/tools/automation.js.map +1 -0
  43. package/dist/tools/deployment.d.ts +3 -0
  44. package/dist/tools/deployment.d.ts.map +1 -0
  45. package/dist/tools/deployment.js +89 -0
  46. package/dist/tools/deployment.js.map +1 -0
  47. package/dist/tools/experience.d.ts +3 -0
  48. package/dist/tools/experience.d.ts.map +1 -0
  49. package/dist/tools/experience.js +53 -0
  50. package/dist/tools/experience.js.map +1 -0
  51. package/dist/tools/index.d.ts +3 -0
  52. package/dist/tools/index.d.ts.map +1 -0
  53. package/dist/tools/index.js +27 -0
  54. package/dist/tools/index.js.map +1 -0
  55. package/dist/tools/integrations.d.ts +3 -0
  56. package/dist/tools/integrations.d.ts.map +1 -0
  57. package/dist/tools/integrations.js +96 -0
  58. package/dist/tools/integrations.js.map +1 -0
  59. package/dist/tools/lwc.d.ts +3 -0
  60. package/dist/tools/lwc.d.ts.map +1 -0
  61. package/dist/tools/lwc.js +73 -0
  62. package/dist/tools/lwc.js.map +1 -0
  63. package/dist/tools/mcp.d.ts +3 -0
  64. package/dist/tools/mcp.d.ts.map +1 -0
  65. package/dist/tools/mcp.js +44 -0
  66. package/dist/tools/mcp.js.map +1 -0
  67. package/dist/tools/metadata.d.ts +3 -0
  68. package/dist/tools/metadata.d.ts.map +1 -0
  69. package/dist/tools/metadata.js +168 -0
  70. package/dist/tools/metadata.js.map +1 -0
  71. package/dist/tools/objects.d.ts +3 -0
  72. package/dist/tools/objects.d.ts.map +1 -0
  73. package/dist/tools/objects.js +172 -0
  74. package/dist/tools/objects.js.map +1 -0
  75. package/dist/tools/security.d.ts +3 -0
  76. package/dist/tools/security.d.ts.map +1 -0
  77. package/dist/tools/security.js +82 -0
  78. package/dist/tools/security.js.map +1 -0
  79. package/dist/tools/ui.d.ts +3 -0
  80. package/dist/tools/ui.d.ts.map +1 -0
  81. package/dist/tools/ui.js +195 -0
  82. package/dist/tools/ui.js.map +1 -0
  83. package/dist/tools/utils.d.ts +15 -0
  84. package/dist/tools/utils.d.ts.map +1 -0
  85. package/dist/tools/utils.js +7 -0
  86. package/dist/tools/utils.js.map +1 -0
  87. package/dist/types.d.ts +85 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +3 -0
  90. package/dist/types.js.map +1 -0
  91. package/package.json +46 -0
@@ -0,0 +1,229 @@
1
+ import { promises as fs } from "fs";
2
+ import path from "path";
3
+ // ─── MCP Server Generation ────────────────────────────────────────────────────
4
+ export async function createMcpServer(params) {
5
+ try {
6
+ const dir = params.outputDirectory;
7
+ await fs.mkdir(dir, { recursive: true });
8
+ await fs.mkdir(path.join(dir, "src"), { recursive: true });
9
+ const packageJson = {
10
+ name: params.serverName,
11
+ version: "1.0.0",
12
+ description: params.description ?? `MCP server for ${params.serverName}`,
13
+ type: "module",
14
+ main: "dist/index.js",
15
+ scripts: {
16
+ build: "tsc",
17
+ start: "node dist/index.js",
18
+ dev: "tsc --watch"
19
+ },
20
+ dependencies: {
21
+ "@modelcontextprotocol/sdk": "^1.10.2",
22
+ "axios": "^1.7.9",
23
+ "zod": "^3.23.8"
24
+ },
25
+ devDependencies: {
26
+ "@types/node": "^22.10.0",
27
+ "typescript": "^5.7.2"
28
+ }
29
+ };
30
+ const tsconfig = {
31
+ compilerOptions: {
32
+ target: "ES2022",
33
+ module: "Node16",
34
+ moduleResolution: "Node16",
35
+ outDir: "./dist",
36
+ rootDir: "./src",
37
+ strict: true,
38
+ esModuleInterop: true,
39
+ skipLibCheck: true,
40
+ forceConsistentCasingInFileNames: true,
41
+ declaration: true,
42
+ sourceMap: true
43
+ },
44
+ include: ["src/**/*"],
45
+ exclude: ["node_modules", "dist"]
46
+ };
47
+ const indexTs = `import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
48
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
49
+ import { z } from "zod";
50
+
51
+ const server = new McpServer({
52
+ name: "${params.serverName}",
53
+ version: "1.0.0",
54
+ });
55
+
56
+ // ─── Tools ────────────────────────────────────────────────────────────────────
57
+
58
+ server.registerTool(
59
+ "hello_world",
60
+ {
61
+ title: "Hello World",
62
+ description: "A sample tool that returns a greeting",
63
+ inputSchema: z.object({
64
+ name: z.string().optional().describe("Name to greet"),
65
+ }),
66
+ },
67
+ async (params) => {
68
+ const greeting = \`Hello, \${params.name ?? "World"}!\`;
69
+ return { content: [{ type: "text", text: greeting }] };
70
+ }
71
+ );
72
+
73
+ // ─── Start server ─────────────────────────────────────────────────────────────
74
+
75
+ async function main(): Promise<void> {
76
+ const transport = new StdioServerTransport();
77
+ await server.connect(transport);
78
+ console.error("${params.serverName} MCP server running on stdio");
79
+ }
80
+
81
+ main().catch((err: unknown) => {
82
+ console.error("Server error:", err);
83
+ process.exit(1);
84
+ });
85
+ `;
86
+ const envExample = `# Salesforce credentials
87
+ SF_INSTANCE_URL=${params.salesforceInstanceUrl ?? "https://your-org.salesforce.com"}
88
+ SF_ACCESS_TOKEN=your_access_token
89
+ # Or use OAuth refresh:
90
+ # SF_CLIENT_ID=your_client_id
91
+ # SF_CLIENT_SECRET=your_client_secret
92
+ # SF_REFRESH_TOKEN=your_refresh_token
93
+ `;
94
+ const readme = `# ${params.serverName}
95
+
96
+ ${params.description ?? "A Salesforce MCP Server"}
97
+
98
+ ## Setup
99
+
100
+ \`\`\`bash
101
+ npm install
102
+ npm run build
103
+ \`\`\`
104
+
105
+ ## Configuration
106
+
107
+ Copy \`.env.example\` to \`.env\` and fill in your credentials.
108
+
109
+ ## Running
110
+
111
+ \`\`\`bash
112
+ npm start
113
+ \`\`\`
114
+
115
+ ## Adding to Claude
116
+
117
+ \`\`\`json
118
+ {
119
+ "mcpServers": {
120
+ "${params.serverName}": {
121
+ "command": "node",
122
+ "args": ["${path.join(dir, "dist/index.js").replace(/\\/g, "/")}"],
123
+ "env": {
124
+ "SF_INSTANCE_URL": "https://your-org.salesforce.com",
125
+ "SF_ACCESS_TOKEN": "your_token"
126
+ }
127
+ }
128
+ }
129
+ }
130
+ \`\`\`
131
+ `;
132
+ await fs.writeFile(path.join(dir, "package.json"), JSON.stringify(packageJson, null, 2));
133
+ await fs.writeFile(path.join(dir, "tsconfig.json"), JSON.stringify(tsconfig, null, 2));
134
+ await fs.writeFile(path.join(dir, "src/index.ts"), indexTs);
135
+ await fs.writeFile(path.join(dir, ".env.example"), envExample);
136
+ await fs.writeFile(path.join(dir, "README.md"), readme);
137
+ return {
138
+ success: true,
139
+ fullName: params.serverName,
140
+ created: true,
141
+ message: `MCP server project created at: ${dir}\n\nFiles created:\n- package.json\n- tsconfig.json\n- src/index.ts\n- .env.example\n- README.md\n\nNext steps:\n1. cd "${dir}"\n2. npm install\n3. npm run build\n4. Add to Claude config`
142
+ };
143
+ }
144
+ catch (err) {
145
+ return { success: false, message: err instanceof Error ? err.message : String(err) };
146
+ }
147
+ }
148
+ export async function createMcpTool(params) {
149
+ try {
150
+ const indexPath = path.join(params.projectDirectory, "src/index.ts");
151
+ let content;
152
+ try {
153
+ content = await fs.readFile(indexPath, "utf-8");
154
+ }
155
+ catch {
156
+ return { success: false, message: `Could not read ${indexPath}. Make sure the project directory is correct.` };
157
+ }
158
+ const schemaFields = Object.entries(params.inputSchema)
159
+ .map(([k, v]) => {
160
+ const field = v;
161
+ const type = field.type ?? "string";
162
+ const desc = field.description ?? "";
163
+ const zodType = type === "number" ? "z.number()" : type === "boolean" ? "z.boolean()" : "z.string()";
164
+ return ` ${k}: ${zodType}${desc ? `.describe(${JSON.stringify(desc)})` : ""},`;
165
+ })
166
+ .join("\n");
167
+ const toolCode = `
168
+ server.registerTool(
169
+ "${params.toolName}",
170
+ {
171
+ title: "${params.toolName.replace(/_/g, " ").replace(/\b\w/g, l => l.toUpperCase())}",
172
+ description: ${JSON.stringify(params.toolDescription)},
173
+ inputSchema: z.object({
174
+ ${schemaFields}
175
+ }),
176
+ },
177
+ async (params) => {
178
+ ${params.handlerCode}
179
+ }
180
+ );
181
+ `;
182
+ // Insert before the "Start server" comment or at end of file
183
+ let newContent;
184
+ const insertMarker = "// ─── Start server";
185
+ if (content.includes(insertMarker)) {
186
+ newContent = content.replace(insertMarker, `${toolCode}\n${insertMarker}`);
187
+ }
188
+ else {
189
+ newContent = content + "\n" + toolCode;
190
+ }
191
+ await fs.writeFile(indexPath, newContent, "utf-8");
192
+ return {
193
+ success: true,
194
+ fullName: params.toolName,
195
+ created: true,
196
+ message: `Tool '${params.toolName}' added to ${indexPath}. Run 'npm run build' to compile.`
197
+ };
198
+ }
199
+ catch (err) {
200
+ return { success: false, message: err instanceof Error ? err.message : String(err) };
201
+ }
202
+ }
203
+ export async function listMcpTools(projectDirectory) {
204
+ try {
205
+ const indexPath = path.join(projectDirectory, "src/index.ts");
206
+ let content;
207
+ try {
208
+ content = await fs.readFile(indexPath, "utf-8");
209
+ }
210
+ catch {
211
+ return { success: false, message: `Could not read ${indexPath}.` };
212
+ }
213
+ const toolMatches = [...content.matchAll(/server\.registerTool\(\s*["']([^"']+)["']/g)];
214
+ const tools = toolMatches.map(m => m[1]);
215
+ if (!tools.length) {
216
+ return { success: true, fullName: projectDirectory, created: false, message: "No tools registered in this MCP server project." };
217
+ }
218
+ return {
219
+ success: true,
220
+ fullName: projectDirectory,
221
+ created: false,
222
+ message: `Found ${tools.length} tool(s) in ${indexPath}:\n${tools.map((t, i) => `${i + 1}. ${t}`).join("\n")}`
223
+ };
224
+ }
225
+ catch (err) {
226
+ return { success: false, message: err instanceof Error ? err.message : String(err) };
227
+ }
228
+ }
229
+ //# sourceMappingURL=mcpgen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpgen.js","sourceRoot":"","sources":["../../src/services/mcpgen.ts"],"names":[],"mappings":"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"}