#!/usr/bin/env node import jsforce from "jsforce"; import { z } from "zod"; import dotenv from "dotenv"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { McpServer } from "@mcp-use/modelcontextprotocol-sdk/server/mcp.js"; import { StdioServerTransport } from "@mcp-use/modelcontextprotocol-sdk/server/stdio.js"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); dotenv.config({ path: path.resolve(__dirname, "..", ".env") }); const { SF_LOGIN_URL, SF_CLIENT_ID, SF_CLIENT_SECRET, SF_REFRESH_TOKEN, SF_INSTANCE_URL } = process.env; const mcpServer = new McpServer({ name: "custom-mcp", version: "1.0.0" }); mcpServer.registerTool( "getObjectFields", { description: "List Salesforce fields for a given object name.", inputSchema: z.object({ objectName: z .string() .describe("Salesforce object API name, e.g. Account.") }) }, async ({ objectName }) => { if (!objectName) { return { isError: true, content: [{ type: "text", text: "Input must include objectName." }] }; } if ( !SF_CLIENT_ID || !SF_CLIENT_SECRET || !SF_REFRESH_TOKEN || !SF_INSTANCE_URL ) { return { isError: true, content: [ { type: "text", text: "Missing Salesforce OAuth configuration." } ] }; } const conn = new jsforce.Connection({ oauth2: { clientId: SF_CLIENT_ID, clientSecret: SF_CLIENT_SECRET, redirectUri: process.env.SF_REDIRECT_URI || "", loginUrl: SF_LOGIN_URL || "https://login.salesforce.com" }, instanceUrl: SF_INSTANCE_URL, refreshToken: SF_REFRESH_TOKEN }); conn.on("refresh", () => { console.error("Salesforce access token refreshed"); }); const fields = await conn.apex.get( `/ObjectFields/${encodeURIComponent(objectName)}` ); const summary = `Object ${objectName} has ${fields.length} fields: ` + fields.map((field) => `${field.name} (${field.type})`).join(", "); return { content: [{ type: "text", text: summary }], structuredContent: { fields } }; } ); async function main() { const transport = new StdioServerTransport(); await mcpServer.connect(transport); console.error("Custom MCP server running over stdio..."); } main().catch((error) => { console.error("Server error:", error); process.exit(1); });