diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1352a08 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +# Generated by https://smithery.ai. See: https://smithery.ai/docs/config#dockerfile +FROM node:lts-alpine + +WORKDIR /app + +# Copy package files and install dependencies without running scripts +COPY package.json package-lock.json ./ +RUN npm install --ignore-scripts + +# Copy the rest of the source code +COPY . . + +# Manually build the project +RUN npm run build + +CMD ["npm", "start"] diff --git a/README.md b/README.md index ecd650a..0be7a25 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Salesforce CLI MCP Server +[![smithery badge](https://smithery.ai/badge/@codefriar/sf-mcp)](https://smithery.ai/server/@codefriar/sf-mcp) + Model Context Protocol (MCP) server for providing Salesforce CLI functionality to LLM tools like Claude Desktop. ## Overview @@ -18,6 +20,15 @@ This MCP server wraps the Salesforce CLI (`sf`) command-line tool and exposes it ## Installation +### Installing via Smithery + +To install Salesforce CLI MCP Server for Claude Desktop automatically via [Smithery](https://smithery.ai/server/@codefriar/sf-mcp): + +```bash +npx -y @smithery/cli install @codefriar/sf-mcp --client claude +``` + +### Manual Installation ```bash # Clone the repository git clone diff --git a/smithery.yaml b/smithery.yaml new file mode 100644 index 0000000..d486da5 --- /dev/null +++ b/smithery.yaml @@ -0,0 +1,22 @@ +# Smithery configuration file: https://smithery.ai/docs/config#smitheryyaml + +startCommand: + type: stdio + configSchema: + # JSON Schema defining the configuration options for the MCP. + type: object + properties: + projectRoots: + type: array + items: + type: string + default: [] + description: Optional list of Salesforce project directories to use as roots. + commandFunction: + # A JS function that produces the CLI command based on the given config to start the MCP on stdio. + |- + (config) => { const args = ['build/index.js']; if (config.projectRoots && Array.isArray(config.projectRoots) && config.projectRoots.length > 0) { args.push(...config.projectRoots); } return { command: 'node', args }; } + exampleConfig: + projectRoots: + - /path/to/project1 + - /path/to/project2