@rag-forge/mcp 0.1.0

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.
@@ -0,0 +1,150 @@
1
+ // src/index.ts
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+
4
+ // src/tools/rag-query.ts
5
+ import { z } from "zod";
6
+ import { runPythonModule } from "@rag-forge/shared";
7
+ var ragQuerySchema = z.object({
8
+ query: z.string().describe("The question to ask the RAG pipeline"),
9
+ top_k: z.number().int().min(1).max(100).default(5).describe("Number of chunks to retrieve"),
10
+ agent_mode: z.boolean().default(false).describe("Enable multi-agent query decomposition for complex queries")
11
+ });
12
+ async function handleRagQuery(input) {
13
+ const result = await runPythonModule({
14
+ module: "rag_forge_core.cli",
15
+ args: [
16
+ "query",
17
+ "--question",
18
+ input.query,
19
+ "--top-k",
20
+ String(input.top_k),
21
+ "--embedding",
22
+ "mock",
23
+ "--generator",
24
+ "mock",
25
+ "--strategy",
26
+ "dense"
27
+ ]
28
+ });
29
+ if (result.exitCode !== 0) {
30
+ return result.stdout || JSON.stringify({
31
+ status: "error",
32
+ message: result.stderr || "Query failed"
33
+ });
34
+ }
35
+ return result.stdout;
36
+ }
37
+
38
+ // src/tools/rag-audit.ts
39
+ import { z as z2 } from "zod";
40
+ import { runPythonModule as runPythonModule2 } from "@rag-forge/shared";
41
+ var ragAuditSchema = z2.object({
42
+ golden_set_path: z2.string().optional().describe("Path to golden set JSON file"),
43
+ metrics: z2.array(z2.string()).optional().describe("Specific metrics to evaluate (default: all)")
44
+ });
45
+ async function handleRagAudit(input) {
46
+ const args = ["audit", "--judge", "mock"];
47
+ if (input.golden_set_path) {
48
+ args.push("--golden-set", input.golden_set_path);
49
+ }
50
+ const result = await runPythonModule2({
51
+ module: "rag_forge_evaluator.cli",
52
+ args
53
+ });
54
+ if (result.exitCode !== 0) {
55
+ return result.stdout || JSON.stringify({
56
+ status: "error",
57
+ message: result.stderr || "Audit failed"
58
+ });
59
+ }
60
+ return result.stdout;
61
+ }
62
+
63
+ // src/tools/rag-status.ts
64
+ import { runPythonModule as runPythonModule3 } from "@rag-forge/shared";
65
+ async function handleRagStatus() {
66
+ const result = await runPythonModule3({
67
+ module: "rag_forge_core.cli",
68
+ args: ["status"]
69
+ });
70
+ if (result.exitCode !== 0) {
71
+ return result.stdout || JSON.stringify({
72
+ status: "error",
73
+ message: result.stderr || "Failed to get pipeline status"
74
+ });
75
+ }
76
+ return result.stdout;
77
+ }
78
+
79
+ // src/tools/rag-ingest.ts
80
+ import { z as z3 } from "zod";
81
+ import { runPythonModule as runPythonModule4 } from "@rag-forge/shared";
82
+ var ragIngestSchema = z3.object({
83
+ source_path: z3.string().describe("Path to source directory of documents to index"),
84
+ collection: z3.string().default("rag-forge").describe("Collection name"),
85
+ embedding: z3.string().default("mock").describe("Embedding provider: openai | local | mock"),
86
+ enrich: z3.boolean().default(false).describe("Enable contextual enrichment"),
87
+ sparse_index_path: z3.string().optional().describe("Path to persist BM25 sparse index")
88
+ });
89
+ async function handleRagIngest(input) {
90
+ const args = ["index", "--source", input.source_path, "--collection", input.collection, "--embedding", input.embedding];
91
+ if (input.enrich) args.push("--enrich");
92
+ if (input.sparse_index_path) args.push("--sparse-index-path", input.sparse_index_path);
93
+ const result = await runPythonModule4({ module: "rag_forge_core.cli", args });
94
+ if (result.exitCode !== 0) {
95
+ return result.stdout || JSON.stringify({ status: "error", message: result.stderr || "Indexing failed" });
96
+ }
97
+ return result.stdout;
98
+ }
99
+
100
+ // src/tools/rag-inspect.ts
101
+ import { z as z4 } from "zod";
102
+ import { runPythonModule as runPythonModule5 } from "@rag-forge/shared";
103
+ var ragInspectSchema = z4.object({
104
+ chunk_id: z4.string().describe("The ID of the chunk to inspect"),
105
+ collection: z4.string().default("rag-forge").describe("Collection name")
106
+ });
107
+ async function handleRagInspect(input) {
108
+ const result = await runPythonModule5({
109
+ module: "rag_forge_core.cli",
110
+ args: ["inspect", "--chunk-id", input.chunk_id, "--collection", input.collection]
111
+ });
112
+ if (result.exitCode !== 0) {
113
+ return result.stdout || JSON.stringify({ status: "error", message: result.stderr || "Inspect failed" });
114
+ }
115
+ return result.stdout;
116
+ }
117
+
118
+ // src/index.ts
119
+ function createServer() {
120
+ const server = new McpServer({
121
+ name: "rag-forge",
122
+ version: "0.1.0"
123
+ });
124
+ server.tool("rag_query", "Execute a RAG query against the indexed pipeline", ragQuerySchema.shape, async (input) => {
125
+ const result = await handleRagQuery(ragQuerySchema.parse(input));
126
+ return { content: [{ type: "text", text: result }] };
127
+ });
128
+ server.tool("rag_audit", "Run evaluation suite and return results", ragAuditSchema.shape, async (input) => {
129
+ const result = await handleRagAudit(ragAuditSchema.parse(input));
130
+ return { content: [{ type: "text", text: result }] };
131
+ });
132
+ server.tool("rag_status", "Return pipeline health metrics and cache stats", {}, async () => {
133
+ const result = await handleRagStatus();
134
+ return { content: [{ type: "text", text: result }] };
135
+ });
136
+ server.tool("rag_ingest", "Index new documents into the pipeline", ragIngestSchema.shape, async (input) => {
137
+ const result = await handleRagIngest(ragIngestSchema.parse(input));
138
+ return { content: [{ type: "text", text: result }] };
139
+ });
140
+ server.tool("rag_inspect", "Debug a specific chunk by ID", ragInspectSchema.shape, async (input) => {
141
+ const result = await handleRagInspect(ragInspectSchema.parse(input));
142
+ return { content: [{ type: "text", text: result }] };
143
+ });
144
+ return server;
145
+ }
146
+
147
+ export {
148
+ createServer
149
+ };
150
+ //# sourceMappingURL=chunk-2GW5YY2B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/tools/rag-query.ts","../src/tools/rag-audit.ts","../src/tools/rag-status.ts","../src/tools/rag-ingest.ts","../src/tools/rag-inspect.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ragQuerySchema, handleRagQuery } from \"./tools/rag-query.js\";\nimport { ragAuditSchema, handleRagAudit } from \"./tools/rag-audit.js\";\nimport { handleRagStatus } from \"./tools/rag-status.js\";\nimport { ragIngestSchema, handleRagIngest } from \"./tools/rag-ingest.js\";\nimport { ragInspectSchema, handleRagInspect } from \"./tools/rag-inspect.js\";\n\nexport function createServer(): McpServer {\n const server = new McpServer({\n name: \"rag-forge\",\n version: \"0.1.0\",\n });\n\n server.tool(\"rag_query\", \"Execute a RAG query against the indexed pipeline\", ragQuerySchema.shape, async (input) => {\n const result = await handleRagQuery(ragQuerySchema.parse(input));\n return { content: [{ type: \"text\" as const, text: result }] };\n });\n\n server.tool(\"rag_audit\", \"Run evaluation suite and return results\", ragAuditSchema.shape, async (input) => {\n const result = await handleRagAudit(ragAuditSchema.parse(input));\n return { content: [{ type: \"text\" as const, text: result }] };\n });\n\n server.tool(\"rag_status\", \"Return pipeline health metrics and cache stats\", {}, async () => {\n const result = await handleRagStatus();\n return { content: [{ type: \"text\" as const, text: result }] };\n });\n\n server.tool(\"rag_ingest\", \"Index new documents into the pipeline\", ragIngestSchema.shape, async (input) => {\n const result = await handleRagIngest(ragIngestSchema.parse(input));\n return { content: [{ type: \"text\" as const, text: result }] };\n });\n\n server.tool(\"rag_inspect\", \"Debug a specific chunk by ID\", ragInspectSchema.shape, async (input) => {\n const result = await handleRagInspect(ragInspectSchema.parse(input));\n return { content: [{ type: \"text\" as const, text: result }] };\n });\n\n return server;\n}\n","import { z } from \"zod\";\nimport { runPythonModule } from \"@rag-forge/shared\";\n\nexport const ragQuerySchema = z.object({\n query: z.string().describe(\"The question to ask the RAG pipeline\"),\n top_k: z.number().int().min(1).max(100).default(5).describe(\"Number of chunks to retrieve\"),\n agent_mode: z\n .boolean()\n .default(false)\n .describe(\"Enable multi-agent query decomposition for complex queries\"),\n});\n\nexport type RagQueryInput = z.infer<typeof ragQuerySchema>;\n\nexport async function handleRagQuery(input: RagQueryInput): Promise<string> {\n const result = await runPythonModule({\n module: \"rag_forge_core.cli\",\n args: [\n \"query\",\n \"--question\", input.query,\n \"--top-k\", String(input.top_k),\n \"--embedding\", \"mock\",\n \"--generator\", \"mock\",\n \"--strategy\", \"dense\",\n ],\n });\n\n if (result.exitCode !== 0) {\n return result.stdout || JSON.stringify({\n status: \"error\",\n message: result.stderr || \"Query failed\",\n });\n }\n\n return result.stdout;\n}\n","import { z } from \"zod\";\nimport { runPythonModule } from \"@rag-forge/shared\";\n\nexport const ragAuditSchema = z.object({\n golden_set_path: z.string().optional().describe(\"Path to golden set JSON file\"),\n metrics: z\n .array(z.string())\n .optional()\n .describe(\"Specific metrics to evaluate (default: all)\"),\n});\n\nexport type RagAuditInput = z.infer<typeof ragAuditSchema>;\n\nexport async function handleRagAudit(input: RagAuditInput): Promise<string> {\n const args = [\"audit\", \"--judge\", \"mock\"];\n\n if (input.golden_set_path) {\n args.push(\"--golden-set\", input.golden_set_path);\n }\n\n const result = await runPythonModule({\n module: \"rag_forge_evaluator.cli\",\n args,\n });\n\n if (result.exitCode !== 0) {\n return result.stdout || JSON.stringify({\n status: \"error\",\n message: result.stderr || \"Audit failed\",\n });\n }\n\n return result.stdout;\n}\n","import { runPythonModule } from \"@rag-forge/shared\";\n\nexport async function handleRagStatus(): Promise<string> {\n const result = await runPythonModule({\n module: \"rag_forge_core.cli\",\n args: [\"status\"],\n });\n\n if (result.exitCode !== 0) {\n return result.stdout || JSON.stringify({\n status: \"error\",\n message: result.stderr || \"Failed to get pipeline status\",\n });\n }\n\n return result.stdout;\n}\n","import { z } from \"zod\";\nimport { runPythonModule } from \"@rag-forge/shared\";\n\nexport const ragIngestSchema = z.object({\n source_path: z.string().describe(\"Path to source directory of documents to index\"),\n collection: z.string().default(\"rag-forge\").describe(\"Collection name\"),\n embedding: z.string().default(\"mock\").describe(\"Embedding provider: openai | local | mock\"),\n enrich: z.boolean().default(false).describe(\"Enable contextual enrichment\"),\n sparse_index_path: z.string().optional().describe(\"Path to persist BM25 sparse index\"),\n});\n\nexport type RagIngestInput = z.infer<typeof ragIngestSchema>;\n\nexport async function handleRagIngest(input: RagIngestInput): Promise<string> {\n const args = [\"index\", \"--source\", input.source_path, \"--collection\", input.collection, \"--embedding\", input.embedding];\n if (input.enrich) args.push(\"--enrich\");\n if (input.sparse_index_path) args.push(\"--sparse-index-path\", input.sparse_index_path);\n\n const result = await runPythonModule({ module: \"rag_forge_core.cli\", args });\n if (result.exitCode !== 0) {\n return result.stdout || JSON.stringify({ status: \"error\", message: result.stderr || \"Indexing failed\" });\n }\n return result.stdout;\n}\n","import { z } from \"zod\";\nimport { runPythonModule } from \"@rag-forge/shared\";\n\nexport const ragInspectSchema = z.object({\n chunk_id: z.string().describe(\"The ID of the chunk to inspect\"),\n collection: z.string().default(\"rag-forge\").describe(\"Collection name\"),\n});\n\nexport type RagInspectInput = z.infer<typeof ragInspectSchema>;\n\nexport async function handleRagInspect(input: RagInspectInput): Promise<string> {\n const result = await runPythonModule({\n module: \"rag_forge_core.cli\",\n args: [\"inspect\", \"--chunk-id\", input.chunk_id, \"--collection\", input.collection],\n });\n if (result.exitCode !== 0) {\n return result.stdout || JSON.stringify({ status: \"error\", message: result.stderr || \"Inspect failed\" });\n }\n return result.stdout;\n}\n"],"mappings":"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","names":["z","runPythonModule","runPythonModule","z","runPythonModule","z","runPythonModule"]}
@@ -0,0 +1,56 @@
1
+ import {
2
+ createServer
3
+ } from "./chunk-2GW5YY2B.js";
4
+
5
+ // src/transports/http.ts
6
+ import { randomUUID } from "crypto";
7
+ import { createServer as createHttpServer } from "http";
8
+ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
9
+ async function startHttpServer(port) {
10
+ const sessions = /* @__PURE__ */ new Map();
11
+ const httpServer = createHttpServer(async (req, res) => {
12
+ try {
13
+ const url = new URL(req.url ?? "/", `http://localhost:${String(port)}`);
14
+ if (req.method === "GET" && url.pathname === "/sse") {
15
+ const sessionId = randomUUID();
16
+ const messagesPath = `/messages/${sessionId}`;
17
+ const transport = new SSEServerTransport(messagesPath, res);
18
+ sessions.set(sessionId, transport);
19
+ res.on("close", () => {
20
+ sessions.delete(sessionId);
21
+ });
22
+ const mcpServer = createServer();
23
+ await mcpServer.connect(transport);
24
+ } else if (req.method === "POST" && url.pathname.startsWith("/messages/")) {
25
+ const sessionId = url.pathname.replace("/messages/", "");
26
+ const transport = sessions.get(sessionId);
27
+ if (!transport) {
28
+ res.writeHead(400, { "Content-Type": "application/json" });
29
+ res.end(JSON.stringify({ error: "Unknown session" }));
30
+ return;
31
+ }
32
+ await transport.handlePostMessage(req, res);
33
+ } else if (req.method === "GET" && url.pathname === "/health") {
34
+ res.writeHead(200, { "Content-Type": "application/json" });
35
+ res.end(JSON.stringify({ status: "ok", sessions: sessions.size }));
36
+ } else {
37
+ res.writeHead(404);
38
+ res.end("Not found");
39
+ }
40
+ } catch {
41
+ if (!res.headersSent) {
42
+ res.writeHead(500, { "Content-Type": "application/json" });
43
+ res.end(JSON.stringify({ error: "Internal server error" }));
44
+ }
45
+ }
46
+ });
47
+ httpServer.listen(port, () => {
48
+ console.error(`RAG-Forge MCP server listening on http://localhost:${String(port)}/sse`);
49
+ });
50
+ await new Promise(() => {
51
+ });
52
+ }
53
+ export {
54
+ startHttpServer
55
+ };
56
+ //# sourceMappingURL=http-VSL4UBJS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transports/http.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { createServer as createHttpServer } from \"node:http\";\nimport { SSEServerTransport } from \"@modelcontextprotocol/sdk/server/sse.js\";\nimport { createServer } from \"../index.js\";\n\nexport async function startHttpServer(port: number): Promise<void> {\n const sessions = new Map<string, SSEServerTransport>();\n\n const httpServer = createHttpServer(async (req, res) => {\n try {\n const url = new URL(req.url ?? \"/\", `http://localhost:${String(port)}`);\n\n if (req.method === \"GET\" && url.pathname === \"/sse\") {\n const sessionId = randomUUID();\n const messagesPath = `/messages/${sessionId}`;\n const transport = new SSEServerTransport(messagesPath, res);\n sessions.set(sessionId, transport);\n\n // Clean up when the SSE connection closes\n res.on(\"close\", () => {\n sessions.delete(sessionId);\n });\n\n // Each connection gets its own MCP server instance\n const mcpServer = createServer();\n await mcpServer.connect(transport);\n } else if (req.method === \"POST\" && url.pathname.startsWith(\"/messages/\")) {\n const sessionId = url.pathname.replace(\"/messages/\", \"\");\n const transport = sessions.get(sessionId);\n if (!transport) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Unknown session\" }));\n return;\n }\n await transport.handlePostMessage(req, res);\n } else if (req.method === \"GET\" && url.pathname === \"/health\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ status: \"ok\", sessions: sessions.size }));\n } else {\n res.writeHead(404);\n res.end(\"Not found\");\n }\n } catch {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Internal server error\" }));\n }\n }\n });\n\n httpServer.listen(port, () => {\n console.error(`RAG-Forge MCP server listening on http://localhost:${String(port)}/sse`);\n });\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function -- intentional: keep the process alive indefinitely\n await new Promise<never>(() => {});\n}\n"],"mappings":";;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB,wBAAwB;AACjD,SAAS,0BAA0B;AAGnC,eAAsB,gBAAgB,MAA6B;AACjE,QAAM,WAAW,oBAAI,IAAgC;AAErD,QAAM,aAAa,iBAAiB,OAAO,KAAK,QAAQ;AACtD,QAAI;AACF,YAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,oBAAoB,OAAO,IAAI,CAAC,EAAE;AAEtE,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,QAAQ;AACnD,cAAM,YAAY,WAAW;AAC7B,cAAM,eAAe,aAAa,SAAS;AAC3C,cAAM,YAAY,IAAI,mBAAmB,cAAc,GAAG;AAC1D,iBAAS,IAAI,WAAW,SAAS;AAGjC,YAAI,GAAG,SAAS,MAAM;AACpB,mBAAS,OAAO,SAAS;AAAA,QAC3B,CAAC;AAGD,cAAM,YAAY,aAAa;AAC/B,cAAM,UAAU,QAAQ,SAAS;AAAA,MACnC,WAAW,IAAI,WAAW,UAAU,IAAI,SAAS,WAAW,YAAY,GAAG;AACzE,cAAM,YAAY,IAAI,SAAS,QAAQ,cAAc,EAAE;AACvD,cAAM,YAAY,SAAS,IAAI,SAAS;AACxC,YAAI,CAAC,WAAW;AACd,cAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,cAAI,IAAI,KAAK,UAAU,EAAE,OAAO,kBAAkB,CAAC,CAAC;AACpD;AAAA,QACF;AACA,cAAM,UAAU,kBAAkB,KAAK,GAAG;AAAA,MAC5C,WAAW,IAAI,WAAW,SAAS,IAAI,aAAa,WAAW;AAC7D,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,EAAE,QAAQ,MAAM,UAAU,SAAS,KAAK,CAAC,CAAC;AAAA,MACnE,OAAO;AACL,YAAI,UAAU,GAAG;AACjB,YAAI,IAAI,WAAW;AAAA,MACrB;AAAA,IACF,QAAQ;AACN,UAAI,CAAC,IAAI,aAAa;AACpB,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,EAAE,OAAO,wBAAwB,CAAC,CAAC;AAAA,MAC5D;AAAA,IACF;AAAA,EACF,CAAC;AAED,aAAW,OAAO,MAAM,MAAM;AAC5B,YAAQ,MAAM,sDAAsD,OAAO,IAAI,CAAC,MAAM;AAAA,EACxF,CAAC;AAGD,QAAM,IAAI,QAAe,MAAM;AAAA,EAAC,CAAC;AACnC;","names":[]}
@@ -0,0 +1,5 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+
3
+ declare function createServer(): McpServer;
4
+
5
+ export { createServer };
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ import {
2
+ createServer
3
+ } from "./chunk-2GW5YY2B.js";
4
+ export {
5
+ createServer
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/main.d.ts ADDED
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/main.js ADDED
@@ -0,0 +1,36 @@
1
+ import {
2
+ createServer
3
+ } from "./chunk-2GW5YY2B.js";
4
+
5
+ // src/server.ts
6
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ async function startServer() {
8
+ const server = createServer();
9
+ const transport2 = new StdioServerTransport();
10
+ await server.connect(transport2);
11
+ }
12
+
13
+ // src/main.ts
14
+ var args = process.argv.slice(2);
15
+ var transportIdx = args.indexOf("--transport");
16
+ var transport = transportIdx >= 0 && args[transportIdx + 1] ? args[transportIdx + 1] : "stdio";
17
+ var portIdx = args.indexOf("--port");
18
+ var portArg = portIdx >= 0 ? args[portIdx + 1] : void 0;
19
+ var port = portArg !== void 0 ? parseInt(portArg, 10) : 3100;
20
+ if (transport === "http" && (Number.isNaN(port) || port < 1 || port > 65535)) {
21
+ console.error(`Invalid port: ${String(portArg ?? port)}. Must be 1-65535.`);
22
+ process.exit(1);
23
+ }
24
+ async function main() {
25
+ if (transport === "http") {
26
+ const { startHttpServer } = await import("./http-VSL4UBJS.js");
27
+ await startHttpServer(port);
28
+ } else {
29
+ await startServer();
30
+ }
31
+ }
32
+ main().catch((error) => {
33
+ console.error("MCP server failed to start:", error);
34
+ process.exit(1);
35
+ });
36
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts","../src/main.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./index.js\";\n\nexport async function startServer(): Promise<void> {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import { startServer } from \"./server.js\";\n\nconst args = process.argv.slice(2);\nconst transportIdx = args.indexOf(\"--transport\");\nconst transport = transportIdx >= 0 && args[transportIdx + 1] ? args[transportIdx + 1] : \"stdio\";\nconst portIdx = args.indexOf(\"--port\");\nconst portArg = portIdx >= 0 ? args[portIdx + 1] : undefined;\nconst port = portArg !== undefined ? parseInt(portArg, 10) : 3100;\n\nif (transport === \"http\" && (Number.isNaN(port) || port < 1 || port > 65535)) {\n console.error(`Invalid port: ${String(portArg ?? port)}. Must be 1-65535.`);\n process.exit(1);\n}\n\nasync function main(): Promise<void> {\n if (transport === \"http\") {\n const { startHttpServer } = await import(\"./transports/http.js\");\n await startHttpServer(port);\n } else {\n await startServer();\n }\n}\n\nmain().catch((error: unknown) => {\n console.error(\"MCP server failed to start:\", error);\n process.exit(1);\n});\n"],"mappings":";;;;;AAAA,SAAS,4BAA4B;AAGrC,eAAsB,cAA6B;AACjD,QAAM,SAAS,aAAa;AAC5B,QAAMA,aAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQA,UAAS;AAChC;;;ACLA,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAM,eAAe,KAAK,QAAQ,aAAa;AAC/C,IAAM,YAAY,gBAAgB,KAAK,KAAK,eAAe,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI;AACzF,IAAM,UAAU,KAAK,QAAQ,QAAQ;AACrC,IAAM,UAAU,WAAW,IAAI,KAAK,UAAU,CAAC,IAAI;AACnD,IAAM,OAAO,YAAY,SAAY,SAAS,SAAS,EAAE,IAAI;AAE7D,IAAI,cAAc,WAAW,OAAO,MAAM,IAAI,KAAK,OAAO,KAAK,OAAO,QAAQ;AAC5E,UAAQ,MAAM,iBAAiB,OAAO,WAAW,IAAI,CAAC,oBAAoB;AAC1E,UAAQ,KAAK,CAAC;AAChB;AAEA,eAAe,OAAsB;AACnC,MAAI,cAAc,QAAQ;AACxB,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,oBAAsB;AAC/D,UAAM,gBAAgB,IAAI;AAAA,EAC5B,OAAO;AACL,UAAM,YAAY;AAAA,EACpB;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,UAAmB;AAC/B,UAAQ,MAAM,+BAA+B,KAAK;AAClD,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["transport"]}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@rag-forge/mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server exposing RAG-Forge pipeline operations as agent-callable tools",
5
+ "author": "Femi Adedayo",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/hallengray/rag-forge.git",
9
+ "directory": "packages/mcp"
10
+ },
11
+ "homepage": "https://github.com/hallengray/rag-forge#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/hallengray/rag-forge/issues"
14
+ },
15
+ "keywords": [
16
+ "rag",
17
+ "mcp",
18
+ "model-context-protocol",
19
+ "llm",
20
+ "anthropic",
21
+ "claude"
22
+ ],
23
+ "type": "module",
24
+ "exports": {
25
+ ".": {
26
+ "import": "./dist/index.js",
27
+ "types": "./dist/index.d.ts"
28
+ }
29
+ },
30
+ "files": ["dist"],
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "dev": "tsup --watch",
34
+ "lint": "eslint src/",
35
+ "lint:fix": "eslint src/ --fix",
36
+ "typecheck": "tsc --noEmit",
37
+ "test": "vitest run"
38
+ },
39
+ "dependencies": {
40
+ "@modelcontextprotocol/sdk": "^1.0.0",
41
+ "@rag-forge/shared": "workspace:*",
42
+ "zod": "^3.23.0"
43
+ },
44
+ "devDependencies": {
45
+ "@eslint/js": "^9.0.0",
46
+ "@types/node": "^22.0.0",
47
+ "eslint": "^9.0.0",
48
+ "tsup": "^8.0.0",
49
+ "typescript": "^5.5.0",
50
+ "typescript-eslint": "^8.0.0",
51
+ "vitest": "^2.0.0"
52
+ },
53
+ "engines": {
54
+ "node": ">=20.0.0"
55
+ },
56
+ "license": "MIT"
57
+ }