import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { sfQuery } from "../salesforce-client.js"; export function registerAccountTools(server: McpServer): void { server.tool( "get_account", "Get detailed information about a Salesforce account", { accountId: z.string().describe("Salesforce Account ID"), }, async ({ accountId }) => { const soql = ` SELECT Id, Name, Industry, Website, Phone, BillingCity, BillingCountry, Description, NumberOfEmployees, AnnualRevenue, Owner.Name, Type, Strategic_Priority__c, Technology__c, LastActivityDate, (SELECT Id, Name, Email, Title FROM Contacts LIMIT 10), (SELECT Id, Name, StageName, Amount, CloseDate FROM Opportunities ORDER BY CloseDate DESC LIMIT 5) FROM Account WHERE Id = '${accountId}' `; const records = await sfQuery(soql); return { content: [{ type: "text", text: JSON.stringify(records[0], null, 2) }], }; } ); server.tool( "search_accounts", "Search for accounts/companies in Salesforce", { query: z.string().describe("Search query (company name)"), type: z .string() .optional() .describe("Account type filter (e.g., Prospect, Customer)"), limit: z.number().default(10).describe("Maximum number of results"), }, async ({ query, type, limit }) => { const escapedQuery = query.replace(/'/g, "\\'"); let whereClause = `Name LIKE '%${escapedQuery}%'`; if (type) { whereClause += ` AND Type = '${type}'`; } const soql = ` SELECT Id, Name, Industry, Website, Phone, BillingCity, Owner.Name, Type, Strategic_Priority__c, Technology__c, LastActivityDate FROM Account WHERE ${whereClause} ORDER BY Name ASC LIMIT ${limit} `; const records = await sfQuery(soql); return { content: [{ type: "text", text: JSON.stringify(records, null, 2) }], }; } ); }