/** * Copyright (c) 2026, Salesforce, Inc., * All rights reserved. * For full license text, see the LICENSE.txt file */ import { readFileSync } from "node:fs"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { registerEchoTool } from "./tools/echo.js"; import { registerSfGqlAggregateTool } from "./tools/sf-gql-aggregate.js"; import { registerSfGqlConnectTool } from "./tools/sf-gql-connect.js"; import { registerSfGqlCreateTool } from "./tools/sf-gql-create.js"; import { registerSfGqlDeleteTool } from "./tools/sf-gql-delete.js"; import { registerSfGqlDetailTool } from "./tools/sf-gql-detail.js"; import { registerSfGqlDiscoverTool } from "./tools/sf-gql-discover.js"; import { registerSfGqlListTool } from "./tools/sf-gql-list.js"; import { registerSfGqlRawTool } from "./tools/sf-gql-raw.js"; import { registerSfGqlUpdateTool } from "./tools/sf-gql-update.js"; const packageJson = JSON.parse( readFileSync(new URL("../../package.json", import.meta.url), "utf8"), ) as { version: string }; export function createServer(): McpServer { const server = new McpServer({ name: "graphiti-mcp", version: packageJson.version, }); // `echo` is a bring-up/transport-diagnostic stub that returns caller input // verbatim — it deliberately bypasses runTool/sanitizePaths/neutralizeControlChars // (W-23148363), so it must NOT ship on the default published surface. Now that all // nine sf_gql_* tools are wired it is dev-only; gate it behind an opt-in env flag // pending its removal (follow-up WI). Off by default → absent from `graphiti-mcp`. if (process.env.GRAPHITI_ENABLE_ECHO === "1") registerEchoTool(server); registerSfGqlAggregateTool(server); registerSfGqlConnectTool(server); registerSfGqlCreateTool(server); registerSfGqlDeleteTool(server); registerSfGqlDetailTool(server); registerSfGqlDiscoverTool(server); registerSfGqlListTool(server); registerSfGqlRawTool(server); registerSfGqlUpdateTool(server); return server; }