feat: add shadow export MCP tooling
This commit is contained in:
102
scripts/stockout-detail-check-mcp.js
Normal file
102
scripts/stockout-detail-check-mcp.js
Normal file
@@ -0,0 +1,102 @@
|
||||
const { spawn } = require("child_process");
|
||||
|
||||
const config = "C:\\project\\FT546WMS-SHANDOW\\.cursorrules-mcp.json";
|
||||
const database = "FT546-wms";
|
||||
|
||||
function createClient() {
|
||||
const child = spawn("powershell.exe", [
|
||||
"-NoProfile", "-ExecutionPolicy", "Bypass", "-File",
|
||||
"C:\\project\\sqlserver-mcp-server\\start.ps1",
|
||||
"-ConfigPath", config
|
||||
], { stdio: ["pipe", "pipe", "pipe"] });
|
||||
let buffer = "";
|
||||
let nextId = 1;
|
||||
const pending = new Map();
|
||||
child.stdout.on("data", (chunk) => {
|
||||
buffer += chunk.toString();
|
||||
const lines = buffer.split(/\r?\n/);
|
||||
buffer = lines.pop();
|
||||
for (const line of lines) {
|
||||
if (!line.trim()) continue;
|
||||
try {
|
||||
const message = JSON.parse(line);
|
||||
const resolve = pending.get(message.id);
|
||||
if (resolve) {
|
||||
pending.delete(message.id);
|
||||
resolve(message);
|
||||
}
|
||||
} catch {
|
||||
// Ignore non-protocol output.
|
||||
}
|
||||
}
|
||||
});
|
||||
function call(method, params) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const id = nextId++;
|
||||
pending.set(id, (message) => message.error
|
||||
? reject(new Error(message.error.message || "MCP error"))
|
||||
: resolve(message.result));
|
||||
child.stdin.write(JSON.stringify({ jsonrpc: "2.0", id, method, params }) + "\n");
|
||||
});
|
||||
}
|
||||
return { child, call };
|
||||
}
|
||||
|
||||
function parseResult(result) {
|
||||
const item = (result.content || []).find((entry) => entry.type === "text");
|
||||
if (!item) throw new Error("MCP returned no result text");
|
||||
try {
|
||||
return JSON.parse(item.text);
|
||||
} catch {
|
||||
throw new Error(item.text.replace(/password\s*[:=]\s*[^\s,}]+/gi, "password=[redacted]").replace(/\r?\n/g, " "));
|
||||
}
|
||||
}
|
||||
|
||||
function quote(value) {
|
||||
return String(value ?? "").replaceAll("'", "''");
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const client = createClient();
|
||||
try {
|
||||
await client.call("initialize", {
|
||||
protocolVersion: "2025-06-18",
|
||||
capabilities: {},
|
||||
clientInfo: { name: "ft546-stockout-detail-check", version: "1.0" }
|
||||
});
|
||||
client.child.stdin.write(JSON.stringify({ jsonrpc: "2.0", method: "notifications/initialized" }) + "\n");
|
||||
|
||||
async function read(query) {
|
||||
return parseResult(await client.call("tools/call", {
|
||||
name: "sqlserver_read_data",
|
||||
arguments: { databaseName: database, query, response_format: "json" }
|
||||
}));
|
||||
}
|
||||
|
||||
const detail = await read("SELECT stockout_detail_id, warehouse_id, spare4 AS project_no, product_id FROM dbo.out_stockout_detail WHERE stockout_detail_id = 'CKD202608180003-1'");
|
||||
const row = detail.rows?.[0];
|
||||
const projectNo = row?.project_no == null ? null : String(row.project_no).trim();
|
||||
const productNo = row?.product_id == null ? null : String(row.product_id).trim();
|
||||
const projectLiteral = projectNo == null || projectNo === "" ? "NULL" : `'${quote(projectNo)}'`;
|
||||
const productConditionLegacy = productNo == null || productNo === "" ? "1 = 1" : `product_id = '${quote(productNo)}'`;
|
||||
const productConditionShadow = productNo == null || productNo === "" ? "1 = 1" : `product_no = '${quote(productNo)}'`;
|
||||
|
||||
const legacy = await read(`SELECT stock_id, warehouse_id, cargo_space_id, tray_code, spare4 AS project_no, product_id, quantity, out_quantity, stock_status, product_status FROM dbo.bas_stock WHERE spare4 = ${projectLiteral} AND ${productConditionLegacy}`);
|
||||
const shadow = await read(`SELECT stock_id, space_id, tray_code, project_no, product_no, quantity, out_quantity FROM alg.v_inventory_item WHERE project_no = ${projectLiteral} AND ${productConditionShadow}`);
|
||||
const sync = await read("SELECT MAX(synchronized_at) AS latest_shadow_inventory_sync FROM alg.inventory_item_snapshot WHERE warehouse_id = '01'");
|
||||
|
||||
console.log(JSON.stringify({
|
||||
detail: detail.rows || [],
|
||||
legacy_stock: legacy.rows || [],
|
||||
shadow_inventory: shadow.rows || [],
|
||||
latest_sync: sync.rows || []
|
||||
}, null, 2));
|
||||
} finally {
|
||||
client.child.kill();
|
||||
}
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
console.error("READONLY_QUERY_FAILED " + error.message);
|
||||
process.exitCode = 1;
|
||||
});
|
||||
Reference in New Issue
Block a user