@devflow-tools/mcp-server 0.3.0 → 0.3.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/dist/enforcer/audit-chain.d.ts +10 -0
- package/dist/enforcer/audit-chain.d.ts.map +1 -0
- package/dist/enforcer/audit-chain.js +56 -0
- package/dist/enforcer/audit-chain.js.map +1 -0
- package/dist/enforcer/constitutional.d.ts +3 -0
- package/dist/enforcer/constitutional.d.ts.map +1 -0
- package/dist/enforcer/constitutional.js +27 -0
- package/dist/enforcer/constitutional.js.map +1 -0
- package/dist/enforcer/index.d.ts +13 -0
- package/dist/enforcer/index.d.ts.map +1 -0
- package/dist/enforcer/index.js +70 -0
- package/dist/enforcer/index.js.map +1 -0
- package/dist/enforcer/receipt.d.ts +5 -0
- package/dist/enforcer/receipt.d.ts.map +1 -0
- package/dist/enforcer/receipt.js +24 -0
- package/dist/enforcer/receipt.js.map +1 -0
- package/dist/enforcer/rule-engine.d.ts +9 -0
- package/dist/enforcer/rule-engine.d.ts.map +1 -0
- package/dist/enforcer/rule-engine.js +67 -0
- package/dist/enforcer/rule-engine.js.map +1 -0
- package/dist/enforcer/types.d.ts +2 -0
- package/dist/enforcer/types.d.ts.map +1 -0
- package/dist/enforcer/types.js +2 -0
- package/dist/enforcer/types.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +90 -12
- package/dist/server.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +64 -10
- package/dist/tools.js.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Decision } from "./types.js";
|
|
2
|
+
import type { IDataProvider } from "@devflow-tools/sdk";
|
|
3
|
+
export declare function hashArgs(args: Record<string, unknown>): string;
|
|
4
|
+
export declare function appendAuditEntry(provider: IDataProvider, toolName: string, argsHash: string, decision: Decision, ruleId: string | null, sessionId: string): Promise<void>;
|
|
5
|
+
export declare function verifyAuditChain(provider: IDataProvider): Promise<{
|
|
6
|
+
valid: boolean;
|
|
7
|
+
brokenAt: number | null;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function rebuildAuditChain(provider: IDataProvider): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=audit-chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-chain.d.ts","sourceRoot":"","sources":["../../src/enforcer/audit-chain.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAG9D;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAiBpH;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createHmac, createHash } from "node:crypto";
|
|
2
|
+
export function hashArgs(args) {
|
|
3
|
+
const normalized = JSON.stringify(args, Object.keys(args).sort());
|
|
4
|
+
return createHash("sha256").update(normalized).digest("hex");
|
|
5
|
+
}
|
|
6
|
+
export async function appendAuditEntry(provider, toolName, argsHash, decision, ruleId, sessionId) {
|
|
7
|
+
const secret = await provider.auditGetSecret();
|
|
8
|
+
const allEntries = await provider.auditGetAll();
|
|
9
|
+
const prevHash = allEntries.length > 0
|
|
10
|
+
? allEntries[allEntries.length - 1].signature
|
|
11
|
+
: createHash("sha256").update("genesis").digest("hex");
|
|
12
|
+
const ts = Date.now();
|
|
13
|
+
const seq = allEntries.length + 1;
|
|
14
|
+
const payload = `${seq}|${ts}|${toolName}|${argsHash}|${decision}|${ruleId ?? ""}|${sessionId}|${prevHash}`;
|
|
15
|
+
const signature = createHmac("sha256", secret).update(payload).digest("hex");
|
|
16
|
+
await provider.auditAppend({
|
|
17
|
+
seq,
|
|
18
|
+
ts,
|
|
19
|
+
tool: toolName,
|
|
20
|
+
argsHash,
|
|
21
|
+
decision,
|
|
22
|
+
ruleId,
|
|
23
|
+
sessionId,
|
|
24
|
+
prevHash,
|
|
25
|
+
signature,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export async function verifyAuditChain(provider) {
|
|
29
|
+
const secret = await provider.auditGetSecret();
|
|
30
|
+
const entries = await provider.auditGetAll();
|
|
31
|
+
let prevHash = createHash("sha256").update("genesis").digest("hex");
|
|
32
|
+
for (const entry of entries) {
|
|
33
|
+
if (entry.prevHash !== prevHash) {
|
|
34
|
+
return { valid: false, brokenAt: entry.seq };
|
|
35
|
+
}
|
|
36
|
+
const payload = `${entry.seq}|${entry.ts}|${entry.tool}|${entry.argsHash}|${entry.decision}|${entry.ruleId ?? ""}|${entry.sessionId}|${prevHash}`;
|
|
37
|
+
const expectedSig = createHmac("sha256", secret).update(payload).digest("hex");
|
|
38
|
+
if (entry.signature !== expectedSig) {
|
|
39
|
+
return { valid: false, brokenAt: entry.seq };
|
|
40
|
+
}
|
|
41
|
+
prevHash = entry.signature;
|
|
42
|
+
}
|
|
43
|
+
return { valid: true, brokenAt: null };
|
|
44
|
+
}
|
|
45
|
+
export async function rebuildAuditChain(provider) {
|
|
46
|
+
const secret = await provider.auditGetSecret();
|
|
47
|
+
const entries = await provider.auditGetAll();
|
|
48
|
+
let prevHash = createHash("sha256").update("genesis").digest("hex");
|
|
49
|
+
for (const entry of entries) {
|
|
50
|
+
const payload = `${entry.seq}|${entry.ts}|${entry.tool}|${entry.argsHash}|${entry.decision}|${entry.ruleId ?? ""}|${entry.sessionId}|${prevHash}`;
|
|
51
|
+
const signature = createHmac("sha256", secret).update(payload).digest("hex");
|
|
52
|
+
await provider.sqlExecute("UPDATE devflow_audit_chain SET prev_hash = ?, signature = ? WHERE seq = ?", [prevHash, signature, entry.seq]);
|
|
53
|
+
prevHash = signature;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=audit-chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-chain.js","sourceRoot":"","sources":["../../src/enforcer/audit-chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitutional.d.ts","sourceRoot":"","sources":["../../src/enforcer/constitutional.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,eAAO,MAAM,oBAAoB,EAAE,IAAI,EAyBtC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const CONSTITUTIONAL_RULES = [
|
|
2
|
+
{
|
|
3
|
+
id: "C001",
|
|
4
|
+
name: "必须携带 Session Token",
|
|
5
|
+
level: "constitutional",
|
|
6
|
+
condition: { requireFields: ["_devflow_token"] },
|
|
7
|
+
action: "deny",
|
|
8
|
+
message: "缺少 Session Token。请通过 /devflow: 命令启动会话,或运行 devflow session token 获取令牌。",
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
id: "C002",
|
|
12
|
+
name: "Token 已过期",
|
|
13
|
+
level: "constitutional",
|
|
14
|
+
condition: {},
|
|
15
|
+
action: "deny",
|
|
16
|
+
message: "Session Token 已过期(超过 1 小时)。请重新运行 devflow session token 获取新令牌。",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
id: "C003",
|
|
20
|
+
name: "速率限制",
|
|
21
|
+
level: "constitutional",
|
|
22
|
+
condition: { maxCallsPerMinute: 60 },
|
|
23
|
+
action: "warn",
|
|
24
|
+
message: "调用频率过高,请稍后重试。",
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
//# sourceMappingURL=constitutional.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitutional.js","sourceRoot":"","sources":["../../src/enforcer/constitutional.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAW;IAC1C;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,gBAAgB;QACvB,SAAS,EAAE,EAAE,aAAa,EAAE,CAAC,gBAAgB,CAAC,EAAE;QAChD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,uEAAuE;KACjF;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,gBAAgB;QACvB,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,+DAA+D;KACzE;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,gBAAgB;QACvB,SAAS,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACpC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,eAAe;KACzB;CACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MCPContext, EnforceResult } from "./types.js";
|
|
2
|
+
import type { IDataProvider } from "@devflow-tools/sdk";
|
|
3
|
+
import { issueReceipt } from "./receipt.js";
|
|
4
|
+
export declare function parseJwtPayload(token: string): Record<string, unknown> | null;
|
|
5
|
+
export type { MCPContext, EnforceResult };
|
|
6
|
+
export { verifyAuditChain, rebuildAuditChain, hashArgs } from "./audit-chain.js";
|
|
7
|
+
export { issueReceipt, verifyReceipt, isReceiptExpired } from "./receipt.js";
|
|
8
|
+
export { CONSTITUTIONAL_RULES } from "./constitutional.js";
|
|
9
|
+
export declare function enforce(toolName: string, args: Record<string, unknown>, provider: IDataProvider): Promise<{
|
|
10
|
+
result: EnforceResult;
|
|
11
|
+
receipt?: ReturnType<typeof issueReceipt>;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enforcer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAU7E;AAED,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;AAE1C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;CAAE,CAAC,CAuD/E"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { loadRules, evaluateAll } from "./rule-engine.js";
|
|
2
|
+
import { hashArgs, appendAuditEntry } from "./audit-chain.js";
|
|
3
|
+
import { issueReceipt } from "./receipt.js";
|
|
4
|
+
export function parseJwtPayload(token) {
|
|
5
|
+
try {
|
|
6
|
+
const parts = token.split(".");
|
|
7
|
+
if (parts.length !== 3)
|
|
8
|
+
return null;
|
|
9
|
+
const payloadB64 = parts[1];
|
|
10
|
+
const json = Buffer.from(payloadB64, "base64url").toString("utf-8");
|
|
11
|
+
return JSON.parse(json);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export { verifyAuditChain, rebuildAuditChain, hashArgs } from "./audit-chain.js";
|
|
18
|
+
export { issueReceipt, verifyReceipt, isReceiptExpired } from "./receipt.js";
|
|
19
|
+
export { CONSTITUTIONAL_RULES } from "./constitutional.js";
|
|
20
|
+
export async function enforce(toolName, args, provider) {
|
|
21
|
+
// Dual-path token injection: args first, env fallback
|
|
22
|
+
if (!args._devflow_token) {
|
|
23
|
+
const envToken = process.env.DEVFLOW_SESSION_TOKEN;
|
|
24
|
+
if (envToken) {
|
|
25
|
+
const parsed = parseJwtPayload(envToken);
|
|
26
|
+
if (parsed) {
|
|
27
|
+
args = { ...args, _devflow_token: parsed };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const sessionId = args._devflow_token?.sub ?? "anon";
|
|
32
|
+
const ctx = {
|
|
33
|
+
toolName,
|
|
34
|
+
args,
|
|
35
|
+
sessionId,
|
|
36
|
+
tokenPayload: args._devflow_token,
|
|
37
|
+
};
|
|
38
|
+
// C002: Check token expiry (hardcoded in enforce for performance — no rule lookup needed)
|
|
39
|
+
if (ctx.tokenPayload) {
|
|
40
|
+
const now = Math.floor(Date.now() / 1000);
|
|
41
|
+
if (ctx.tokenPayload.exp && now > ctx.tokenPayload.exp) {
|
|
42
|
+
const argsHash = hashArgs(args);
|
|
43
|
+
await appendAuditEntry(provider, toolName, argsHash, "deny", "C002", sessionId);
|
|
44
|
+
return {
|
|
45
|
+
result: {
|
|
46
|
+
allowed: false,
|
|
47
|
+
message: "Session Token 已过期(超过 1 小时)。请重新运行 devflow session token 获取新令牌。",
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Load and evaluate all rules
|
|
53
|
+
const rules = await loadRules(provider);
|
|
54
|
+
const { decision, rule } = evaluateAll(rules, ctx);
|
|
55
|
+
const argsHash = hashArgs(args);
|
|
56
|
+
await appendAuditEntry(provider, toolName, argsHash, decision, rule?.id ?? null, sessionId);
|
|
57
|
+
if (decision === "deny" && rule) {
|
|
58
|
+
return { result: { allowed: false, rule, message: rule.message } };
|
|
59
|
+
}
|
|
60
|
+
if (decision === "warn" && rule) {
|
|
61
|
+
const secret = await provider.auditGetSecret();
|
|
62
|
+
const receipt = issueReceipt(toolName, args, secret);
|
|
63
|
+
return { result: { allowed: true, warning: rule.message, rule }, receipt };
|
|
64
|
+
}
|
|
65
|
+
// ALLOW
|
|
66
|
+
const secret = await provider.auditGetSecret();
|
|
67
|
+
const receipt = issueReceipt(toolName, args, secret);
|
|
68
|
+
return { result: { allowed: true }, receipt };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enforcer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Receipt } from "./types.js";
|
|
2
|
+
export declare function issueReceipt(toolName: string, query: unknown, secret: string): Receipt;
|
|
3
|
+
export declare function verifyReceipt(receipt: Receipt, toolName: string, query: unknown, secret: string): boolean;
|
|
4
|
+
export declare function isReceiptExpired(receipt: Receipt): boolean;
|
|
5
|
+
//# sourceMappingURL=receipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../src/enforcer/receipt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQtF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAOzG;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAE1D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createHmac, createHash } from "node:crypto";
|
|
2
|
+
const RECEIPT_TTL_MS = 30_000;
|
|
3
|
+
export function issueReceipt(toolName, query, secret) {
|
|
4
|
+
const ts = Date.now();
|
|
5
|
+
const exp = ts + RECEIPT_TTL_MS;
|
|
6
|
+
const queryHash = createHash("sha256").update(JSON.stringify(query)).digest("hex");
|
|
7
|
+
const payload = `${toolName}|${ts}|${exp}|${queryHash}`;
|
|
8
|
+
const hmac = createHmac("sha256", secret).update(payload).digest("hex");
|
|
9
|
+
return { tool: toolName, ts, exp, queryHash, hmac };
|
|
10
|
+
}
|
|
11
|
+
export function verifyReceipt(receipt, toolName, query, secret) {
|
|
12
|
+
if (Date.now() > receipt.exp)
|
|
13
|
+
return false;
|
|
14
|
+
const queryHash = createHash("sha256").update(JSON.stringify(query)).digest("hex");
|
|
15
|
+
if (receipt.queryHash !== queryHash)
|
|
16
|
+
return false;
|
|
17
|
+
const payload = `${toolName}|${receipt.ts}|${receipt.exp}|${queryHash}`;
|
|
18
|
+
const expectedHmac = createHmac("sha256", secret).update(payload).digest("hex");
|
|
19
|
+
return receipt.hmac === expectedHmac;
|
|
20
|
+
}
|
|
21
|
+
export function isReceiptExpired(receipt) {
|
|
22
|
+
return Date.now() > receipt.exp;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/enforcer/receipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAc,EAAE,MAAc;IAC3E,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,EAAE,GAAG,cAAc,CAAC;IAChC,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,EAAE,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAExE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,QAAgB,EAAE,KAAc,EAAE,MAAc;IAC9F,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnF,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;IACxE,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChF,OAAO,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Rule, Decision, MCPContext } from "./types.js";
|
|
2
|
+
import type { IDataProvider } from "@devflow-tools/sdk";
|
|
3
|
+
export declare function loadRules(provider: IDataProvider): Promise<Rule[]>;
|
|
4
|
+
export declare function evaluateRule(rule: Rule, ctx: MCPContext): Decision;
|
|
5
|
+
export declare function evaluateAll(rules: Rule[], ctx: MCPContext): {
|
|
6
|
+
decision: Decision;
|
|
7
|
+
rule?: Rule;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=rule-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-engine.d.ts","sourceRoot":"","sources":["../../src/enforcer/rule-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAiB,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKxD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAGxE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,GAAG,QAAQ,CAgDlE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,CAc/F"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { CONSTITUTIONAL_RULES } from "./constitutional.js";
|
|
2
|
+
const rateCounters = new Map();
|
|
3
|
+
export async function loadRules(provider) {
|
|
4
|
+
const projectRules = await provider.ruleGetAll();
|
|
5
|
+
return [...CONSTITUTIONAL_RULES, ...projectRules];
|
|
6
|
+
}
|
|
7
|
+
export function evaluateRule(rule, ctx) {
|
|
8
|
+
const cond = rule.condition;
|
|
9
|
+
// Tool filter
|
|
10
|
+
if (cond.tools && !cond.tools.includes("*") && !cond.tools.includes(ctx.toolName)) {
|
|
11
|
+
return "allow";
|
|
12
|
+
}
|
|
13
|
+
// Required fields check
|
|
14
|
+
if (cond.requireFields) {
|
|
15
|
+
for (const field of cond.requireFields) {
|
|
16
|
+
if (!(field in ctx.args))
|
|
17
|
+
return rule.action;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// Forbidden patterns check
|
|
21
|
+
if (cond.forbidPatterns) {
|
|
22
|
+
for (const pattern of cond.forbidPatterns) {
|
|
23
|
+
for (const val of Object.values(ctx.args)) {
|
|
24
|
+
if (typeof val === "string" && new RegExp(pattern).test(val)) {
|
|
25
|
+
return rule.action;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Param pattern check
|
|
31
|
+
if (cond.paramPatterns) {
|
|
32
|
+
for (const [key, pattern] of Object.entries(cond.paramPatterns)) {
|
|
33
|
+
const val = String(ctx.args[key] ?? "");
|
|
34
|
+
if (new RegExp(pattern).test(val))
|
|
35
|
+
return rule.action;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Rate limit check
|
|
39
|
+
if (cond.maxCallsPerMinute) {
|
|
40
|
+
const key = `${ctx.toolName}:${ctx.sessionId ?? "anon"}`;
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
let entry = rateCounters.get(key);
|
|
43
|
+
if (!entry || now > entry.resetAt) {
|
|
44
|
+
entry = { count: 0, resetAt: now + 60_000 };
|
|
45
|
+
rateCounters.set(key, entry);
|
|
46
|
+
}
|
|
47
|
+
entry.count++;
|
|
48
|
+
if (entry.count > cond.maxCallsPerMinute)
|
|
49
|
+
return rule.action;
|
|
50
|
+
}
|
|
51
|
+
return "allow";
|
|
52
|
+
}
|
|
53
|
+
export function evaluateAll(rules, ctx) {
|
|
54
|
+
// Constitutional rules first (sorted by level priority)
|
|
55
|
+
const sorted = [...rules].sort((a, b) => {
|
|
56
|
+
const order = { constitutional: 0, project: 1, session: 2 };
|
|
57
|
+
return order[a.level] - order[b.level];
|
|
58
|
+
});
|
|
59
|
+
for (const rule of sorted) {
|
|
60
|
+
const decision = evaluateRule(rule, ctx);
|
|
61
|
+
if (decision !== "allow") {
|
|
62
|
+
return { decision, rule };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { decision: "allow" };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=rule-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../../src/enforcer/rule-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/enforcer/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,IAAI,EACJ,aAAa,EACb,QAAQ,EACR,aAAa,EACb,UAAU,EACV,UAAU,EACV,OAAO,GACR,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/enforcer/types.ts"],"names":[],"mappings":""}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+G1E"}
|
package/dist/server.js
CHANGED
|
@@ -3,7 +3,9 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
3
3
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
4
4
|
import { DevFlowApiClient, loadPlugins } from "@devflow-tools/sdk";
|
|
5
5
|
import { getCoreTools, getPluginTools } from "./tools.js";
|
|
6
|
+
import { createHmac } from "node:crypto";
|
|
6
7
|
export async function startServer(options) {
|
|
8
|
+
ensureSessionToken(options.projectRoot);
|
|
7
9
|
const server = new Server({ name: "devflow-mcp", version: "0.1.0" }, { capabilities: { tools: {} } });
|
|
8
10
|
const serverUrl = process.env.DEVFLOW_SERVER_URL ?? "http://127.0.0.1:3100";
|
|
9
11
|
const apiKey = process.env.DEVFLOW_API_KEY ?? "dev-key-000000";
|
|
@@ -21,35 +23,77 @@ export async function startServer(options) {
|
|
|
21
23
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
22
24
|
tools: allTools,
|
|
23
25
|
}));
|
|
26
|
+
// Cache the local engines reference for telemetry recording
|
|
27
|
+
let localEngines = null;
|
|
24
28
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
25
29
|
const { name, arguments: args } = request.params;
|
|
26
30
|
const argObj = (args ?? {});
|
|
31
|
+
const startTime = Date.now();
|
|
27
32
|
try {
|
|
28
33
|
let result;
|
|
29
34
|
if (useRemote) {
|
|
30
35
|
result = await routeToServer(client, name, argObj);
|
|
31
36
|
}
|
|
32
37
|
else {
|
|
33
|
-
// Dynamic import — only loads CodeGraph
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const
|
|
38
|
+
// Dynamic import — only loads CodeGraph when first needed
|
|
39
|
+
if (!localEngines) {
|
|
40
|
+
const [{ createEngines }] = await Promise.all([
|
|
41
|
+
import("@devflow-tools/context-engine"),
|
|
42
|
+
]);
|
|
43
|
+
localEngines = await createEngines(options.projectRoot);
|
|
44
|
+
console.error(`[devflow-mcp] Warning: DevFlow server not reachable at ${serverUrl}`);
|
|
45
|
+
console.error("[devflow-mcp] Running in local mode.");
|
|
46
|
+
}
|
|
47
|
+
// L1: Enforcer check before execution
|
|
48
|
+
const { enforce } = await import("./enforcer/index.js");
|
|
49
|
+
const enforcement = await enforce(name, argObj, localEngines.data);
|
|
50
|
+
if (!enforcement.result.allowed) {
|
|
51
|
+
return {
|
|
52
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
53
|
+
_devflow: { v: 1, tool: name, ts: Date.now(), marker: "devflow-mcp-v1" },
|
|
54
|
+
error: enforcement.result.message,
|
|
55
|
+
rule: enforcement.result.rule?.id,
|
|
56
|
+
}) }],
|
|
57
|
+
isError: true,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const { createToolHandlers, createPluginHandlers } = await import("./tools.js");
|
|
61
|
+
const handlers = createToolHandlers(localEngines);
|
|
62
|
+
const pHnd = createPluginHandlers(localEngines, plugins);
|
|
44
63
|
const allHandlers = { ...handlers, ...pHnd };
|
|
45
64
|
const handler = allHandlers[name];
|
|
46
65
|
if (!handler)
|
|
47
66
|
throw new Error(`Unknown tool: ${name}`);
|
|
48
67
|
result = await handler(argObj);
|
|
68
|
+
// Layer 4: Record tool call in local telemetry
|
|
69
|
+
const durationMs = Date.now() - startTime;
|
|
70
|
+
try {
|
|
71
|
+
await localEngines.data.recordToolCall(name, argObj, durationMs);
|
|
72
|
+
}
|
|
73
|
+
catch { }
|
|
74
|
+
// Attach receipt and warning to result
|
|
75
|
+
if (enforcement.receipt) {
|
|
76
|
+
result = { ...result, _receipt: enforcement.receipt };
|
|
77
|
+
}
|
|
78
|
+
if (enforcement.result.warning) {
|
|
79
|
+
result = { ...result, _warning: enforcement.result.warning };
|
|
80
|
+
}
|
|
49
81
|
}
|
|
50
|
-
|
|
82
|
+
// Layer 3: Append _devflow response marker to prove MCP tool was used
|
|
83
|
+
const marked = wrapWithDevflowMarker(name, result);
|
|
84
|
+
return { content: [{ type: "text", text: JSON.stringify(marked, null, 2) }] };
|
|
51
85
|
}
|
|
52
86
|
catch (err) {
|
|
87
|
+
// Layer 4: Record failed tool call
|
|
88
|
+
const durationMs = Date.now() - startTime;
|
|
89
|
+
if (!useRemote && localEngines) {
|
|
90
|
+
try {
|
|
91
|
+
await localEngines.data.recordToolCall(name, argObj, durationMs, err.message);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Telemetry recording failure must not break error reporting
|
|
95
|
+
}
|
|
96
|
+
}
|
|
53
97
|
return {
|
|
54
98
|
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
55
99
|
isError: true,
|
|
@@ -59,6 +103,40 @@ export async function startServer(options) {
|
|
|
59
103
|
const transport = new StdioServerTransport();
|
|
60
104
|
await server.connect(transport);
|
|
61
105
|
}
|
|
106
|
+
function ensureSessionToken(projectRoot) {
|
|
107
|
+
if (process.env.DEVFLOW_SESSION_TOKEN)
|
|
108
|
+
return;
|
|
109
|
+
const header = Buffer.from(JSON.stringify({ alg: "HS256", typ: "JWT" })).toString("base64url");
|
|
110
|
+
const now = Math.floor(Date.now() / 1000);
|
|
111
|
+
const payload = {
|
|
112
|
+
sub: `devflow-mcp-${Date.now().toString(36)}`,
|
|
113
|
+
project: projectRoot.split("/").pop() ?? "unknown",
|
|
114
|
+
iat: now,
|
|
115
|
+
exp: now + 3600,
|
|
116
|
+
scope: ["context", "knowledge", "memory", "workflow", "graph"],
|
|
117
|
+
};
|
|
118
|
+
const payloadB64 = Buffer.from(JSON.stringify(payload)).toString("base64url");
|
|
119
|
+
const secret = "devflow-local-mcp-secret-v1";
|
|
120
|
+
const signature = createHmac("sha256", secret)
|
|
121
|
+
.update(`${header}.${payloadB64}`)
|
|
122
|
+
.digest("base64url");
|
|
123
|
+
process.env.DEVFLOW_SESSION_TOKEN = `${header}.${payloadB64}.${signature}`;
|
|
124
|
+
console.error("[devflow-mcp] Auto-generated session token (no env token provided).");
|
|
125
|
+
}
|
|
126
|
+
function wrapWithDevflowMarker(toolName, result) {
|
|
127
|
+
const marker = {
|
|
128
|
+
_devflow: {
|
|
129
|
+
v: 1,
|
|
130
|
+
tool: toolName,
|
|
131
|
+
ts: Date.now(),
|
|
132
|
+
marker: "devflow-mcp-v1",
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
if (result && typeof result === "object" && !Array.isArray(result)) {
|
|
136
|
+
return { ...result, ...marker };
|
|
137
|
+
}
|
|
138
|
+
return { result, ...marker };
|
|
139
|
+
}
|
|
62
140
|
async function routeToServer(client, toolName, args) {
|
|
63
141
|
switch (toolName) {
|
|
64
142
|
case "get_project_context":
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,oBAAoB,CAAC;AAEnE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAyGxC;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAE/F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,oBAAoB,CAAC;AAEnE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAyGxC;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAE/F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,GAAG,YAAY,CA0HnE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAqBlE;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,aAAa,EAAE,GACvB,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAuBrE"}
|
package/dist/tools.js
CHANGED
|
@@ -107,32 +107,77 @@ export function getCoreTools() {
|
|
|
107
107
|
export function createToolHandlers(engines) {
|
|
108
108
|
return {
|
|
109
109
|
get_project_context: async ({ query, mode }) => {
|
|
110
|
-
|
|
110
|
+
const result = await engines.context.build({
|
|
111
111
|
query: query,
|
|
112
112
|
mode: mode ?? "fast",
|
|
113
113
|
});
|
|
114
|
+
return {
|
|
115
|
+
...result,
|
|
116
|
+
_devflow_unique: {
|
|
117
|
+
search_method: "bm25_semantic",
|
|
118
|
+
confidence_scored: true,
|
|
119
|
+
memory_injected: true,
|
|
120
|
+
token_estimated: true,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
114
123
|
},
|
|
115
124
|
search_symbol: async ({ symbol }) => {
|
|
116
|
-
|
|
125
|
+
const result = await engines.indexer.findSymbol(symbol);
|
|
126
|
+
return {
|
|
127
|
+
...result,
|
|
128
|
+
_devflow_unique: {
|
|
129
|
+
index_backed: true,
|
|
130
|
+
kind_annotated: true,
|
|
131
|
+
},
|
|
132
|
+
};
|
|
117
133
|
},
|
|
118
134
|
get_dependency_graph: async ({ target, depth }) => {
|
|
119
135
|
const t = target ?? "all";
|
|
120
136
|
const d = depth ?? 2;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
137
|
+
const result = t === "all" ? engines.graph.export() : engines.graph.getSubGraph(t, d);
|
|
138
|
+
return {
|
|
139
|
+
...result,
|
|
140
|
+
_devflow_unique: {
|
|
141
|
+
layer_annotated: true,
|
|
142
|
+
architecture_grouped: true,
|
|
143
|
+
query_depth: d,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
125
146
|
},
|
|
126
147
|
run_workflow: async ({ type, input }) => {
|
|
127
|
-
|
|
148
|
+
const result = await engines.workflow.run(type, { input });
|
|
149
|
+
return {
|
|
150
|
+
...result,
|
|
151
|
+
_devflow_unique: {
|
|
152
|
+
dag_orchestrated: true,
|
|
153
|
+
step_tracked: true,
|
|
154
|
+
workflow_type: type,
|
|
155
|
+
},
|
|
156
|
+
};
|
|
128
157
|
},
|
|
129
158
|
get_memory: async () => {
|
|
130
|
-
|
|
159
|
+
const result = await engines.memory.getAll();
|
|
160
|
+
return {
|
|
161
|
+
...result,
|
|
162
|
+
_devflow_unique: {
|
|
163
|
+
memory_version: 1,
|
|
164
|
+
structured_storage: true,
|
|
165
|
+
project_context_included: true,
|
|
166
|
+
},
|
|
167
|
+
};
|
|
131
168
|
},
|
|
132
169
|
get_knowledge: async ({ query, scope }) => {
|
|
133
|
-
|
|
170
|
+
const result = await engines.knowledge.search(query, {
|
|
134
171
|
sources: scope === "all" ? undefined : [scope],
|
|
135
172
|
});
|
|
173
|
+
return {
|
|
174
|
+
...result,
|
|
175
|
+
_devflow_unique: {
|
|
176
|
+
source_versioned: true,
|
|
177
|
+
code_examples_included: true,
|
|
178
|
+
search_scope: scope,
|
|
179
|
+
},
|
|
180
|
+
};
|
|
136
181
|
},
|
|
137
182
|
devflow_report_event: async (args) => {
|
|
138
183
|
const truncate = (s, max) => {
|
|
@@ -213,7 +258,16 @@ export function createPluginHandlers(engines, plugins) {
|
|
|
213
258
|
continue;
|
|
214
259
|
const toolName = `${prefix}_${mcpTrigger.tool}`;
|
|
215
260
|
handlers[toolName] = async (args) => {
|
|
216
|
-
|
|
261
|
+
const result = await engines.workflow.run(template.name, args);
|
|
262
|
+
return {
|
|
263
|
+
...result,
|
|
264
|
+
_devflow_unique: {
|
|
265
|
+
dag_orchestrated: true,
|
|
266
|
+
step_tracked: true,
|
|
267
|
+
plugin_name: prefix,
|
|
268
|
+
template_name: template.name,
|
|
269
|
+
},
|
|
270
|
+
};
|
|
217
271
|
};
|
|
218
272
|
}
|
|
219
273
|
}
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,YAAY;IAC1B,OAAO;QACL;YACE,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EAAE,kBAAkB;YAC/B,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE;oBAChD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE;iBAClE;gBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;aACpB;SACF;QACD;YACE,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,qBAAqB;YAClC,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE;iBAChD;gBACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;aACrB;SACF;QACD;YACE,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EAAE,cAAc;YAC3B,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;oBAC1C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;iBACtC;aACF;SACF;QACD;YACE,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;oBAC/D,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;QACD;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,uBAAuB;YACpC,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;SACF;QACD;YACE,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;iBACjF;gBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;aACpB;SACF;QACD;YACE,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EAAE,4IAA4I;YACzJ,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;4BAC5B,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc;4BACrD,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe;4BAC1D,OAAO,EAAE,YAAY;yBACtB,EAAC;oBACF,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC5B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC5B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC/B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAChC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC5B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC7B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC9B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC5B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC5B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC/B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAChC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC9B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC7B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAChC;gBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;aACtC;SACF;KACF,CAAC;AACJ,CAAC;AAID,MAAM,UAAU,kBAAkB,CAAC,OAAkB;IACnD,OAAO;QACL,mBAAmB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;YAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;gBACzC,KAAK,EAAE,KAAe;gBACtB,IAAI,EAAG,IAAwB,IAAI,MAAM;aAC1C,CAAC,CAAC;YACH,OAAO;gBACL,GAAI,MAAiB;gBACrB,eAAe,EAAE;oBACf,aAAa,EAAE,eAAe;oBAC9B,iBAAiB,EAAE,IAAI;oBACvB,eAAe,EAAE,IAAI;oBACrB,eAAe,EAAE,IAAI;iBACtB;aACF,CAAC;QACJ,CAAC;QACD,aAAa,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAClC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,MAAgB,CAAC,CAAC;YAClE,OAAO;gBACL,GAAI,MAAiB;gBACrB,eAAe,EAAE;oBACf,YAAY,EAAE,IAAI;oBAClB,cAAc,EAAE,IAAI;iBACrB;aACF,CAAC;QACJ,CAAC;QACD,oBAAoB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;YAChD,MAAM,CAAC,GAAI,MAAiB,IAAI,KAAK,CAAC;YACtC,MAAM,CAAC,GAAI,KAAgB,IAAI,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtF,OAAO;gBACL,GAAI,MAAiB;gBACrB,eAAe,EAAE;oBACf,eAAe,EAAE,IAAI;oBACrB,oBAAoB,EAAE,IAAI;oBAC1B,WAAW,EAAE,CAAC;iBACf;aACF,CAAC;QACJ,CAAC;QACD,YAAY,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YACtC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACrE,OAAO;gBACL,GAAI,MAAiB;gBACrB,eAAe,EAAE;oBACf,gBAAgB,EAAE,IAAI;oBACtB,YAAY,EAAE,IAAI;oBAClB,aAAa,EAAE,IAAc;iBAC9B;aACF,CAAC;QACJ,CAAC;QACD,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7C,OAAO;gBACL,GAAI,MAAiB;gBACrB,eAAe,EAAE;oBACf,cAAc,EAAE,CAAC;oBACjB,kBAAkB,EAAE,IAAI;oBACxB,wBAAwB,EAAE,IAAI;iBAC/B;aACF,CAAC;QACJ,CAAC;QACD,aAAa,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,KAAe,EAAE;gBAC7D,OAAO,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,KAAgB,CAAC;aAC3D,CAAC,CAAC;YACH,OAAO;gBACL,GAAI,MAAiB;gBACrB,eAAe,EAAE;oBACf,gBAAgB,EAAE,IAAI;oBACtB,sBAAsB,EAAE,IAAI;oBAC5B,YAAY,EAAE,KAAe;iBAC9B;aACF,CAAC;QACJ,CAAC;QACD,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnC,MAAM,QAAQ,GAAG,CAAC,CAAqB,EAAE,GAAW,EAAyC,EAAE;gBAC7F,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;oBAAE,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACvE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACrD,CAAC,CAAC;YAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAA4B,EAAE,GAAG,CAAC,CAAC;YAChE,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,QAA8B,EAAE,GAAG,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAA4B,EAAE,IAAI,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAA4B,EAAE,GAAG,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;YAEjG,MAAM,KAAK,GAAG;gBACZ,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;gBACjE,KAAK,EAAE,IAAI,CAAC,KAAe;gBAC3B,MAAM,EAAE,IAAI,CAAC,MAAgB;gBAC7B,IAAI,EAAE,IAAI,CAAC,IAAiB;gBAC5B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAA8B;gBAC7C,IAAI,EAAE;oBACJ,KAAK,EAAE,IAAI,CAAC,KAA2B;oBACvC,MAAM,EAAE,MAAM,CAAC,KAAK;oBACpB,QAAQ,EAAE,QAAQ,CAAC,KAAK;oBACxB,WAAW,EAAE,IAAI,CAAC,WAAiC;oBACnD,YAAY,EAAE,IAAI,CAAC,YAAkC;oBACrD,QAAQ,EAAE,IAAI,CAAC,QAA8B;oBAC7C,SAAS,EAAE,IAAI,CAAC,SAA+B;oBAC/C,UAAU,EAAE,IAAI,CAAC,UAAgC;oBACjD,QAAQ,EAAE,IAAI,CAAC,QAA8B;oBAC7C,OAAO,EAAE,IAAI,CAAC,OAA6B;oBAC3C,QAAQ,EAAE,IAAI,CAAC,QAA8B;oBAC7C,MAAM,EAAE,MAAM,CAAC,KAAK;oBACpB,MAAM,EAAE,MAAM,CAAC,KAAK;oBACpB,WAAW,EAAE,IAAI,CAAC,WAAiC;oBACnD,YAAY,EAAE,IAAI,CAAC,YAAkC;oBACrD,UAAU,EAAE,IAAI,CAAC,UAAgC;oBACjD,SAAS,EAAE,IAAI,CAAC,SAA+B;oBAC/C,WAAW,EAAE,IAAI,CAAC,WAAiC;iBACpD;gBACD,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAiB,EAAE;gBACvC,GAAG,CAAC,SAAS,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,QAAiB,EAAE,EAAE,CAAC;aAC/E,CAAC;YAEF,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAwB;IACrD,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC,KAAK,MAAM,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;YAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YACpE,IAAI,CAAC,UAAU,EAAE,IAAI;gBAAE,SAAS;YAChC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,GAAG,MAAM,IAAI,UAAU,CAAC,IAAI,EAAE;gBACpC,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,QAAQ,CAAC,KAAK;yBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAS,CAAC,WAAW,CAAC;yBACrC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAE,CAAS,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1E,QAAQ,EAAE,EAAE;iBACb;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAkB,EAClB,OAAwB;IAExB,MAAM,QAAQ,GAAwE,EAAE,CAAC;IACzF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC,KAAK,MAAM,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;YAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;YACpE,IAAI,CAAC,UAAU,EAAE,IAAI;gBAAE,SAAS;YAChC,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YAChD,QAAQ,CAAC,QAAQ,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE;gBAClC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC/D,OAAO;oBACL,GAAI,MAAiB;oBACrB,eAAe,EAAE;wBACf,gBAAgB,EAAE,IAAI;wBACtB,YAAY,EAAE,IAAI;wBAClB,WAAW,EAAE,MAAM;wBACnB,aAAa,EAAE,QAAQ,CAAC,IAAI;qBAC7B;iBACF,CAAC;YACJ,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/mcp-server",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
"clean": "rm -rf dist"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@devflow-tools/context-engine": "^0.2
|
|
17
|
-
"@devflow-tools/knowledge-engine": "^0.2
|
|
18
|
-
"@devflow-tools/memory-engine": "^0.2
|
|
19
|
-
"@devflow-tools/sdk": "^0.2
|
|
20
|
-
"@devflow-tools/telemetry": "^0.2
|
|
21
|
-
"@devflow-tools/workflow-engine": "^0.2
|
|
16
|
+
"@devflow-tools/context-engine": "^0.3.2",
|
|
17
|
+
"@devflow-tools/knowledge-engine": "^0.3.2",
|
|
18
|
+
"@devflow-tools/memory-engine": "^0.3.2",
|
|
19
|
+
"@devflow-tools/sdk": "^0.3.2",
|
|
20
|
+
"@devflow-tools/telemetry": "^0.3.2",
|
|
21
|
+
"@devflow-tools/workflow-engine": "^0.3.2",
|
|
22
22
|
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
"dist",
|
|
30
30
|
"bin"
|
|
31
31
|
],
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "8bd4fe5d195782d3e5a5357fc9bff5998561c956"
|
|
33
33
|
}
|