domain-rag-mcp-server 3.1.1 → 3.2.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.
- package/dist/index.mjs +84 -9
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
// src/index.ts
|
|
3
|
+
// ../domain-rag-system/mcp-server/src/index.ts
|
|
4
4
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
5
5
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
6
|
import {
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
import { QdrantClient } from "@qdrant/js-client-rest";
|
|
11
11
|
import { v4 as uuidv4 } from "uuid";
|
|
12
12
|
|
|
13
|
-
// ../shared/src/config.ts
|
|
13
|
+
// ../domain-rag-system/shared/src/config.ts
|
|
14
14
|
import { config as dotenvConfig } from "dotenv";
|
|
15
15
|
import { existsSync } from "fs";
|
|
16
16
|
import { join } from "path";
|
|
@@ -240,7 +240,7 @@ function getSourceWeightsMap() {
|
|
|
240
240
|
};
|
|
241
241
|
}
|
|
242
242
|
|
|
243
|
-
// ../shared/src/embeddings/types.ts
|
|
243
|
+
// ../domain-rag-system/shared/src/embeddings/types.ts
|
|
244
244
|
var BaseEmbeddingProvider = class {
|
|
245
245
|
/**
|
|
246
246
|
* Default batch implementation - calls getEmbedding sequentially
|
|
@@ -256,7 +256,7 @@ var BaseEmbeddingProvider = class {
|
|
|
256
256
|
}
|
|
257
257
|
};
|
|
258
258
|
|
|
259
|
-
// ../shared/src/embeddings/ollama.ts
|
|
259
|
+
// ../domain-rag-system/shared/src/embeddings/ollama.ts
|
|
260
260
|
var OllamaProvider = class extends BaseEmbeddingProvider {
|
|
261
261
|
name = "ollama";
|
|
262
262
|
dimensions;
|
|
@@ -320,7 +320,7 @@ var OllamaProvider = class extends BaseEmbeddingProvider {
|
|
|
320
320
|
}
|
|
321
321
|
};
|
|
322
322
|
|
|
323
|
-
// ../shared/src/embeddings/openai.ts
|
|
323
|
+
// ../domain-rag-system/shared/src/embeddings/openai.ts
|
|
324
324
|
var OpenAIProvider = class extends BaseEmbeddingProvider {
|
|
325
325
|
name = "openai";
|
|
326
326
|
dimensions;
|
|
@@ -405,7 +405,7 @@ var OpenAIProvider = class extends BaseEmbeddingProvider {
|
|
|
405
405
|
}
|
|
406
406
|
};
|
|
407
407
|
|
|
408
|
-
// ../shared/src/embeddings/factory.ts
|
|
408
|
+
// ../domain-rag-system/shared/src/embeddings/factory.ts
|
|
409
409
|
function createEmbeddingProvider() {
|
|
410
410
|
const providerType = config.embeddings.provider;
|
|
411
411
|
switch (providerType) {
|
|
@@ -436,7 +436,7 @@ function getEmbeddingProvider() {
|
|
|
436
436
|
return _provider;
|
|
437
437
|
}
|
|
438
438
|
|
|
439
|
-
// ../shared/src/postgres/client.ts
|
|
439
|
+
// ../domain-rag-system/shared/src/postgres/client.ts
|
|
440
440
|
import pg from "pg";
|
|
441
441
|
var { Pool } = pg;
|
|
442
442
|
var pool = null;
|
|
@@ -484,7 +484,7 @@ async function checkHealth() {
|
|
|
484
484
|
}
|
|
485
485
|
}
|
|
486
486
|
|
|
487
|
-
// ../shared/src/postgres/search.ts
|
|
487
|
+
// ../domain-rag-system/shared/src/postgres/search.ts
|
|
488
488
|
async function searchAll(searchQuery, options = {}) {
|
|
489
489
|
const { limit = 30, sources } = options;
|
|
490
490
|
const includeJira = !sources || sources.includes("jira");
|
|
@@ -737,7 +737,7 @@ async function getStats() {
|
|
|
737
737
|
};
|
|
738
738
|
}
|
|
739
739
|
|
|
740
|
-
// src/index.ts
|
|
740
|
+
// ../domain-rag-system/mcp-server/src/index.ts
|
|
741
741
|
var SOURCE_WEIGHTS = getSourceWeightsMap();
|
|
742
742
|
var qdrant = new QdrantClient({
|
|
743
743
|
url: config.qdrant.url,
|
|
@@ -988,6 +988,25 @@ var tools = [
|
|
|
988
988
|
properties: {}
|
|
989
989
|
}
|
|
990
990
|
},
|
|
991
|
+
{
|
|
992
|
+
name: "raw_sql",
|
|
993
|
+
description: "Execute a raw SQL SELECT query on PostgreSQL database. ONLY SELECT queries are allowed. Use for complex queries that other tools cannot handle. Tables: persons, jira_projects, jira_issues, confluence_spaces, confluence_pages, git_commits, jira_issue_commits.",
|
|
994
|
+
inputSchema: {
|
|
995
|
+
type: "object",
|
|
996
|
+
properties: {
|
|
997
|
+
sql: {
|
|
998
|
+
type: "string",
|
|
999
|
+
description: "SQL SELECT query to execute. Example: SELECT issue_key, summary FROM jira_issues WHERE status = 'Done' LIMIT 10"
|
|
1000
|
+
},
|
|
1001
|
+
params: {
|
|
1002
|
+
type: "array",
|
|
1003
|
+
items: { type: "string" },
|
|
1004
|
+
description: "Query parameters for parameterized queries (optional). Use $1, $2, etc. in SQL."
|
|
1005
|
+
}
|
|
1006
|
+
},
|
|
1007
|
+
required: ["sql"]
|
|
1008
|
+
}
|
|
1009
|
+
},
|
|
991
1010
|
// ============================================
|
|
992
1011
|
// Vector Search Tools (Qdrant)
|
|
993
1012
|
// ============================================
|
|
@@ -1569,6 +1588,59 @@ async function handleGetDbStats() {
|
|
|
1569
1588
|
}
|
|
1570
1589
|
return response;
|
|
1571
1590
|
}
|
|
1591
|
+
async function handleRawSql(args) {
|
|
1592
|
+
if (!pgAvailable) {
|
|
1593
|
+
return "PostgreSQL not available.";
|
|
1594
|
+
}
|
|
1595
|
+
const normalizedSql = args.sql.trim().toLowerCase();
|
|
1596
|
+
if (!normalizedSql.startsWith("select")) {
|
|
1597
|
+
return "Error: Only SELECT queries are allowed. Use SELECT to query data.";
|
|
1598
|
+
}
|
|
1599
|
+
const dangerousKeywords = ["insert", "update", "delete", "drop", "truncate", "alter", "create", "grant", "revoke"];
|
|
1600
|
+
for (const keyword of dangerousKeywords) {
|
|
1601
|
+
if (normalizedSql.includes(keyword)) {
|
|
1602
|
+
return `Error: Query contains forbidden keyword "${keyword}". Only SELECT queries are allowed.`;
|
|
1603
|
+
}
|
|
1604
|
+
}
|
|
1605
|
+
try {
|
|
1606
|
+
const result = await query(args.sql, args.params);
|
|
1607
|
+
if (result.rows.length === 0) {
|
|
1608
|
+
return "Query returned no results.";
|
|
1609
|
+
}
|
|
1610
|
+
const columns = Object.keys(result.rows[0]);
|
|
1611
|
+
let response = `## Query Results
|
|
1612
|
+
|
|
1613
|
+
`;
|
|
1614
|
+
response += `Rows: ${result.rows.length}
|
|
1615
|
+
|
|
1616
|
+
`;
|
|
1617
|
+
response += "| " + columns.join(" | ") + " |\n";
|
|
1618
|
+
response += "|" + columns.map(() => "---").join("|") + "|\n";
|
|
1619
|
+
const maxRows = Math.min(result.rows.length, 100);
|
|
1620
|
+
for (let i = 0; i < maxRows; i++) {
|
|
1621
|
+
const row = result.rows[i];
|
|
1622
|
+
const values = columns.map((col) => {
|
|
1623
|
+
const val = row[col];
|
|
1624
|
+
if (val === null)
|
|
1625
|
+
return "NULL";
|
|
1626
|
+
if (typeof val === "object")
|
|
1627
|
+
return JSON.stringify(val).substring(0, 100);
|
|
1628
|
+
const str = String(val);
|
|
1629
|
+
return str.length > 100 ? str.substring(0, 100) + "..." : str;
|
|
1630
|
+
});
|
|
1631
|
+
response += "| " + values.join(" | ") + " |\n";
|
|
1632
|
+
}
|
|
1633
|
+
if (result.rows.length > 100) {
|
|
1634
|
+
response += `
|
|
1635
|
+
*Showing first 100 of ${result.rows.length} rows*
|
|
1636
|
+
`;
|
|
1637
|
+
}
|
|
1638
|
+
return response;
|
|
1639
|
+
} catch (error) {
|
|
1640
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
1641
|
+
return `SQL Error: ${message}`;
|
|
1642
|
+
}
|
|
1643
|
+
}
|
|
1572
1644
|
async function handleSearchAsAnalyst(args) {
|
|
1573
1645
|
const results = await searchWithWeights({
|
|
1574
1646
|
query: args.query,
|
|
@@ -1781,6 +1853,9 @@ async function main() {
|
|
|
1781
1853
|
case "get_db_stats":
|
|
1782
1854
|
result = await handleGetDbStats();
|
|
1783
1855
|
break;
|
|
1856
|
+
case "raw_sql":
|
|
1857
|
+
result = await handleRawSql(args);
|
|
1858
|
+
break;
|
|
1784
1859
|
case "search_as_analyst":
|
|
1785
1860
|
result = await handleSearchAsAnalyst(args);
|
|
1786
1861
|
break;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "domain-rag-mcp-server",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "MCP server for domain RAG search — connects to Qdrant + PostgreSQL + Code Search API for hybrid search across Jira, Confluence, Git commits, and server-side code repositories",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.mjs",
|