infranodus-mcp-server 1.5.2 → 1.6.2

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 (135) hide show
  1. package/README.md +113 -118
  2. package/bin/infranodus-mcp-server.js +7 -53
  3. package/bin/keywordgraph-mcp-server.js +8 -0
  4. package/bin/mcp-server.js +56 -0
  5. package/dist/api/client.d.ts.map +1 -1
  6. package/dist/api/client.js +2 -1
  7. package/dist/api/client.js.map +1 -1
  8. package/dist/api/config-store.d.ts.map +1 -1
  9. package/dist/api/config-store.js +3 -2
  10. package/dist/api/config-store.js.map +1 -1
  11. package/dist/auth/oauth-provider.d.ts +3 -3
  12. package/dist/auth/oauth-provider.d.ts.map +1 -1
  13. package/dist/auth/oauth-provider.js +7 -6
  14. package/dist/auth/oauth-provider.js.map +1 -1
  15. package/dist/config/brand.d.ts +71 -0
  16. package/dist/config/brand.d.ts.map +1 -0
  17. package/dist/config/brand.js +118 -0
  18. package/dist/config/brand.js.map +1 -0
  19. package/dist/config/index.d.ts +2 -0
  20. package/dist/config/index.d.ts.map +1 -1
  21. package/dist/config/index.js +7 -5
  22. package/dist/config/index.js.map +1 -1
  23. package/dist/http-server.d.ts +1 -1
  24. package/dist/http-server.js +17 -16
  25. package/dist/http-server.js.map +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +47 -33
  28. package/dist/index.js.map +1 -1
  29. package/dist/instructions.d.ts +1 -1
  30. package/dist/instructions.d.ts.map +1 -1
  31. package/dist/instructions.js +4 -3
  32. package/dist/instructions.js.map +1 -1
  33. package/dist/prompts/index.d.ts.map +1 -1
  34. package/dist/prompts/index.js +10 -9
  35. package/dist/prompts/index.js.map +1 -1
  36. package/dist/resources/about.d.ts.map +1 -1
  37. package/dist/resources/about.js +28 -35
  38. package/dist/resources/about.js.map +1 -1
  39. package/dist/resources/llms-txt.d.ts.map +1 -1
  40. package/dist/resources/llms-txt.js +21 -10
  41. package/dist/resources/llms-txt.js.map +1 -1
  42. package/dist/schemas/index.d.ts +217 -48
  43. package/dist/schemas/index.d.ts.map +1 -1
  44. package/dist/schemas/index.js +262 -63
  45. package/dist/schemas/index.js.map +1 -1
  46. package/dist/tools/addMemory.d.ts.map +1 -1
  47. package/dist/tools/addMemory.js +3 -2
  48. package/dist/tools/addMemory.js.map +1 -1
  49. package/dist/tools/analyzeExistingGraph.d.ts +1 -0
  50. package/dist/tools/analyzeExistingGraph.d.ts.map +1 -1
  51. package/dist/tools/analyzeExistingGraph.js +8 -3
  52. package/dist/tools/analyzeExistingGraph.js.map +1 -1
  53. package/dist/tools/analyzeLlmResults.d.ts +37 -0
  54. package/dist/tools/analyzeLlmResults.d.ts.map +1 -0
  55. package/dist/tools/analyzeLlmResults.js +192 -0
  56. package/dist/tools/analyzeLlmResults.js.map +1 -0
  57. package/dist/tools/analyzeText.d.ts.map +1 -1
  58. package/dist/tools/analyzeText.js +2 -1
  59. package/dist/tools/analyzeText.js.map +1 -1
  60. package/dist/tools/createKnowledgeGraph.d.ts.map +1 -1
  61. package/dist/tools/createKnowledgeGraph.js +3 -2
  62. package/dist/tools/createKnowledgeGraph.js.map +1 -1
  63. package/dist/tools/developConceptualBridges.d.ts +1 -1
  64. package/dist/tools/developLatentTopics.d.ts +1 -1
  65. package/dist/tools/developTextTool.d.ts +1 -1
  66. package/dist/tools/generateContextualHint.d.ts +1 -0
  67. package/dist/tools/generateContextualHint.d.ts.map +1 -1
  68. package/dist/tools/generateContextualHint.js +4 -1
  69. package/dist/tools/generateContextualHint.js.map +1 -1
  70. package/dist/tools/generateDifferenceGraphFromTexts.d.ts.map +1 -1
  71. package/dist/tools/generateDifferenceGraphFromTexts.js +2 -1
  72. package/dist/tools/generateDifferenceGraphFromTexts.js.map +1 -1
  73. package/dist/tools/generateMergedGraphFromTexts.d.ts.map +1 -1
  74. package/dist/tools/generateMergedGraphFromTexts.js +2 -1
  75. package/dist/tools/generateMergedGraphFromTexts.js.map +1 -1
  76. package/dist/tools/generateOntologyGraph.d.ts +36 -0
  77. package/dist/tools/generateOntologyGraph.d.ts.map +1 -0
  78. package/dist/tools/generateOntologyGraph.js +194 -0
  79. package/dist/tools/generateOntologyGraph.js.map +1 -0
  80. package/dist/tools/generateResearchIdeas.d.ts +3 -1
  81. package/dist/tools/generateResearchIdeas.d.ts.map +1 -1
  82. package/dist/tools/generateResearchIdeas.js +2 -1
  83. package/dist/tools/generateResearchIdeas.js.map +1 -1
  84. package/dist/tools/generateResearchQuestions.d.ts +3 -1
  85. package/dist/tools/generateResearchQuestions.d.ts.map +1 -1
  86. package/dist/tools/generateResearchQuestions.js +5 -4
  87. package/dist/tools/generateResearchQuestions.js.map +1 -1
  88. package/dist/tools/generateResponses.d.ts +2 -1
  89. package/dist/tools/generateResponses.d.ts.map +1 -1
  90. package/dist/tools/generateResponses.js +3 -1
  91. package/dist/tools/generateResponses.js.map +1 -1
  92. package/dist/tools/generateTopicalClusters.d.ts +2 -0
  93. package/dist/tools/generateTopicalClusters.d.ts.map +1 -1
  94. package/dist/tools/generateTopicalClusters.js +40 -2
  95. package/dist/tools/generateTopicalClusters.js.map +1 -1
  96. package/dist/tools/generateYoutubeSearchResultsGraph.d.ts +42 -0
  97. package/dist/tools/generateYoutubeSearchResultsGraph.d.ts.map +1 -0
  98. package/dist/tools/generateYoutubeSearchResultsGraph.js +97 -0
  99. package/dist/tools/generateYoutubeSearchResultsGraph.js.map +1 -0
  100. package/dist/tools/getMemory.d.ts.map +1 -1
  101. package/dist/tools/getMemory.js +3 -2
  102. package/dist/tools/getMemory.js.map +1 -1
  103. package/dist/tools/index.d.ts +3 -0
  104. package/dist/tools/index.d.ts.map +1 -1
  105. package/dist/tools/index.js +3 -0
  106. package/dist/tools/index.js.map +1 -1
  107. package/dist/tools/listGraphs.d.ts +1 -0
  108. package/dist/tools/listGraphs.d.ts.map +1 -1
  109. package/dist/tools/listGraphs.js +7 -1
  110. package/dist/tools/listGraphs.js.map +1 -1
  111. package/dist/tools/optimizeTextStructure.d.ts +1 -1
  112. package/dist/tools/retrieveContextForPromptFromGraph.d.ts +1 -0
  113. package/dist/tools/retrieveContextForPromptFromGraph.d.ts.map +1 -1
  114. package/dist/tools/retrieveContextForPromptFromGraph.js +4 -2
  115. package/dist/tools/retrieveContextForPromptFromGraph.js.map +1 -1
  116. package/dist/tools/searchGraphs.d.ts.map +1 -1
  117. package/dist/tools/searchGraphs.js +3 -2
  118. package/dist/tools/searchGraphs.js.map +1 -1
  119. package/dist/tools/searchGraphsFetch.d.ts.map +1 -1
  120. package/dist/tools/searchGraphsFetch.js +2 -1
  121. package/dist/tools/searchGraphsFetch.js.map +1 -1
  122. package/dist/types/index.d.ts +66 -0
  123. package/dist/types/index.d.ts.map +1 -1
  124. package/dist/utils/transformers.d.ts +3 -1
  125. package/dist/utils/transformers.d.ts.map +1 -1
  126. package/dist/utils/transformers.js +57 -4
  127. package/dist/utils/transformers.js.map +1 -1
  128. package/dist/utils/urlContent.d.ts +1 -1
  129. package/dist/utils/urlContent.js +1 -1
  130. package/llms-full.infranodus.txt +469 -0
  131. package/llms-full.keywordgraph.txt +469 -0
  132. package/llms-full.txt +2 -2
  133. package/llms.infranodus.txt +64 -0
  134. package/llms.keywordgraph.txt +64 -0
  135. package/package.json +14 -3
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import * as dotenv from 'dotenv';
5
+ import createServer from '../dist/index.js';
6
+ import { brand, brandApiKey, brandApiBase } from '../dist/config/brand.js';
7
+
8
+ // Main function for CLI execution
9
+ async function main() {
10
+ // Load environment variables
11
+ dotenv.config();
12
+
13
+ // Brand (and thus API env vars / tool set) is selected by the BRAND env var.
14
+ const config = {
15
+ apiKey: brandApiKey(),
16
+ apiBase: brandApiBase(),
17
+ };
18
+
19
+ // Validate config
20
+ if (!config.apiKey) {
21
+ console.error(
22
+ `WARNING: Set ${brand.envPrefix}_API_KEY in environment variables to ensure you don't hit the rate limit`
23
+ );
24
+ }
25
+
26
+ // Create server with config
27
+ const server = createServer({ config });
28
+
29
+ // Create STDIO transport
30
+ const transport = new StdioServerTransport();
31
+
32
+ // Handle graceful shutdown
33
+ process.on("SIGINT", async () => {
34
+ await server.close();
35
+ process.exit(0);
36
+ });
37
+
38
+ process.on("SIGTERM", async () => {
39
+ await server.close();
40
+ process.exit(0);
41
+ });
42
+
43
+ try {
44
+ await server.connect(transport);
45
+ // Server is running - no console output to avoid protocol interference
46
+ } catch (error) {
47
+ console.error("ERROR: MCP server failed to connect", error);
48
+ process.exit(1);
49
+ }
50
+ }
51
+
52
+ // Run the main function
53
+ main().catch((error) => {
54
+ console.error("ERROR: Fatal error of MCP server", error);
55
+ process.exit(1);
56
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,wBAAsB,qBAAqB,CAC1C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,EACT,MAAM,GAAE,MAAe,GACrB,OAAO,CAAC,aAAa,CAAC,CAgCxB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIlD,wBAAsB,qBAAqB,CAC1C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,EACT,MAAM,GAAE,MAAe,GACrB,OAAO,CAAC,aAAa,CAAC,CAgCxB"}
@@ -1,8 +1,9 @@
1
1
  import { getConfig } from "./config-store.js";
2
+ import { brandSource } from "../config/brand.js";
2
3
  export async function makeInfraNodusRequest(endpoint, body, method = "POST") {
3
4
  try {
4
5
  const config = getConfig();
5
- const requestBody = { ...body, modal: "mcp_server" };
6
+ const requestBody = { ...body, modal: "mcp_server", source: brandSource() };
6
7
  const response = await fetch(`${config.apiBase}${endpoint}`, {
7
8
  method,
8
9
  headers: {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,QAAgB,EAChB,IAAS,EACT,SAAiB,MAAM;IAEvB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE;YAC5D,MAAM;YACN,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;aACxC;YACD,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,iCAAiC;QACjC,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,wBAAwB,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,0DAA0D;QAC1D,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,QAAgB,EAChB,IAAS,EACT,SAAiB,MAAM;IAEvB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;QAE5E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE;YAC5D,MAAM;YACN,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;aACxC;YACD,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,iCAAiC;QACjC,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,wBAAwB,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,0DAA0D;QAC1D,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/api/config-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5C,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE/D;AAED,wBAAgB,SAAS,IAAI,MAAM,CAMlC"}
1
+ {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/api/config-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAK5C,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE/D;AAED,wBAAgB,SAAS,IAAI,MAAM,CAMlC"}
@@ -1,11 +1,12 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
+ import { brandApiBase } from "../config/brand.js";
2
3
  const configStorage = new AsyncLocalStorage();
3
4
  export function runWithConfig(config, fn) {
4
5
  return configStorage.run(config, fn);
5
6
  }
6
7
  export function getConfig() {
7
8
  return (configStorage.getStore() ??
8
- global.infranodusConfig ??
9
- { apiKey: "", apiBase: "https://infranodus.com/api/v1" });
9
+ global.brandConfig ??
10
+ { apiKey: "", apiBase: brandApiBase() });
10
11
  }
11
12
  //# sourceMappingURL=config-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/api/config-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAU,CAAC;AAEtD,MAAM,UAAU,aAAa,CAAI,MAAc,EAAE,EAAW;IAC3D,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,SAAS;IACxB,OAAO,CACN,aAAa,CAAC,QAAQ,EAAE;QACvB,MAAc,CAAC,gBAAgB;QAChC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE,CACxD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/api/config-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAU,CAAC;AAEtD,MAAM,UAAU,aAAa,CAAI,MAAc,EAAE,EAAW;IAC3D,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,SAAS;IACxB,OAAO,CACN,aAAa,CAAC,QAAQ,EAAE;QACvB,MAAc,CAAC,WAAW;QAC3B,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,CACvC,CAAC;AACH,CAAC"}
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * OAuth2-style authentication provider for the MCP HTTP server
3
- * Validates InfraNodus API keys and issues JWT access tokens
3
+ * Validates API keys and issues JWT access tokens
4
4
  */
5
5
  import { InfraNodusUserInfo, TokenResponse, AuthenticatedRequest, RegisteredClient, ClientRegistrationRequest, ClientRegistrationResponse } from "./types.js";
6
6
  /**
7
- * Validate an InfraNodus API key by calling the /api/v1/userId endpoint
7
+ * Validate an API key by calling the /api/v1/userId endpoint
8
8
  * Returns user info if valid, null if invalid
9
9
  */
10
10
  export declare function validateApiKey(apiKey: string): Promise<InfraNodusUserInfo | null>;
11
11
  /**
12
- * Exchange an InfraNodus API key for a JWT access token
12
+ * Exchange an API key for a JWT access token
13
13
  */
14
14
  export declare function exchangeApiKeyForToken(apiKey: string): Promise<TokenResponse | null>;
15
15
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-provider.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACN,kBAAkB,EAElB,aAAa,EAEb,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,EAE1B,MAAM,YAAY,CAAC;AAmBpB;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAmCvF;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA4B1F;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAmC5E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAa/C;AAYD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,yBAAyB,GAAG,0BAA0B,CA0B7F;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAK/E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAIlF;AAQD;;GAEG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,EACtB,mBAAmB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAcR;AAeD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAwC/B"}
1
+ {"version":3,"file":"oauth-provider.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACN,kBAAkB,EAElB,aAAa,EAEb,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,EAE1B,MAAM,YAAY,CAAC;AAmBpB;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAmCvF;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA4B1F;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAmC5E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAa/C;AAYD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,yBAAyB,GAAG,0BAA0B,CA0B7F;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAK/E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAIlF;AAQD;;GAEG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,EACtB,mBAAmB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAcR;AAeD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAwC/B"}
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * OAuth2-style authentication provider for the MCP HTTP server
3
- * Validates InfraNodus API keys and issues JWT access tokens
3
+ * Validates API keys and issues JWT access tokens
4
4
  */
5
5
  import jwt from "jsonwebtoken";
6
6
  import crypto from "crypto";
7
+ import { brandApiBase } from "../config/brand.js";
7
8
  // In-memory stores
8
9
  const sessions = new Map();
9
10
  const clients = new Map();
@@ -11,7 +12,7 @@ const authorizationCodes = new Map();
11
12
  // Configuration
12
13
  const JWT_SECRET = process.env.JWT_SECRET || crypto.randomBytes(32).toString("hex");
13
14
  const TOKEN_EXPIRY_SECONDS = 86400 * 365 * 100; // 100 years - effectively never expires
14
- const INFRANODUS_API_BASE = process.env.INFRANODUS_API_BASE || "https://infranodus.com/api/v1";
15
+ const BRAND_API_BASE = brandApiBase();
15
16
  /**
16
17
  * Hash an API key for storage in JWT (we don't store the actual key in the token)
17
18
  */
@@ -19,12 +20,12 @@ function hashApiKey(apiKey) {
19
20
  return crypto.createHash("sha256").update(apiKey).digest("hex").slice(0, 16);
20
21
  }
21
22
  /**
22
- * Validate an InfraNodus API key by calling the /api/v1/userId endpoint
23
+ * Validate an API key by calling the /api/v1/userId endpoint
23
24
  * Returns user info if valid, null if invalid
24
25
  */
25
26
  export async function validateApiKey(apiKey) {
26
27
  try {
27
- const response = await fetch(`${INFRANODUS_API_BASE}/userId`, {
28
+ const response = await fetch(`${BRAND_API_BASE}/userId`, {
28
29
  method: "POST",
29
30
  headers: {
30
31
  "Content-Type": "application/json",
@@ -55,10 +56,10 @@ export async function validateApiKey(apiKey) {
55
56
  }
56
57
  }
57
58
  /**
58
- * Exchange an InfraNodus API key for a JWT access token
59
+ * Exchange an API key for a JWT access token
59
60
  */
60
61
  export async function exchangeApiKeyForToken(apiKey) {
61
- // Validate the API key against InfraNodus
62
+ // Validate the API key against the brand API
62
63
  const userInfo = await validateApiKey(apiKey);
63
64
  if (!userInfo) {
64
65
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../../src/auth/oauth-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../../src/auth/oauth-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Brand configuration.
3
+ *
4
+ * One codebase ships as multiple branded MCP servers. The active brand is
5
+ * selected at runtime by the BRAND environment variable (set per deploy target,
6
+ * e.g. in each Fly app's [env] block). This keeps a single source tree and a
7
+ * single built image — only BRAND (and the per-app secrets) differ between
8
+ * deployments.
9
+ *
10
+ * Defaults to "infranodus" (the full product, all tools exposed) when BRAND is
11
+ * unset, so a missing BRAND never silently hides tools.
12
+ */
13
+ export type BrandId = "infranodus" | "keywordgraph";
14
+ export interface BrandDef {
15
+ id: BrandId;
16
+ /** Human-facing product name shown in titles, resources, and auth pages. */
17
+ name: string;
18
+ /** Bare domain, e.g. for links and copy. */
19
+ domain: string;
20
+ /** Default API base when the brand's *_API_BASE env var is unset. */
21
+ apiBase: string;
22
+ /** Prefix for this brand's env vars: `${envPrefix}_API_KEY`, `${envPrefix}_API_BASE`. */
23
+ envPrefix: string;
24
+ /** MCP server identifier reported to clients. */
25
+ serverName: string;
26
+ /**
27
+ * Tool `name` values NOT registered for this brand. Every tool file is always
28
+ * compiled in; this list is the single source of truth for which ones a brand
29
+ * exposes. New upstream tools appear in every brand automatically unless added
30
+ * here.
31
+ */
32
+ excludedTools: string[];
33
+ /**
34
+ * npm publish identity. The committed package.json holds one brand; the
35
+ * publish script (scripts/publish-brand.mjs) rewrites these fields for the
36
+ * brand being published, then restores. `binName` must match a launcher in
37
+ * bin/ that bakes in this brand's BRAND value.
38
+ */
39
+ npm: {
40
+ packageName: string;
41
+ binName: string;
42
+ description: string;
43
+ repository: string;
44
+ keywords: string[];
45
+ };
46
+ }
47
+ export declare const brand: BrandDef;
48
+ /**
49
+ * API key for the active brand. Prefers the brand-specific var
50
+ * (`${envPrefix}_API_KEY`) and falls back to the other brand's var so a single
51
+ * key works in mixed local setups.
52
+ */
53
+ export declare function brandApiKey(): string;
54
+ /** API base for the active brand: brand-specific env var, else the brand default. */
55
+ export declare function brandApiBase(): string;
56
+ /**
57
+ * Per-instance source tag sent to the API (as `source`) so analytics can tell
58
+ * deploys apart. Brand alone is not enough: e.g. the ExaltGrowth and
59
+ * KeywordGraph apps both run BRAND=keywordgraph, so they share a brand but are
60
+ * distinct instances.
61
+ *
62
+ * Resolution order:
63
+ * 1. MCP_SOURCE — explicit per-deploy override (set in each fly.*.toml).
64
+ * 2. FLY_APP_NAME — auto-injected by Fly; the trailing `-mcp-server` is
65
+ * stripped so e.g. `exaltgrowth-mcp-server` → `exaltgrowth`.
66
+ * 3. brand.id — final fallback for local/npm/smithery runs.
67
+ */
68
+ export declare function brandSource(): string;
69
+ /** Whether a tool (by its MCP `name`) is exposed for the active brand. */
70
+ export declare function isToolEnabled(name: string): boolean;
71
+ //# sourceMappingURL=brand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/config/brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,cAAc,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,yFAAyF;IACzF,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB;;;;;OAKG;IACH,GAAG,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;CACF;AAsED,eAAO,MAAM,KAAK,EAAE,QAAyB,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAOpC;AAED,qFAAqF;AACrF,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAQpC;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Brand configuration.
3
+ *
4
+ * One codebase ships as multiple branded MCP servers. The active brand is
5
+ * selected at runtime by the BRAND environment variable (set per deploy target,
6
+ * e.g. in each Fly app's [env] block). This keeps a single source tree and a
7
+ * single built image — only BRAND (and the per-app secrets) differ between
8
+ * deployments.
9
+ *
10
+ * Defaults to "infranodus" (the full product, all tools exposed) when BRAND is
11
+ * unset, so a missing BRAND never silently hides tools.
12
+ */
13
+ const BRANDS = {
14
+ infranodus: {
15
+ id: "infranodus",
16
+ name: "InfraNodus",
17
+ domain: "infranodus.com",
18
+ apiBase: "https://infranodus.com/api/v1",
19
+ envPrefix: "INFRANODUS",
20
+ serverName: "infranodus-mcp-server",
21
+ excludedTools: [],
22
+ npm: {
23
+ packageName: "infranodus-mcp-server",
24
+ binName: "infranodus-mcp-server",
25
+ description: "InfraNodus MCP server - A Model Context Protocol server for network thinking and graph analysis",
26
+ repository: "https://github.com/infranodus/mcp-server-infranodus.git",
27
+ keywords: [
28
+ "mcp",
29
+ "model-context-protocol",
30
+ "infranodus",
31
+ "knowledge-graph",
32
+ "network-analysis",
33
+ ],
34
+ },
35
+ },
36
+ keywordgraph: {
37
+ id: "keywordgraph",
38
+ name: "KeywordGraph",
39
+ domain: "keywordgraph.com",
40
+ apiBase: "https://keywordgraph.com/api/v1",
41
+ envPrefix: "KEYWORDGRAPH",
42
+ serverName: "keywordgraph-mcp-server",
43
+ // KeywordGraph is the keyword/SEO-focused subset: graph-building,
44
+ // memory, research-ideation, and discourse-development tools are hidden.
45
+ excludedTools: [
46
+ "generate_knowledge_graph",
47
+ "generate_ontology_graph",
48
+ "memory_add_relations",
49
+ "memory_get_relations",
50
+ "generate_research_questions",
51
+ "generate_research_ideas",
52
+ "generate_responses_from_graph",
53
+ "develop_conceptual_bridges",
54
+ "develop_latent_topics",
55
+ "generate_contextual_hint",
56
+ "retrieve_from_knowledge_base",
57
+ ],
58
+ npm: {
59
+ packageName: "keywordgraph-mcp-server",
60
+ binName: "keywordgraph-mcp-server",
61
+ description: "KeywordGraph MCP server - A Model Context Protocol server for network thinking and graph analysis",
62
+ repository: "https://github.com/keywordgraph/mcp-server-keywordgraph.git",
63
+ keywords: [
64
+ "mcp",
65
+ "model-context-protocol",
66
+ "keywordgraph",
67
+ "knowledge-graph",
68
+ "network-analysis",
69
+ ],
70
+ },
71
+ },
72
+ };
73
+ function resolveBrand() {
74
+ const id = process.env.BRAND;
75
+ return id && BRANDS[id] ? BRANDS[id] : BRANDS.infranodus;
76
+ }
77
+ export const brand = resolveBrand();
78
+ /**
79
+ * API key for the active brand. Prefers the brand-specific var
80
+ * (`${envPrefix}_API_KEY`) and falls back to the other brand's var so a single
81
+ * key works in mixed local setups.
82
+ */
83
+ export function brandApiKey() {
84
+ return (process.env[`${brand.envPrefix}_API_KEY`] ||
85
+ process.env.INFRANODUS_API_KEY ||
86
+ process.env.KEYWORDGRAPH_API_KEY ||
87
+ "");
88
+ }
89
+ /** API base for the active brand: brand-specific env var, else the brand default. */
90
+ export function brandApiBase() {
91
+ return process.env[`${brand.envPrefix}_API_BASE`] || brand.apiBase;
92
+ }
93
+ /**
94
+ * Per-instance source tag sent to the API (as `source`) so analytics can tell
95
+ * deploys apart. Brand alone is not enough: e.g. the ExaltGrowth and
96
+ * KeywordGraph apps both run BRAND=keywordgraph, so they share a brand but are
97
+ * distinct instances.
98
+ *
99
+ * Resolution order:
100
+ * 1. MCP_SOURCE — explicit per-deploy override (set in each fly.*.toml).
101
+ * 2. FLY_APP_NAME — auto-injected by Fly; the trailing `-mcp-server` is
102
+ * stripped so e.g. `exaltgrowth-mcp-server` → `exaltgrowth`.
103
+ * 3. brand.id — final fallback for local/npm/smithery runs.
104
+ */
105
+ export function brandSource() {
106
+ const explicit = process.env.MCP_SOURCE?.trim();
107
+ if (explicit)
108
+ return explicit;
109
+ const flyApp = process.env.FLY_APP_NAME?.trim();
110
+ if (flyApp)
111
+ return flyApp.replace(/-mcp-server$/, "");
112
+ return brand.id;
113
+ }
114
+ /** Whether a tool (by its MCP `name`) is exposed for the active brand. */
115
+ export function isToolEnabled(name) {
116
+ return !brand.excludedTools.includes(name);
117
+ }
118
+ //# sourceMappingURL=brand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand.js","sourceRoot":"","sources":["../../src/config/brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsCH,MAAM,MAAM,GAA8B;IACzC,UAAU,EAAE;QACX,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,+BAA+B;QACxC,SAAS,EAAE,YAAY;QACvB,UAAU,EAAE,uBAAuB;QACnC,aAAa,EAAE,EAAE;QACjB,GAAG,EAAE;YACJ,WAAW,EAAE,uBAAuB;YACpC,OAAO,EAAE,uBAAuB;YAChC,WAAW,EACV,iGAAiG;YAClG,UAAU,EAAE,yDAAyD;YACrE,QAAQ,EAAE;gBACT,KAAK;gBACL,wBAAwB;gBACxB,YAAY;gBACZ,iBAAiB;gBACjB,kBAAkB;aAClB;SACD;KACD;IACD,YAAY,EAAE;QACb,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,kBAAkB;QAC1B,OAAO,EAAE,iCAAiC;QAC1C,SAAS,EAAE,cAAc;QACzB,UAAU,EAAE,yBAAyB;QACrC,kEAAkE;QAClE,yEAAyE;QACzE,aAAa,EAAE;YACd,0BAA0B;YAC1B,yBAAyB;YACzB,sBAAsB;YACtB,sBAAsB;YACtB,6BAA6B;YAC7B,yBAAyB;YACzB,+BAA+B;YAC/B,4BAA4B;YAC5B,uBAAuB;YACvB,0BAA0B;YAC1B,8BAA8B;SAC9B;QACD,GAAG,EAAE;YACJ,WAAW,EAAE,yBAAyB;YACtC,OAAO,EAAE,yBAAyB;YAClC,WAAW,EACV,mGAAmG;YACpG,UAAU,EAAE,6DAA6D;YACzE,QAAQ,EAAE;gBACT,KAAK;gBACL,wBAAwB;gBACxB,cAAc;gBACd,iBAAiB;gBACjB,kBAAkB;aAClB;SACD;KACD;CACD,CAAC;AAEF,SAAS,YAAY;IACpB,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAA4B,CAAC;IACpD,OAAO,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAa,YAAY,EAAE,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,WAAW;IAC1B,OAAO,CACN,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,UAAU,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAC9B,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAChC,EAAE,CACF,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,YAAY;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC;AACpE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAChD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IAChD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAEtD,OAAO,KAAK,CAAC,EAAE,CAAC;AACjB,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { brand } from "./brand.js";
2
3
  export declare const configSchema: z.ZodObject<{
3
4
  apiKey: z.ZodOptional<z.ZodString>;
4
5
  apiBase: z.ZodDefault<z.ZodString>;
@@ -21,4 +22,5 @@ export declare const serverInfo: {
21
22
  version: string;
22
23
  description: string;
23
24
  };
25
+ export { brand };
24
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;EAQvB,CAAC;AAGH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAGlD,eAAO,MAAM,UAAU;;;;CAKtB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;EAQvB,CAAC;AAGH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAGlD,eAAO,MAAM,UAAU;;;;CAItB,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -1,18 +1,20 @@
1
1
  import { z } from "zod";
2
+ import { brand } from "./brand.js";
2
3
  // Define the configuration schema for Smithery
3
4
  export const configSchema = z.object({
4
- apiKey: z.string().optional().describe("Your InfraNodus API key"),
5
+ apiKey: z.string().optional().describe(`Your ${brand.name} API key`),
5
6
  apiBase: z
6
7
  .string()
7
- .default("https://infranodus.com/api/v1")
8
- .describe("InfraNodus API base URL"),
8
+ .default(brand.apiBase)
9
+ .describe(`${brand.name} API base URL`),
9
10
  userId: z.number().optional().describe("Authenticated user ID"),
10
11
  userName: z.string().optional().describe("Authenticated user name"),
11
12
  });
12
13
  // Server metadata
13
14
  export const serverInfo = {
14
- name: "infranodus-mcp-server",
15
+ name: brand.serverName,
15
16
  version: "1.1.0",
16
- description: "MCP server for InfraNodus knowledge graph generation, comparison, entity extraction, content gap, and SEO analysis.",
17
+ description: `MCP server for ${brand.name} knowledge graph generation, comparison, entity extraction, content gap, and SEO analysis.`,
17
18
  };
19
+ export { brand };
18
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,+CAA+C;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACjE,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,OAAO,CAAC,+BAA+B,CAAC;SACxC,QAAQ,CAAC,yBAAyB,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACnE,CAAC,CAAC;AAKH,kBAAkB;AAClB,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,IAAI,EAAE,uBAAuB;IAC7B,OAAO,EAAE,OAAO;IAChB,WAAW,EACV,qHAAqH;CACtH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,+CAA+C;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,CAAC,IAAI,UAAU,CAAC;IACpE,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;SACtB,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,eAAe,CAAC;IACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACnE,CAAC,CAAC;AAKH,kBAAkB;AAClB,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,IAAI,EAAE,KAAK,CAAC,UAAU;IACtB,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,kBAAkB,KAAK,CAAC,IAAI,4FAA4F;CACrI,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * HTTP Server entry point for InfraNodus MCP Server
2
+ * HTTP Server entry point for the MCP Server
3
3
  * Exposes the MCP server over HTTP with OAuth2-style authentication
4
4
  */
5
5
  export {};
@@ -1,5 +1,5 @@
1
1
  /**
2
- * HTTP Server entry point for InfraNodus MCP Server
2
+ * HTTP Server entry point for the MCP Server
3
3
  * Exposes the MCP server over HTTP with OAuth2-style authentication
4
4
  */
5
5
  import express from "express";
@@ -16,12 +16,13 @@ import { Socket } from "net";
16
16
  import * as fs from "fs";
17
17
  import * as path from "path";
18
18
  import { fileURLToPath } from "url";
19
+ import { brand, brandApiBase } from "./config/brand.js";
19
20
  // Load environment variables
20
21
  dotenv.config();
21
22
  // Configuration
22
23
  const PORT = parseInt(process.env.PORT || "3000", 10);
23
24
  const CORS_ORIGIN = process.env.CORS_ORIGIN || "*";
24
- const INFRANODUS_API_BASE = process.env.INFRANODUS_API_BASE || "https://infranodus.com/api/v1";
25
+ const BRAND_API_BASE = brandApiBase();
25
26
  function escapeHtml(str) {
26
27
  return str
27
28
  .replace(/&/g, "&amp;")
@@ -77,7 +78,7 @@ const transports = new Map();
77
78
  const sseTransports = new Map();
78
79
  /**
79
80
  * Auth middleware - validates Bearer token and attaches auth info to request.
80
- * Supports both JWT access tokens (from OAuth flow) and raw InfraNodus API keys.
81
+ * Supports both JWT access tokens (from OAuth flow) and raw API keys.
81
82
  */
82
83
  async function authMiddleware(req, res, next) {
83
84
  console.log(`[AUTH] Checking auth for ${req.method} ${req.path}`);
@@ -103,7 +104,7 @@ async function authMiddleware(req, res, next) {
103
104
  next();
104
105
  return;
105
106
  }
106
- // JWT failed — try treating the token as a raw InfraNodus API key
107
+ // JWT failed — try treating the token as a raw API key
107
108
  console.log(`[AUTH] JWT verification failed, trying as raw API key...`);
108
109
  try {
109
110
  const userInfo = await validateApiKey(token);
@@ -222,7 +223,7 @@ app.get("/oauth/authorize", (req, res) => {
222
223
  <!DOCTYPE html>
223
224
  <html>
224
225
  <head>
225
- <title>InfraNodus MCP - Authorize</title>
226
+ <title>${brand.name} MCP - Authorize</title>
226
227
  <meta name="viewport" content="width=device-width, initial-scale=1">
227
228
  <style>
228
229
  body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 400px; margin: 50px auto; padding: 20px; }
@@ -239,7 +240,7 @@ app.get("/oauth/authorize", (req, res) => {
239
240
  <h1>Authorize Access</h1>
240
241
  <p class="client-name">Application: <strong>${clientName}</strong></p>
241
242
  <div class="info">
242
- Enter your InfraNodus API key to authorize this application to access your InfraNodus data.
243
+ Enter your ${brand.name} API key to authorize this application to access your ${brand.name} data.
243
244
  </div>
244
245
  <form method="POST" action="/oauth/authorize">
245
246
  <input type="hidden" name="client_id" value="${safeClientId}">
@@ -249,7 +250,7 @@ app.get("/oauth/authorize", (req, res) => {
249
250
  <input type="hidden" name="scope" value="${safeScope}">
250
251
  <input type="hidden" name="code_challenge" value="${safeCodeChallenge}">
251
252
  <input type="hidden" name="code_challenge_method" value="${safeCodeChallengeMethod}">
252
- <label for="api_key">InfraNodus API Key</label>
253
+ <label for="api_key">${brand.name} API Key</label>
253
254
  <input type="password" id="api_key" name="api_key" required placeholder="Enter your API key">
254
255
  <button type="submit">Authorize</button>
255
256
  </form>
@@ -333,7 +334,7 @@ app.post("/oauth/token", express.urlencoded({ extended: true }), async (req, res
333
334
  }
334
335
  // Note: We skip strict client validation here because:
335
336
  // 1. Multiple server instances don't share client registration state
336
- // 2. The real authentication is via the InfraNodus API key in the auth code
337
+ // 2. The real authentication is via the API key in the auth code
337
338
  // 3. The authorization code itself validates the client_id and redirect_uri
338
339
  const tokenResponse = await exchangeAuthorizationCode(code, client_id, redirect_uri, code_verifier);
339
340
  if (!tokenResponse) {
@@ -353,7 +354,7 @@ app.post("/oauth/token", express.urlencoded({ extended: true }), async (req, res
353
354
  if (!tokenResponse) {
354
355
  res.status(401).json({
355
356
  error: "invalid_grant",
356
- error_description: "Invalid InfraNodus API key",
357
+ error_description: `Invalid ${brand.name} API key`,
357
358
  });
358
359
  return;
359
360
  }
@@ -556,7 +557,7 @@ async function handleMcpRequest(req, res) {
556
557
  });
557
558
  const config = {
558
559
  apiKey: auth.apiKey,
559
- apiBase: INFRANODUS_API_BASE,
560
+ apiBase: BRAND_API_BASE,
560
561
  userId: auth.userId,
561
562
  userName: auth.userName,
562
563
  };
@@ -685,7 +686,7 @@ async function handleSseConnection(req, res) {
685
686
  sseTransports.set(sessionId, { transport, userId: auth.userId });
686
687
  const config = {
687
688
  apiKey: auth.apiKey,
688
- apiBase: INFRANODUS_API_BASE,
689
+ apiBase: BRAND_API_BASE,
689
690
  userId: auth.userId,
690
691
  userName: auth.userName,
691
692
  };
@@ -791,9 +792,9 @@ app.get("/", (req, res, next) => {
791
792
  return next();
792
793
  }
793
794
  res.json({
794
- name: "InfraNodus MCP Server",
795
- version: "1.5.2",
796
- description: "MCP server for InfraNodus knowledge graph analysis",
795
+ name: `${brand.name} MCP Server`,
796
+ version: "1.6.2",
797
+ description: `MCP server for ${brand.name} knowledge graph analysis`,
797
798
  endpoints: {
798
799
  oauth: {
799
800
  token: "POST /oauth/token",
@@ -892,7 +893,7 @@ process.on("SIGTERM", () => {
892
893
  });
893
894
  // Start the server
894
895
  app.listen(PORT, () => {
895
- console.log(`InfraNodus MCP HTTP Server running on port ${PORT}`);
896
+ console.log(`${brand.name} MCP HTTP Server running on port ${PORT}`);
896
897
  console.log(` - Health: http://localhost:${PORT}/health`);
897
898
  console.log(` - OAuth token: POST http://localhost:${PORT}/oauth/token`);
898
899
  console.log(` - MCP endpoint: http://localhost:${PORT}/mcp`);
@@ -900,7 +901,7 @@ app.listen(PORT, () => {
900
901
  console.log("");
901
902
  console.log("Environment:");
902
903
  console.log(` - CORS_ORIGIN: ${CORS_ORIGIN}`);
903
- console.log(` - INFRANODUS_API_BASE: ${INFRANODUS_API_BASE}`);
904
+ console.log(` - ${brand.envPrefix}_API_BASE: ${BRAND_API_BASE}`);
904
905
  console.log(` - JWT_SECRET: ${process.env.JWT_SECRET ? "[set]" : "[generated]"}`);
905
906
  });
906
907
  //# sourceMappingURL=http-server.js.map