@intlayer/mcp 6.1.6 → 7.0.0-canary.1
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/dist/cjs/_virtual/rolldown_runtime.cjs +25 -0
- package/dist/cjs/client/client.cjs +22 -42
- package/dist/cjs/client/client.cjs.map +1 -1
- package/dist/cjs/client/sse.cjs +59 -57
- package/dist/cjs/client/sse.cjs.map +1 -1
- package/dist/cjs/server/server.cjs +29 -53
- package/dist/cjs/server/server.cjs.map +1 -1
- package/dist/cjs/server/sse.cjs +92 -104
- package/dist/cjs/server/sse.cjs.map +1 -1
- package/dist/cjs/server/stdio.cjs +14 -9
- package/dist/cjs/server/stdio.cjs.map +1 -1
- package/dist/cjs/tools/cli.cjs +203 -268
- package/dist/cjs/tools/cli.cjs.map +1 -1
- package/dist/cjs/tools/docs.cjs +34 -145
- package/dist/cjs/tools/docs.cjs.map +1 -1
- package/dist/esm/client/client.mjs +12 -13
- package/dist/esm/client/client.mjs.map +1 -1
- package/dist/esm/client/sse.mjs +55 -55
- package/dist/esm/client/sse.mjs.map +1 -1
- package/dist/esm/server/server.mjs +20 -25
- package/dist/esm/server/server.mjs.map +1 -1
- package/dist/esm/server/sse.mjs +81 -74
- package/dist/esm/server/sse.mjs.map +1 -1
- package/dist/esm/server/stdio.mjs +10 -6
- package/dist/esm/server/stdio.mjs.map +1 -1
- package/dist/esm/tools/cli.mjs +199 -240
- package/dist/esm/tools/cli.mjs.map +1 -1
- package/dist/esm/tools/docs.mjs +31 -111
- package/dist/esm/tools/docs.mjs.map +1 -1
- package/dist/types/client/client.d.ts +8 -25
- package/dist/types/client/client.d.ts.map +1 -1
- package/dist/types/client/sse.d.ts +1 -2
- package/dist/types/server/server.d.ts +8 -3
- package/dist/types/server/server.d.ts.map +1 -1
- package/dist/types/server/sse.d.ts +1 -3
- package/dist/types/server/stdio.d.ts +1 -3
- package/dist/types/tools/cli.d.ts +7 -2
- package/dist/types/tools/cli.d.ts.map +1 -1
- package/dist/types/tools/docs.d.ts +7 -2
- package/dist/types/tools/docs.d.ts.map +1 -1
- package/package.json +47 -53
- package/LICENSE +0 -202
- package/dist/types/client/sse.d.ts.map +0 -1
- package/dist/types/server/sse.d.ts.map +0 -1
- package/dist/types/server/stdio.d.ts.map +0 -1
package/dist/cjs/tools/docs.cjs
CHANGED
|
@@ -1,148 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
-
};
|
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(from))
|
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
-
}
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var docs_exports = {};
|
|
30
|
-
__export(docs_exports, {
|
|
31
|
-
loadDocsTools: () => loadDocsTools
|
|
32
|
-
});
|
|
33
|
-
module.exports = __toCommonJS(docs_exports);
|
|
34
|
-
var import_cli = require("@intlayer/cli");
|
|
35
|
-
var import_config = require("@intlayer/config");
|
|
36
|
-
var import_docs = require("@intlayer/docs");
|
|
37
|
-
var import_zod = __toESM(require("zod"));
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
let zod_v3 = require("zod/v3");
|
|
3
|
+
zod_v3 = require_rolldown_runtime.__toESM(zod_v3);
|
|
4
|
+
let __intlayer_docs = require("@intlayer/docs");
|
|
5
|
+
__intlayer_docs = require_rolldown_runtime.__toESM(__intlayer_docs);
|
|
6
|
+
|
|
7
|
+
//#region src/tools/docs.ts
|
|
38
8
|
const loadDocsTools = async (server) => {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
env,
|
|
64
|
-
envFile,
|
|
65
|
-
override: {
|
|
66
|
-
log
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
return {
|
|
71
|
-
content: [
|
|
72
|
-
{
|
|
73
|
-
type: "text",
|
|
74
|
-
text: "Build successful."
|
|
75
|
-
}
|
|
76
|
-
]
|
|
77
|
-
};
|
|
78
|
-
} catch (error) {
|
|
79
|
-
const errorMessage = error instanceof Error ? error.message : "An unknown error occurred";
|
|
80
|
-
return {
|
|
81
|
-
content: [
|
|
82
|
-
{
|
|
83
|
-
type: "text",
|
|
84
|
-
text: `Build failed: ${errorMessage}`
|
|
85
|
-
}
|
|
86
|
-
]
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
);
|
|
91
|
-
server.tool(
|
|
92
|
-
"get-doc-list",
|
|
93
|
-
"Get the list of docs names and their metadata to get more details about what doc to retrieve",
|
|
94
|
-
{
|
|
95
|
-
lang: import_zod.default.nativeEnum(import_config.Locales).optional().describe("Language of the docs")
|
|
96
|
-
},
|
|
97
|
-
async ({ lang }) => {
|
|
98
|
-
const docsMetadataRecord = await (0, import_docs.getDocMetadataRecord)(lang);
|
|
99
|
-
return {
|
|
100
|
-
content: [
|
|
101
|
-
{
|
|
102
|
-
type: "text",
|
|
103
|
-
text: JSON.stringify(docsMetadataRecord, null, 2)
|
|
104
|
-
}
|
|
105
|
-
]
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
);
|
|
109
|
-
server.tool(
|
|
110
|
-
"get-doc",
|
|
111
|
-
"Get a doc by his key. Example: `./docs/en/getting-started.md`. List all docs metadata first to get more details about what doc key to retrieve.",
|
|
112
|
-
{
|
|
113
|
-
docKey: import_zod.default.string(),
|
|
114
|
-
lang: import_zod.default.nativeEnum(import_config.Locales).optional().describe("Language of the docs")
|
|
115
|
-
},
|
|
116
|
-
async ({ docKey, lang }) => {
|
|
117
|
-
const doc = await (0, import_docs.getDoc)(docKey, lang);
|
|
118
|
-
return {
|
|
119
|
-
content: [{ type: "text", text: doc }]
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
);
|
|
123
|
-
server.tool(
|
|
124
|
-
"get-doc-by-slug",
|
|
125
|
-
"Get an array of docs by their slugs. If not slug is provided, return all docs (1.2Mb). List all docs metadata first to get more details about what doc to retrieve.",
|
|
126
|
-
{
|
|
127
|
-
slug: import_zod.default.union([import_zod.default.string(), import_zod.default.array(import_zod.default.string())]).optional().describe(
|
|
128
|
-
"Slug of the docs. If not provided, return all docs. If not provided, return all docs."
|
|
129
|
-
),
|
|
130
|
-
lang: import_zod.default.nativeEnum(import_config.Locales).optional().describe("Language of the docs"),
|
|
131
|
-
strict: import_zod.default.boolean().optional().describe(
|
|
132
|
-
"Strict mode - only return docs that match all slugs, by excluding additional slugs"
|
|
133
|
-
),
|
|
134
|
-
description: "Get an array of docs by their slugs"
|
|
135
|
-
},
|
|
136
|
-
async ({ slug, lang, strict }) => {
|
|
137
|
-
const doc = await (0, import_docs.getDocBySlug)(slug, lang, strict);
|
|
138
|
-
return {
|
|
139
|
-
content: doc.map((d) => ({ type: "text", text: d }))
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
);
|
|
9
|
+
const docsKeys = (0, __intlayer_docs.getDocsKeys)();
|
|
10
|
+
server.tool("get-doc-list", "Get the list of docs names and their metadata to get more details about what doc to retrieve", {}, async () => {
|
|
11
|
+
const docsMetadataRecord = await (0, __intlayer_docs.getDocMetadataRecord)();
|
|
12
|
+
return { content: [{
|
|
13
|
+
type: "text",
|
|
14
|
+
text: JSON.stringify(docsMetadataRecord, null, 2)
|
|
15
|
+
}] };
|
|
16
|
+
});
|
|
17
|
+
server.tool("get-doc", "Get a doc by his key. Example: `./docs/en/getting-started.md`. List all docs metadata first to get more details about what doc key to retrieve.", { docKey: zod_v3.default.enum(docsKeys) }, async ({ docKey }) => {
|
|
18
|
+
return { content: [{
|
|
19
|
+
type: "text",
|
|
20
|
+
text: await (0, __intlayer_docs.getDoc)(docKey)
|
|
21
|
+
}] };
|
|
22
|
+
});
|
|
23
|
+
server.tool("get-doc-by-slug", "Get an array of docs by their slugs. If not slug is provided, return all docs (1.2Mb). List all docs metadata first to get more details about what doc to retrieve.", {
|
|
24
|
+
slug: zod_v3.default.union([zod_v3.default.string(), zod_v3.default.array(zod_v3.default.string())]).optional().describe("Slug of the docs. If not provided, return all docs. If not provided, return all docs."),
|
|
25
|
+
strict: zod_v3.default.boolean().optional().describe("Strict mode - only return docs that match all slugs, by excluding additional slugs"),
|
|
26
|
+
description: "Get an array of docs by their slugs"
|
|
27
|
+
}, async ({ slug, strict }) => {
|
|
28
|
+
return { content: (await (0, __intlayer_docs.getDocBySlug)(slug, void 0, strict)).map((d) => ({
|
|
29
|
+
type: "text",
|
|
30
|
+
text: d
|
|
31
|
+
})) };
|
|
32
|
+
});
|
|
143
33
|
};
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
});
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
exports.loadDocsTools = loadDocsTools;
|
|
148
37
|
//# sourceMappingURL=docs.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/tools/docs.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"docs.cjs","names":["loadDocsTools: LoadDocsTools","z"],"sources":["../../../src/tools/docs.ts"],"sourcesContent":["import {\n getDoc,\n getDocBySlug,\n getDocMetadataRecord,\n getDocsKeys,\n} from '@intlayer/docs';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod/v3';\n\ntype LoadDocsTools = (server: McpServer) => Promise<void>;\n\nexport const loadDocsTools: LoadDocsTools = async (server) => {\n const docsKeys = getDocsKeys();\n\n server.tool(\n 'get-doc-list',\n 'Get the list of docs names and their metadata to get more details about what doc to retrieve',\n {},\n async () => {\n const docsMetadataRecord = await getDocMetadataRecord();\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(docsMetadataRecord, null, 2),\n },\n ],\n };\n }\n );\n\n server.tool(\n 'get-doc',\n 'Get a doc by his key. Example: `./docs/en/getting-started.md`. List all docs metadata first to get more details about what doc key to retrieve.',\n {\n docKey: z.enum(docsKeys as [string, ...string[]]),\n },\n async ({ docKey }) => {\n const doc = await getDoc(docKey as any);\n return {\n content: [{ type: 'text', text: doc }],\n };\n }\n );\n\n server.tool(\n 'get-doc-by-slug',\n 'Get an array of docs by their slugs. If not slug is provided, return all docs (1.2Mb). List all docs metadata first to get more details about what doc to retrieve.',\n {\n slug: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe(\n 'Slug of the docs. If not provided, return all docs. If not provided, return all docs.'\n ),\n strict: z\n .boolean()\n .optional()\n .describe(\n 'Strict mode - only return docs that match all slugs, by excluding additional slugs'\n ),\n description: 'Get an array of docs by their slugs',\n },\n async ({ slug, strict }) => {\n const doc = await getDocBySlug(slug, undefined, strict);\n return {\n content: doc.map((d) => ({ type: 'text', text: d })),\n };\n }\n );\n};\n"],"mappings":";;;;;;;AAWA,MAAaA,gBAA+B,OAAO,WAAW;CAC5D,MAAM,6CAAwB;AAE9B,QAAO,KACL,gBACA,gGACA,EAAE,EACF,YAAY;EACV,MAAM,qBAAqB,iDAA4B;AAEvD,SAAO,EACL,SAAS,CACP;GACE,MAAM;GACN,MAAM,KAAK,UAAU,oBAAoB,MAAM,EAAE;GAClD,CACF,EACF;GAEJ;AAED,QAAO,KACL,WACA,mJACA,EACE,QAAQC,eAAE,KAAK,SAAkC,EAClD,EACD,OAAO,EAAE,aAAa;AAEpB,SAAO,EACL,SAAS,CAAC;GAAE,MAAM;GAAQ,MAFhB,kCAAa,OAAc;GAEA,CAAC,EACvC;GAEJ;AAED,QAAO,KACL,mBACA,uKACA;EACE,MAAMA,eACH,MAAM,CAACA,eAAE,QAAQ,EAAEA,eAAE,MAAMA,eAAE,QAAQ,CAAC,CAAC,CAAC,CACxC,UAAU,CACV,SACC,wFACD;EACH,QAAQA,eACL,SAAS,CACT,UAAU,CACV,SACC,qFACD;EACH,aAAa;EACd,EACD,OAAO,EAAE,MAAM,aAAa;AAE1B,SAAO,EACL,UAFU,wCAAmB,MAAM,QAAW,OAAO,EAExC,KAAK,OAAO;GAAE,MAAM;GAAQ,MAAM;GAAG,EAAE,EACrD;GAEJ"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname as dirname$1, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
1
4
|
import { isESModule } from "@intlayer/config";
|
|
2
5
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
const packageJson = JSON.parse(
|
|
8
|
-
readFileSync(resolve(dirname, "../../../package.json"), "utf8")
|
|
9
|
-
);
|
|
6
|
+
|
|
7
|
+
//#region src/client/client.ts
|
|
8
|
+
const dirname = isESModule ? dirname$1(fileURLToPath(import.meta.url)) : __dirname;
|
|
9
|
+
const packageJson = JSON.parse(readFileSync(resolve(dirname, "../../../package.json"), "utf8"));
|
|
10
10
|
const loadClient = () => new Client({
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
name: `mcp-client-for-intlayer-mcp-server`,
|
|
12
|
+
version: packageJson.version
|
|
13
13
|
});
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
};
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
export { dirname, loadClient };
|
|
18
17
|
//# sourceMappingURL=client.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/client/client.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"client.mjs","names":["dirname: string","pathDirname","packageJson: Record<string, any>","loadClient: LoadClient"],"sources":["../../../src/client/client.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname as pathDirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { isESModule } from '@intlayer/config';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\n\nexport const dirname: string = isESModule\n ? pathDirname(fileURLToPath(import.meta.url))\n : __dirname;\n\nconst packageJson: Record<string, any> = JSON.parse(\n readFileSync(resolve(dirname, '../../../package.json'), 'utf8')\n);\n\ntype LoadClient = () => Client;\n\nexport const loadClient: LoadClient = () =>\n new Client({\n name: `mcp-client-for-intlayer-mcp-server`,\n version: packageJson.version,\n });\n"],"mappings":";;;;;;;AAMA,MAAaA,UAAkB,aAC3BC,UAAY,cAAc,OAAO,KAAK,IAAI,CAAC,GAC3C;AAEJ,MAAMC,cAAmC,KAAK,MAC5C,aAAa,QAAQ,SAAS,wBAAwB,EAAE,OAAO,CAChE;AAID,MAAaC,mBACX,IAAI,OAAO;CACT,MAAM;CACN,SAAS,YAAY;CACtB,CAAC"}
|
package/dist/esm/client/sse.mjs
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
2
|
-
import { URL } from "url";
|
|
3
1
|
import { loadClient } from "./client.mjs";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
2
|
+
import { URL } from "node:url";
|
|
3
|
+
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
4
|
+
|
|
5
|
+
//#region src/client/sse.ts
|
|
6
|
+
var SSEClient = class {
|
|
7
|
+
client;
|
|
8
|
+
transport = null;
|
|
9
|
+
isCompleted = false;
|
|
10
|
+
constructor() {
|
|
11
|
+
this.client = loadClient();
|
|
12
|
+
}
|
|
13
|
+
async connectToServer() {
|
|
14
|
+
const mcpServerURL = process.env.MCP_SERVER_URL ?? "https://mcp.intlayer.org";
|
|
15
|
+
const url = new URL(mcpServerURL);
|
|
16
|
+
try {
|
|
17
|
+
console.info(`Connecting to server - ${mcpServerURL}`);
|
|
18
|
+
this.transport = new SSEClientTransport(url);
|
|
19
|
+
await this.client.connect(this.transport);
|
|
20
|
+
console.info("Connected to MCP server");
|
|
21
|
+
this.setUpTransport();
|
|
22
|
+
} catch (e) {
|
|
23
|
+
console.info("Failed to connect to MCP server: ", e);
|
|
24
|
+
throw e;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
setUpTransport() {
|
|
28
|
+
if (this.transport === null) return;
|
|
29
|
+
this.transport.onclose = () => {
|
|
30
|
+
console.info("SSE transport closed.");
|
|
31
|
+
this.isCompleted = true;
|
|
32
|
+
};
|
|
33
|
+
this.transport.onerror = async (error) => {
|
|
34
|
+
console.info("SSE transport error: ", error);
|
|
35
|
+
await this.cleanup();
|
|
36
|
+
};
|
|
37
|
+
this.transport.onmessage = (message) => {
|
|
38
|
+
console.info("message received: ", message);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async waitForCompletion() {
|
|
42
|
+
while (!this.isCompleted) await new Promise((resolve) => setTimeout(resolve, 100));
|
|
43
|
+
}
|
|
44
|
+
async cleanup() {
|
|
45
|
+
await this.client.close();
|
|
46
|
+
}
|
|
47
|
+
};
|
|
50
48
|
const main = async () => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
49
|
+
const client = new SSEClient();
|
|
50
|
+
try {
|
|
51
|
+
await client.connectToServer();
|
|
52
|
+
await client.waitForCompletion();
|
|
53
|
+
} finally {
|
|
54
|
+
await client.cleanup();
|
|
55
|
+
}
|
|
58
56
|
};
|
|
59
57
|
main();
|
|
58
|
+
|
|
59
|
+
//#endregion
|
|
60
60
|
//# sourceMappingURL=sse.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/client/sse.ts"],"sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport {
|
|
1
|
+
{"version":3,"file":"sse.mjs","names":[],"sources":["../../../src/client/sse.ts"],"sourcesContent":["import { URL } from 'node:url';\nimport type { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { loadClient } from './client';\n\nclass SSEClient {\n private client: Client;\n private transport: Transport | null = null;\n private isCompleted = false;\n\n constructor() {\n this.client = loadClient();\n }\n\n async connectToServer() {\n const mcpServerURL =\n process.env.MCP_SERVER_URL ?? 'https://mcp.intlayer.org';\n\n const url = new URL(mcpServerURL);\n try {\n console.info(`Connecting to server - ${mcpServerURL}`);\n this.transport = new SSEClientTransport(url);\n await this.client.connect(this.transport);\n console.info('Connected to MCP server');\n\n this.setUpTransport();\n } catch (e) {\n console.info('Failed to connect to MCP server: ', e);\n throw e;\n }\n }\n\n private setUpTransport() {\n if (this.transport === null) {\n return;\n }\n this.transport.onclose = () => {\n console.info('SSE transport closed.');\n this.isCompleted = true;\n };\n\n this.transport.onerror = async (error) => {\n console.info('SSE transport error: ', error);\n await this.cleanup();\n };\n\n this.transport.onmessage = (message) => {\n console.info('message received: ', message);\n };\n }\n\n async waitForCompletion() {\n while (!this.isCompleted) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n\n async cleanup() {\n await this.client.close();\n }\n}\n\nconst main = async () => {\n const client = new SSEClient();\n\n try {\n await client.connectToServer();\n await client.waitForCompletion();\n } finally {\n await client.cleanup();\n }\n};\n\nmain();\n"],"mappings":";;;;;AAMA,IAAM,YAAN,MAAgB;CACd,AAAQ;CACR,AAAQ,YAA8B;CACtC,AAAQ,cAAc;CAEtB,cAAc;AACZ,OAAK,SAAS,YAAY;;CAG5B,MAAM,kBAAkB;EACtB,MAAM,eACJ,QAAQ,IAAI,kBAAkB;EAEhC,MAAM,MAAM,IAAI,IAAI,aAAa;AACjC,MAAI;AACF,WAAQ,KAAK,0BAA0B,eAAe;AACtD,QAAK,YAAY,IAAI,mBAAmB,IAAI;AAC5C,SAAM,KAAK,OAAO,QAAQ,KAAK,UAAU;AACzC,WAAQ,KAAK,0BAA0B;AAEvC,QAAK,gBAAgB;WACd,GAAG;AACV,WAAQ,KAAK,qCAAqC,EAAE;AACpD,SAAM;;;CAIV,AAAQ,iBAAiB;AACvB,MAAI,KAAK,cAAc,KACrB;AAEF,OAAK,UAAU,gBAAgB;AAC7B,WAAQ,KAAK,wBAAwB;AACrC,QAAK,cAAc;;AAGrB,OAAK,UAAU,UAAU,OAAO,UAAU;AACxC,WAAQ,KAAK,yBAAyB,MAAM;AAC5C,SAAM,KAAK,SAAS;;AAGtB,OAAK,UAAU,aAAa,YAAY;AACtC,WAAQ,KAAK,sBAAsB,QAAQ;;;CAI/C,MAAM,oBAAoB;AACxB,SAAO,CAAC,KAAK,YACX,OAAM,IAAI,SAAS,YAAY,WAAW,SAAS,IAAI,CAAC;;CAI5D,MAAM,UAAU;AACd,QAAM,KAAK,OAAO,OAAO;;;AAI7B,MAAM,OAAO,YAAY;CACvB,MAAM,SAAS,IAAI,WAAW;AAE9B,KAAI;AACF,QAAM,OAAO,iBAAiB;AAC9B,QAAM,OAAO,mBAAmB;WACxB;AACR,QAAM,OAAO,SAAS;;;AAI1B,MAAM"}
|
|
@@ -1,30 +1,25 @@
|
|
|
1
|
-
import { isESModule } from "@intlayer/config";
|
|
2
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
-
import { readFileSync } from "fs";
|
|
4
|
-
import { dirname as pathDirname, resolve } from "path";
|
|
5
|
-
import { fileURLToPath } from "url";
|
|
6
1
|
import { loadCLITools } from "../tools/cli.mjs";
|
|
7
2
|
import { loadDocsTools } from "../tools/docs.mjs";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { dirname as dirname$1, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { isESModule } from "@intlayer/config";
|
|
7
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
+
|
|
9
|
+
//#region src/server/server.ts
|
|
10
|
+
const dirname = isESModule ? dirname$1(fileURLToPath(import.meta.url)) : __dirname;
|
|
11
|
+
const packageJson = JSON.parse(readFileSync(resolve(dirname, "../../../package.json"), "utf8"));
|
|
12
12
|
const loadServer = (isLocal) => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
loadCLITools(server);
|
|
22
|
-
}
|
|
23
|
-
loadDocsTools(server);
|
|
24
|
-
return server;
|
|
25
|
-
};
|
|
26
|
-
export {
|
|
27
|
-
dirname,
|
|
28
|
-
loadServer
|
|
13
|
+
const server = new McpServer({
|
|
14
|
+
name: "intlayer",
|
|
15
|
+
version: packageJson.version,
|
|
16
|
+
capabilities: { resources: {} }
|
|
17
|
+
});
|
|
18
|
+
if (!isLocal) loadCLITools(server);
|
|
19
|
+
loadDocsTools(server);
|
|
20
|
+
return server;
|
|
29
21
|
};
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
export { dirname, loadServer };
|
|
30
25
|
//# sourceMappingURL=server.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/server.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"server.mjs","names":["dirname: string","pathDirname","packageJson: Record<string, any>","loadServer: LoadServer"],"sources":["../../../src/server/server.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname as pathDirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { isESModule } from '@intlayer/config';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { loadCLITools } from '../tools/cli';\nimport { loadDocsTools } from '../tools/docs';\n\nexport const dirname: string = isESModule\n ? pathDirname(fileURLToPath(import.meta.url))\n : __dirname;\n\nconst packageJson: Record<string, any> = JSON.parse(\n readFileSync(resolve(dirname, '../../../package.json'), 'utf8')\n);\n\ntype LoadServer = (isLocal: boolean) => McpServer;\n\nexport const loadServer: LoadServer = (isLocal) => {\n const server = new McpServer({\n name: 'intlayer',\n version: packageJson.version,\n capabilities: {\n resources: {},\n },\n });\n\n if (!isLocal) {\n loadCLITools(server);\n }\n\n loadDocsTools(server);\n\n return server;\n};\n"],"mappings":";;;;;;;;;AAQA,MAAaA,UAAkB,aAC3BC,UAAY,cAAc,OAAO,KAAK,IAAI,CAAC,GAC3C;AAEJ,MAAMC,cAAmC,KAAK,MAC5C,aAAa,QAAQ,SAAS,wBAAwB,EAAE,OAAO,CAChE;AAID,MAAaC,cAA0B,YAAY;CACjD,MAAM,SAAS,IAAI,UAAU;EAC3B,MAAM;EACN,SAAS,YAAY;EACrB,cAAc,EACZ,WAAW,EAAE,EACd;EACF,CAAC;AAEF,KAAI,CAAC,QACH,cAAa,OAAO;AAGtB,eAAc,OAAO;AAErB,QAAO"}
|
package/dist/esm/server/sse.mjs
CHANGED
|
@@ -1,100 +1,107 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { loadServer } from "./server.mjs";
|
|
2
3
|
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
|
|
3
4
|
import dotenv from "dotenv";
|
|
4
5
|
import express from "express";
|
|
5
|
-
|
|
6
|
+
|
|
7
|
+
//#region src/server/sse.ts
|
|
8
|
+
/******* Server Set Up *******/
|
|
6
9
|
const server = loadServer(false);
|
|
10
|
+
/******* Express App Set Up *******/
|
|
7
11
|
const app = express();
|
|
8
12
|
const env = app.get("env");
|
|
9
|
-
dotenv.config({
|
|
10
|
-
|
|
11
|
-
}
|
|
13
|
+
dotenv.config({ path: [
|
|
14
|
+
`.env.${env}.local`,
|
|
15
|
+
`.env.${env}`,
|
|
16
|
+
".env.local",
|
|
17
|
+
".env"
|
|
18
|
+
] });
|
|
12
19
|
app.use((req, res, next) => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
res.header("Access-Control-Allow-Origin", "*");
|
|
21
|
+
res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
22
|
+
res.header("Access-Control-Allow-Headers", "Content-Type");
|
|
23
|
+
if (req.method === "OPTIONS") {
|
|
24
|
+
res.sendStatus(200);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
next();
|
|
21
28
|
});
|
|
22
29
|
app.use(express.json());
|
|
23
30
|
const router = express.Router();
|
|
24
31
|
const transports = {};
|
|
25
32
|
const POST_ENDPOINT = "/messages";
|
|
26
33
|
router.post(POST_ENDPOINT, async (req, res) => {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return;
|
|
34
|
+
console.info("message request received: ", req.body);
|
|
35
|
+
const sessionId = req.query.sessionId;
|
|
36
|
+
if (typeof sessionId !== "string") {
|
|
37
|
+
res.status(400).send({ messages: "Bad session id." });
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const transport = transports[sessionId];
|
|
41
|
+
if (!transport) {
|
|
42
|
+
res.status(400).send({ messages: "No transport found for sessionId." });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
await transport.handlePostMessage(req, res, req.body);
|
|
40
46
|
});
|
|
41
47
|
router.get("/", async (_req, res) => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return;
|
|
48
|
+
console.info("connection request received");
|
|
49
|
+
const transport = new SSEServerTransport(POST_ENDPOINT, res);
|
|
50
|
+
console.info("new transport created with session id: ", transport.sessionId);
|
|
51
|
+
transports[transport.sessionId] = transport;
|
|
52
|
+
console.info(`${Object.keys(transports).length} sessions active`);
|
|
53
|
+
res.on("close", () => {
|
|
54
|
+
console.info("SSE connection closed");
|
|
55
|
+
delete transports[transport.sessionId];
|
|
56
|
+
});
|
|
57
|
+
await server.connect(transport);
|
|
58
|
+
await sendMessages(transport);
|
|
54
59
|
});
|
|
55
60
|
const sendMessages = async (transport) => {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
61
|
+
try {
|
|
62
|
+
await transport.send({
|
|
63
|
+
jsonrpc: "2.0",
|
|
64
|
+
method: "sse/connection",
|
|
65
|
+
params: { message: "Stream started" }
|
|
66
|
+
});
|
|
67
|
+
console.info("Stream started");
|
|
68
|
+
let messageCount = 0;
|
|
69
|
+
const interval = setInterval(async () => {
|
|
70
|
+
messageCount++;
|
|
71
|
+
const message = `Message ${messageCount} at ${(/* @__PURE__ */ new Date()).toISOString()}`;
|
|
72
|
+
try {
|
|
73
|
+
await transport.send({
|
|
74
|
+
jsonrpc: "2.0",
|
|
75
|
+
method: "sse/message",
|
|
76
|
+
params: { data: message }
|
|
77
|
+
});
|
|
78
|
+
console.info(`Sent: ${message}`);
|
|
79
|
+
if (messageCount === 2) {
|
|
80
|
+
clearInterval(interval);
|
|
81
|
+
await transport.send({
|
|
82
|
+
jsonrpc: "2.0",
|
|
83
|
+
method: "sse/complete",
|
|
84
|
+
params: { message: "Stream completed" }
|
|
85
|
+
});
|
|
86
|
+
console.info("Stream completed");
|
|
87
|
+
}
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.error("Error sending message:", error);
|
|
90
|
+
clearInterval(interval);
|
|
91
|
+
}
|
|
92
|
+
}, 1e3);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error("Error in startSending:", error);
|
|
95
|
+
}
|
|
91
96
|
};
|
|
92
97
|
app.use("/", router);
|
|
93
98
|
app.use("/health", (_req, res) => {
|
|
94
|
-
|
|
99
|
+
res.send("OK");
|
|
95
100
|
});
|
|
96
101
|
const PORT = process.env.PORT ?? 3e3;
|
|
97
102
|
app.listen(PORT, () => {
|
|
98
|
-
|
|
103
|
+
console.info(`MCP Streamable HTTP Server listening on port ${PORT}`);
|
|
99
104
|
});
|
|
105
|
+
|
|
106
|
+
//#endregion
|
|
100
107
|
//# sourceMappingURL=sse.mjs.map
|