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.
- package/README.md +113 -118
- package/bin/infranodus-mcp-server.js +7 -53
- package/bin/keywordgraph-mcp-server.js +8 -0
- package/bin/mcp-server.js +56 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +2 -1
- package/dist/api/client.js.map +1 -1
- package/dist/api/config-store.d.ts.map +1 -1
- package/dist/api/config-store.js +3 -2
- package/dist/api/config-store.js.map +1 -1
- package/dist/auth/oauth-provider.d.ts +3 -3
- package/dist/auth/oauth-provider.d.ts.map +1 -1
- package/dist/auth/oauth-provider.js +7 -6
- package/dist/auth/oauth-provider.js.map +1 -1
- package/dist/config/brand.d.ts +71 -0
- package/dist/config/brand.d.ts.map +1 -0
- package/dist/config/brand.js +118 -0
- package/dist/config/brand.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +7 -5
- package/dist/config/index.js.map +1 -1
- package/dist/http-server.d.ts +1 -1
- package/dist/http-server.js +17 -16
- package/dist/http-server.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -33
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +4 -3
- package/dist/instructions.js.map +1 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +10 -9
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/about.d.ts.map +1 -1
- package/dist/resources/about.js +28 -35
- package/dist/resources/about.js.map +1 -1
- package/dist/resources/llms-txt.d.ts.map +1 -1
- package/dist/resources/llms-txt.js +21 -10
- package/dist/resources/llms-txt.js.map +1 -1
- package/dist/schemas/index.d.ts +217 -48
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +262 -63
- package/dist/schemas/index.js.map +1 -1
- package/dist/tools/addMemory.d.ts.map +1 -1
- package/dist/tools/addMemory.js +3 -2
- package/dist/tools/addMemory.js.map +1 -1
- package/dist/tools/analyzeExistingGraph.d.ts +1 -0
- package/dist/tools/analyzeExistingGraph.d.ts.map +1 -1
- package/dist/tools/analyzeExistingGraph.js +8 -3
- package/dist/tools/analyzeExistingGraph.js.map +1 -1
- package/dist/tools/analyzeLlmResults.d.ts +37 -0
- package/dist/tools/analyzeLlmResults.d.ts.map +1 -0
- package/dist/tools/analyzeLlmResults.js +192 -0
- package/dist/tools/analyzeLlmResults.js.map +1 -0
- package/dist/tools/analyzeText.d.ts.map +1 -1
- package/dist/tools/analyzeText.js +2 -1
- package/dist/tools/analyzeText.js.map +1 -1
- package/dist/tools/createKnowledgeGraph.d.ts.map +1 -1
- package/dist/tools/createKnowledgeGraph.js +3 -2
- package/dist/tools/createKnowledgeGraph.js.map +1 -1
- package/dist/tools/developConceptualBridges.d.ts +1 -1
- package/dist/tools/developLatentTopics.d.ts +1 -1
- package/dist/tools/developTextTool.d.ts +1 -1
- package/dist/tools/generateContextualHint.d.ts +1 -0
- package/dist/tools/generateContextualHint.d.ts.map +1 -1
- package/dist/tools/generateContextualHint.js +4 -1
- package/dist/tools/generateContextualHint.js.map +1 -1
- package/dist/tools/generateDifferenceGraphFromTexts.d.ts.map +1 -1
- package/dist/tools/generateDifferenceGraphFromTexts.js +2 -1
- package/dist/tools/generateDifferenceGraphFromTexts.js.map +1 -1
- package/dist/tools/generateMergedGraphFromTexts.d.ts.map +1 -1
- package/dist/tools/generateMergedGraphFromTexts.js +2 -1
- package/dist/tools/generateMergedGraphFromTexts.js.map +1 -1
- package/dist/tools/generateOntologyGraph.d.ts +36 -0
- package/dist/tools/generateOntologyGraph.d.ts.map +1 -0
- package/dist/tools/generateOntologyGraph.js +194 -0
- package/dist/tools/generateOntologyGraph.js.map +1 -0
- package/dist/tools/generateResearchIdeas.d.ts +3 -1
- package/dist/tools/generateResearchIdeas.d.ts.map +1 -1
- package/dist/tools/generateResearchIdeas.js +2 -1
- package/dist/tools/generateResearchIdeas.js.map +1 -1
- package/dist/tools/generateResearchQuestions.d.ts +3 -1
- package/dist/tools/generateResearchQuestions.d.ts.map +1 -1
- package/dist/tools/generateResearchQuestions.js +5 -4
- package/dist/tools/generateResearchQuestions.js.map +1 -1
- package/dist/tools/generateResponses.d.ts +2 -1
- package/dist/tools/generateResponses.d.ts.map +1 -1
- package/dist/tools/generateResponses.js +3 -1
- package/dist/tools/generateResponses.js.map +1 -1
- package/dist/tools/generateTopicalClusters.d.ts +2 -0
- package/dist/tools/generateTopicalClusters.d.ts.map +1 -1
- package/dist/tools/generateTopicalClusters.js +40 -2
- package/dist/tools/generateTopicalClusters.js.map +1 -1
- package/dist/tools/generateYoutubeSearchResultsGraph.d.ts +42 -0
- package/dist/tools/generateYoutubeSearchResultsGraph.d.ts.map +1 -0
- package/dist/tools/generateYoutubeSearchResultsGraph.js +97 -0
- package/dist/tools/generateYoutubeSearchResultsGraph.js.map +1 -0
- package/dist/tools/getMemory.d.ts.map +1 -1
- package/dist/tools/getMemory.js +3 -2
- package/dist/tools/getMemory.js.map +1 -1
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/listGraphs.d.ts +1 -0
- package/dist/tools/listGraphs.d.ts.map +1 -1
- package/dist/tools/listGraphs.js +7 -1
- package/dist/tools/listGraphs.js.map +1 -1
- package/dist/tools/optimizeTextStructure.d.ts +1 -1
- package/dist/tools/retrieveContextForPromptFromGraph.d.ts +1 -0
- package/dist/tools/retrieveContextForPromptFromGraph.d.ts.map +1 -1
- package/dist/tools/retrieveContextForPromptFromGraph.js +4 -2
- package/dist/tools/retrieveContextForPromptFromGraph.js.map +1 -1
- package/dist/tools/searchGraphs.d.ts.map +1 -1
- package/dist/tools/searchGraphs.js +3 -2
- package/dist/tools/searchGraphs.js.map +1 -1
- package/dist/tools/searchGraphsFetch.d.ts.map +1 -1
- package/dist/tools/searchGraphsFetch.js +2 -1
- package/dist/tools/searchGraphsFetch.js.map +1 -1
- package/dist/types/index.d.ts +66 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/transformers.d.ts +3 -1
- package/dist/utils/transformers.d.ts.map +1 -1
- package/dist/utils/transformers.js +57 -4
- package/dist/utils/transformers.js.map +1 -1
- package/dist/utils/urlContent.d.ts +1 -1
- package/dist/utils/urlContent.js +1 -1
- package/llms-full.infranodus.txt +469 -0
- package/llms-full.keywordgraph.txt +469 -0
- package/llms-full.txt +2 -2
- package/llms.infranodus.txt +64 -0
- package/llms.keywordgraph.txt +64 -0
- 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
|
+
});
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/api/client.js
CHANGED
|
@@ -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: {
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,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;
|
|
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"}
|
package/dist/api/config-store.js
CHANGED
|
@@ -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.
|
|
9
|
-
{ apiKey: "", apiBase:
|
|
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;
|
|
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
|
|
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
|
|
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
|
|
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;
|
|
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
|
|
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
|
|
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
|
|
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(`${
|
|
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
|
|
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
|
|
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":"AAAA;;;GAGG;AAEH,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
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"}
|
package/dist/config/index.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/config/index.js
CHANGED
|
@@ -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(
|
|
5
|
+
apiKey: z.string().optional().describe(`Your ${brand.name} API key`),
|
|
5
6
|
apiBase: z
|
|
6
7
|
.string()
|
|
7
|
-
.default(
|
|
8
|
-
.describe(
|
|
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:
|
|
15
|
+
name: brand.serverName,
|
|
15
16
|
version: "1.1.0",
|
|
16
|
-
description:
|
|
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
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,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"}
|
package/dist/http-server.d.ts
CHANGED
package/dist/http-server.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HTTP Server entry point for
|
|
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
|
|
25
|
+
const BRAND_API_BASE = brandApiBase();
|
|
25
26
|
function escapeHtml(str) {
|
|
26
27
|
return str
|
|
27
28
|
.replace(/&/g, "&")
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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"
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
795
|
-
version: "1.
|
|
796
|
-
description:
|
|
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(
|
|
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(` -
|
|
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
|