@devflow-tools/mcp-server 0.3.1 → 0.4.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/README.md +59 -0
- package/dist/command-registry.json +235 -0
- 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/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +152 -12
- package/dist/server.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +67 -11
- package/dist/tools.js.map +1 -1
- package/package.json +9 -8
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# @devflow-tools/mcp-server
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server for DevFlow — provides AI agents with code context, symbol search, dependency graphs, workflows, memory, and knowledge.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @devflow-tools/mcp-server
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or use with `npx`:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @devflow-tools/mcp-server
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Configuration
|
|
18
|
+
|
|
19
|
+
Add to your MCP client config (`.claude/mcp.json`, `claude_desktop_config.json`, etc.):
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"mcpServers": {
|
|
24
|
+
"devflow": {
|
|
25
|
+
"command": "npx",
|
|
26
|
+
"args": ["@devflow-tools/mcp-server"]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Or let `devflow init` handle it automatically.
|
|
33
|
+
|
|
34
|
+
## MCP Tools
|
|
35
|
+
|
|
36
|
+
| Tool | Description |
|
|
37
|
+
|------|-------------|
|
|
38
|
+
| `get_project_context` | Get minimal context for a coding task |
|
|
39
|
+
| `search_symbol` | Search code by symbol name |
|
|
40
|
+
| `get_dependency_graph` | Get file/component dependencies |
|
|
41
|
+
| `run_workflow` | Execute standardized dev workflows |
|
|
42
|
+
| `get_memory` | Get project conventions and preferences |
|
|
43
|
+
| `get_knowledge` | Search technical documentation |
|
|
44
|
+
|
|
45
|
+
## Modes
|
|
46
|
+
|
|
47
|
+
- **Local mode** — when DevFlow server is unreachable, falls back to direct CodeGraph queries
|
|
48
|
+
- **Remote mode** — proxies to DevFlow REST API server
|
|
49
|
+
|
|
50
|
+
## Environment Variables
|
|
51
|
+
|
|
52
|
+
| Variable | Default | Description |
|
|
53
|
+
|----------|---------|-------------|
|
|
54
|
+
| `DEVFLOW_SERVER_URL` | `http://127.0.0.1:3100` | DevFlow server URL |
|
|
55
|
+
| `DEVFLOW_PROJECT_ROOT` | `cwd` | Project root directory |
|
|
56
|
+
|
|
57
|
+
## License
|
|
58
|
+
|
|
59
|
+
MIT
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"commands": {
|
|
4
|
+
"devflow:context": {
|
|
5
|
+
"mcpTools": [
|
|
6
|
+
"get_project_context",
|
|
7
|
+
"search_symbol"
|
|
8
|
+
],
|
|
9
|
+
"blockedNative": [
|
|
10
|
+
"grep",
|
|
11
|
+
"find",
|
|
12
|
+
"rg",
|
|
13
|
+
"ag",
|
|
14
|
+
"Grep",
|
|
15
|
+
"Glob",
|
|
16
|
+
"Explore",
|
|
17
|
+
"WebSearch",
|
|
18
|
+
"WebFetch"
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
"devflow:graph": {
|
|
22
|
+
"mcpTools": [
|
|
23
|
+
"get_dependency_graph"
|
|
24
|
+
],
|
|
25
|
+
"blockedNative": [
|
|
26
|
+
"grep",
|
|
27
|
+
"find",
|
|
28
|
+
"rg",
|
|
29
|
+
"ag",
|
|
30
|
+
"Grep",
|
|
31
|
+
"Glob",
|
|
32
|
+
"Explore"
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
"devflow:knowledge": {
|
|
36
|
+
"mcpTools": [
|
|
37
|
+
"get_knowledge"
|
|
38
|
+
],
|
|
39
|
+
"blockedNative": [
|
|
40
|
+
"WebSearch",
|
|
41
|
+
"WebFetch"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
"devflow:memory": {
|
|
45
|
+
"mcpTools": [
|
|
46
|
+
"get_memory"
|
|
47
|
+
],
|
|
48
|
+
"blockedNative": [
|
|
49
|
+
"grep",
|
|
50
|
+
"find",
|
|
51
|
+
"rg",
|
|
52
|
+
"ag",
|
|
53
|
+
"Grep",
|
|
54
|
+
"Glob",
|
|
55
|
+
"Explore"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
"devflow:workflow": {
|
|
59
|
+
"mcpTools": [
|
|
60
|
+
"run_workflow"
|
|
61
|
+
],
|
|
62
|
+
"blockedNative": []
|
|
63
|
+
},
|
|
64
|
+
"devflow:react": {
|
|
65
|
+
"mcpTools": [
|
|
66
|
+
"react_diagnose_bug",
|
|
67
|
+
"react_new_feature",
|
|
68
|
+
"react_audit_performance",
|
|
69
|
+
"react_review_hooks",
|
|
70
|
+
"react_refactor_component",
|
|
71
|
+
"react_new_component"
|
|
72
|
+
],
|
|
73
|
+
"blockedNative": [
|
|
74
|
+
"grep",
|
|
75
|
+
"find",
|
|
76
|
+
"rg",
|
|
77
|
+
"ag",
|
|
78
|
+
"Grep",
|
|
79
|
+
"Glob",
|
|
80
|
+
"Explore",
|
|
81
|
+
"WebSearch",
|
|
82
|
+
"WebFetch"
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
"devflow:vue": {
|
|
86
|
+
"mcpTools": [
|
|
87
|
+
"vue_diagnose_bug",
|
|
88
|
+
"vue_new_component",
|
|
89
|
+
"vue_debug_reactivity"
|
|
90
|
+
],
|
|
91
|
+
"blockedNative": [
|
|
92
|
+
"grep",
|
|
93
|
+
"find",
|
|
94
|
+
"rg",
|
|
95
|
+
"ag",
|
|
96
|
+
"Grep",
|
|
97
|
+
"Glob",
|
|
98
|
+
"Explore",
|
|
99
|
+
"WebSearch",
|
|
100
|
+
"WebFetch"
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
"devflow:tailwind": {
|
|
104
|
+
"mcpTools": [
|
|
105
|
+
"tailwind_new_component"
|
|
106
|
+
],
|
|
107
|
+
"blockedNative": [
|
|
108
|
+
"grep",
|
|
109
|
+
"find",
|
|
110
|
+
"rg",
|
|
111
|
+
"ag",
|
|
112
|
+
"Grep",
|
|
113
|
+
"Glob",
|
|
114
|
+
"Explore",
|
|
115
|
+
"WebSearch",
|
|
116
|
+
"WebFetch"
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
"devflow:taro": {
|
|
120
|
+
"mcpTools": [
|
|
121
|
+
"taro_new_page"
|
|
122
|
+
],
|
|
123
|
+
"blockedNative": [
|
|
124
|
+
"grep",
|
|
125
|
+
"find",
|
|
126
|
+
"rg",
|
|
127
|
+
"ag",
|
|
128
|
+
"Grep",
|
|
129
|
+
"Glob",
|
|
130
|
+
"Explore",
|
|
131
|
+
"WebSearch",
|
|
132
|
+
"WebFetch"
|
|
133
|
+
]
|
|
134
|
+
},
|
|
135
|
+
"devflow:nest": {
|
|
136
|
+
"mcpTools": [
|
|
137
|
+
"nest_new_module",
|
|
138
|
+
"nest_diagnose_bug"
|
|
139
|
+
],
|
|
140
|
+
"blockedNative": [
|
|
141
|
+
"grep",
|
|
142
|
+
"find",
|
|
143
|
+
"rg",
|
|
144
|
+
"ag",
|
|
145
|
+
"Grep",
|
|
146
|
+
"Glob",
|
|
147
|
+
"Explore",
|
|
148
|
+
"WebSearch",
|
|
149
|
+
"WebFetch"
|
|
150
|
+
]
|
|
151
|
+
},
|
|
152
|
+
"devflow:graphql": {
|
|
153
|
+
"mcpTools": [
|
|
154
|
+
"graphql_new_graphql_type",
|
|
155
|
+
"graphql_diagnose_bug"
|
|
156
|
+
],
|
|
157
|
+
"blockedNative": [
|
|
158
|
+
"grep",
|
|
159
|
+
"find",
|
|
160
|
+
"rg",
|
|
161
|
+
"ag",
|
|
162
|
+
"Grep",
|
|
163
|
+
"Glob",
|
|
164
|
+
"Explore",
|
|
165
|
+
"WebSearch",
|
|
166
|
+
"WebFetch"
|
|
167
|
+
]
|
|
168
|
+
},
|
|
169
|
+
"devflow:docker": {
|
|
170
|
+
"mcpTools": [
|
|
171
|
+
"docker_dockerize_project"
|
|
172
|
+
],
|
|
173
|
+
"blockedNative": [
|
|
174
|
+
"grep",
|
|
175
|
+
"find",
|
|
176
|
+
"rg",
|
|
177
|
+
"ag",
|
|
178
|
+
"Grep",
|
|
179
|
+
"Glob",
|
|
180
|
+
"Explore",
|
|
181
|
+
"WebSearch",
|
|
182
|
+
"WebFetch"
|
|
183
|
+
]
|
|
184
|
+
},
|
|
185
|
+
"devflow:performance": {
|
|
186
|
+
"mcpTools": [
|
|
187
|
+
"performance_audit_performance"
|
|
188
|
+
],
|
|
189
|
+
"blockedNative": [
|
|
190
|
+
"grep",
|
|
191
|
+
"find",
|
|
192
|
+
"rg",
|
|
193
|
+
"ag",
|
|
194
|
+
"Grep",
|
|
195
|
+
"Glob",
|
|
196
|
+
"Explore",
|
|
197
|
+
"WebSearch",
|
|
198
|
+
"WebFetch"
|
|
199
|
+
]
|
|
200
|
+
},
|
|
201
|
+
"devflow:nextjs": {
|
|
202
|
+
"mcpTools": [
|
|
203
|
+
"nextjs_new_page",
|
|
204
|
+
"nextjs_diagnose_bug"
|
|
205
|
+
],
|
|
206
|
+
"blockedNative": [
|
|
207
|
+
"grep",
|
|
208
|
+
"find",
|
|
209
|
+
"rg",
|
|
210
|
+
"ag",
|
|
211
|
+
"Grep",
|
|
212
|
+
"Glob",
|
|
213
|
+
"Explore",
|
|
214
|
+
"WebSearch",
|
|
215
|
+
"WebFetch"
|
|
216
|
+
]
|
|
217
|
+
},
|
|
218
|
+
"devflow:electron": {
|
|
219
|
+
"mcpTools": [
|
|
220
|
+
"electron_diagnose_bug"
|
|
221
|
+
],
|
|
222
|
+
"blockedNative": [
|
|
223
|
+
"grep",
|
|
224
|
+
"find",
|
|
225
|
+
"rg",
|
|
226
|
+
"ag",
|
|
227
|
+
"Grep",
|
|
228
|
+
"Glob",
|
|
229
|
+
"Explore",
|
|
230
|
+
"WebSearch",
|
|
231
|
+
"WebFetch"
|
|
232
|
+
]
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
@@ -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/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { startServer } from "./server.js";
|
|
3
3
|
async function main() {
|
|
4
|
-
const projectRoot = process.cwd();
|
|
4
|
+
const projectRoot = process.env.DEVFLOW_PROJECT_ROOT || process.cwd();
|
|
5
5
|
await startServer({ mode: "stdio", projectRoot });
|
|
6
6
|
}
|
|
7
7
|
main().catch((err) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtE,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -3,4 +3,6 @@ export interface MCPServerOptions {
|
|
|
3
3
|
projectRoot: string;
|
|
4
4
|
}
|
|
5
5
|
export declare function startServer(options: MCPServerOptions): Promise<void>;
|
|
6
|
+
export declare const KNOWN_PREFIXES: Set<string>;
|
|
7
|
+
export declare function getCommandFromTool(toolName: string): string;
|
|
6
8
|
//# sourceMappingURL=server.d.ts.map
|
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":"AAYA,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,CA4H1E;AAwBD,eAAO,MAAM,cAAc,aAGzB,CAAC;AAEH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiB3D"}
|
package/dist/server.js
CHANGED
|
@@ -3,7 +3,11 @@ 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, createHash } from "node:crypto";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
6
9
|
export async function startServer(options) {
|
|
10
|
+
ensureSessionToken(options.projectRoot);
|
|
7
11
|
const server = new Server({ name: "devflow-mcp", version: "0.1.0" }, { capabilities: { tools: {} } });
|
|
8
12
|
const serverUrl = process.env.DEVFLOW_SERVER_URL ?? "http://127.0.0.1:3100";
|
|
9
13
|
const apiKey = process.env.DEVFLOW_API_KEY ?? "dev-key-000000";
|
|
@@ -21,35 +25,87 @@ export async function startServer(options) {
|
|
|
21
25
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
22
26
|
tools: allTools,
|
|
23
27
|
}));
|
|
28
|
+
// Cache the local engines reference for telemetry recording
|
|
29
|
+
let localEngines = null;
|
|
24
30
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
25
31
|
const { name, arguments: args } = request.params;
|
|
26
32
|
const argObj = (args ?? {});
|
|
33
|
+
const startTime = Date.now();
|
|
27
34
|
try {
|
|
28
35
|
let result;
|
|
29
36
|
if (useRemote) {
|
|
30
37
|
result = await routeToServer(client, name, argObj);
|
|
38
|
+
// Sync receipt even in remote mode
|
|
39
|
+
syncReceiptToHook(options.projectRoot, name);
|
|
31
40
|
}
|
|
32
41
|
else {
|
|
33
|
-
// Dynamic import — only loads CodeGraph
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
// Dynamic import — only loads CodeGraph when first needed
|
|
43
|
+
if (!localEngines) {
|
|
44
|
+
const [{ createEngines }] = await Promise.all([
|
|
45
|
+
import("@devflow-tools/context-engine"),
|
|
46
|
+
]);
|
|
47
|
+
localEngines = await createEngines(options.projectRoot);
|
|
48
|
+
// Register plugin workflow templates with the workflow engine
|
|
49
|
+
for (const plugin of plugins) {
|
|
50
|
+
for (const template of (plugin.workflow?.templates ?? [])) {
|
|
51
|
+
localEngines.workflow.register(template);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
console.error(`[devflow-mcp] Warning: DevFlow server not reachable at ${serverUrl}`);
|
|
55
|
+
console.error("[devflow-mcp] Running in local mode.");
|
|
56
|
+
}
|
|
57
|
+
// L1: Enforcer check before execution
|
|
58
|
+
const { enforce } = await import("./enforcer/index.js");
|
|
59
|
+
const enforcement = await enforce(name, argObj, localEngines.data);
|
|
60
|
+
if (!enforcement.result.allowed) {
|
|
61
|
+
return {
|
|
62
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
63
|
+
_devflow: { v: 1, tool: name, ts: Date.now(), marker: "devflow-mcp-v1" },
|
|
64
|
+
error: enforcement.result.message,
|
|
65
|
+
rule: enforcement.result.rule?.id,
|
|
66
|
+
}) }],
|
|
67
|
+
isError: true,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const { createToolHandlers, createPluginHandlers } = await import("./tools.js");
|
|
71
|
+
const handlers = createToolHandlers(localEngines);
|
|
72
|
+
const pHnd = createPluginHandlers(localEngines, plugins);
|
|
44
73
|
const allHandlers = { ...handlers, ...pHnd };
|
|
45
74
|
const handler = allHandlers[name];
|
|
46
75
|
if (!handler)
|
|
47
76
|
throw new Error(`Unknown tool: ${name}`);
|
|
48
77
|
result = await handler(argObj);
|
|
78
|
+
// Sync receipt to hook receipt file (bridges MCP → PreToolUse hook)
|
|
79
|
+
syncReceiptToHook(options.projectRoot, name);
|
|
80
|
+
// Layer 4: Record tool call in local telemetry
|
|
81
|
+
const durationMs = Date.now() - startTime;
|
|
82
|
+
try {
|
|
83
|
+
await localEngines.data.recordToolCall(name, argObj, durationMs);
|
|
84
|
+
}
|
|
85
|
+
catch { }
|
|
86
|
+
// Attach receipt and warning to result
|
|
87
|
+
if (enforcement.receipt) {
|
|
88
|
+
result = { ...result, _receipt: enforcement.receipt };
|
|
89
|
+
}
|
|
90
|
+
if (enforcement.result.warning) {
|
|
91
|
+
result = { ...result, _warning: enforcement.result.warning };
|
|
92
|
+
}
|
|
49
93
|
}
|
|
50
|
-
|
|
94
|
+
// Layer 3: Append _devflow response marker to prove MCP tool was used
|
|
95
|
+
const marked = wrapWithDevflowMarker(name, result);
|
|
96
|
+
return { content: [{ type: "text", text: JSON.stringify(marked, null, 2) }] };
|
|
51
97
|
}
|
|
52
98
|
catch (err) {
|
|
99
|
+
// Layer 4: Record failed tool call
|
|
100
|
+
const durationMs = Date.now() - startTime;
|
|
101
|
+
if (!useRemote && localEngines) {
|
|
102
|
+
try {
|
|
103
|
+
await localEngines.data.recordToolCall(name, argObj, durationMs, err.message);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Telemetry recording failure must not break error reporting
|
|
107
|
+
}
|
|
108
|
+
}
|
|
53
109
|
return {
|
|
54
110
|
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
55
111
|
isError: true,
|
|
@@ -59,6 +115,90 @@ export async function startServer(options) {
|
|
|
59
115
|
const transport = new StdioServerTransport();
|
|
60
116
|
await server.connect(transport);
|
|
61
117
|
}
|
|
118
|
+
function ensureSessionToken(projectRoot) {
|
|
119
|
+
if (process.env.DEVFLOW_SESSION_TOKEN)
|
|
120
|
+
return;
|
|
121
|
+
const header = Buffer.from(JSON.stringify({ alg: "HS256", typ: "JWT" })).toString("base64url");
|
|
122
|
+
const now = Math.floor(Date.now() / 1000);
|
|
123
|
+
const payload = {
|
|
124
|
+
sub: `devflow-mcp-${Date.now().toString(36)}`,
|
|
125
|
+
project: projectRoot.split("/").pop() ?? "unknown",
|
|
126
|
+
iat: now,
|
|
127
|
+
exp: now + 86400,
|
|
128
|
+
scope: ["context", "knowledge", "memory", "workflow", "graph"],
|
|
129
|
+
};
|
|
130
|
+
const payloadB64 = Buffer.from(JSON.stringify(payload)).toString("base64url");
|
|
131
|
+
const secret = "devflow-local-mcp-secret-v1";
|
|
132
|
+
const signature = createHmac("sha256", secret)
|
|
133
|
+
.update(`${header}.${payloadB64}`)
|
|
134
|
+
.digest("base64url");
|
|
135
|
+
process.env.DEVFLOW_SESSION_TOKEN = `${header}.${payloadB64}.${signature}`;
|
|
136
|
+
console.error("[devflow-mcp] Auto-generated session token (no env token provided).");
|
|
137
|
+
}
|
|
138
|
+
export const KNOWN_PREFIXES = new Set([
|
|
139
|
+
"react", "vue", "nest", "nextjs", "graphql",
|
|
140
|
+
"docker", "tailwind", "taro", "electron", "performance",
|
|
141
|
+
]);
|
|
142
|
+
export function getCommandFromTool(toolName) {
|
|
143
|
+
const core = {
|
|
144
|
+
get_project_context: "context",
|
|
145
|
+
search_symbol: "context",
|
|
146
|
+
get_dependency_graph: "graph",
|
|
147
|
+
get_knowledge: "knowledge",
|
|
148
|
+
get_memory: "memory",
|
|
149
|
+
run_workflow: "workflow",
|
|
150
|
+
};
|
|
151
|
+
if (core[toolName])
|
|
152
|
+
return `devflow:${core[toolName]}`;
|
|
153
|
+
const prefix = toolName.split("_")[0];
|
|
154
|
+
if (KNOWN_PREFIXES.has(prefix)) {
|
|
155
|
+
return `devflow:${prefix}`;
|
|
156
|
+
}
|
|
157
|
+
return "";
|
|
158
|
+
}
|
|
159
|
+
function syncReceiptToHook(projectRoot, toolName) {
|
|
160
|
+
try {
|
|
161
|
+
const tmpDir = process.env.TMPDIR || "/tmp";
|
|
162
|
+
const receiptDir = join(tmpDir, ".devflow-receipts");
|
|
163
|
+
const sessionId = createHash("sha256").update(projectRoot).digest("hex").slice(0, 16);
|
|
164
|
+
const receiptFile = join(receiptDir, `${sessionId}.json`);
|
|
165
|
+
if (!existsSync(receiptDir)) {
|
|
166
|
+
mkdirSync(receiptDir, { recursive: true });
|
|
167
|
+
}
|
|
168
|
+
let data = {};
|
|
169
|
+
if (existsSync(receiptFile)) {
|
|
170
|
+
try {
|
|
171
|
+
data = JSON.parse(readFileSync(receiptFile, "utf-8"));
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// Corrupt file, start fresh
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
data.lastMcpCall = Date.now();
|
|
178
|
+
data.bypassCount = 0;
|
|
179
|
+
const cmd = getCommandFromTool(toolName);
|
|
180
|
+
if (cmd)
|
|
181
|
+
data.activeCommand = cmd;
|
|
182
|
+
writeFileSync(receiptFile, JSON.stringify(data));
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Receipt sync failure must not break tool execution
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function wrapWithDevflowMarker(toolName, result) {
|
|
189
|
+
const marker = {
|
|
190
|
+
_devflow: {
|
|
191
|
+
v: 1,
|
|
192
|
+
tool: toolName,
|
|
193
|
+
ts: Date.now(),
|
|
194
|
+
marker: "devflow-mcp-v1",
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
if (result && typeof result === "object" && !Array.isArray(result)) {
|
|
198
|
+
return { ...result, ...marker };
|
|
199
|
+
}
|
|
200
|
+
return { result, ...marker };
|
|
201
|
+
}
|
|
62
202
|
async function routeToServer(client, toolName, args) {
|
|
63
203
|
switch (toolName) {
|
|
64
204
|
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,
|
|
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,CA0GxC;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,CA2HnE;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
|
@@ -8,6 +8,7 @@ export function getCoreTools() {
|
|
|
8
8
|
properties: {
|
|
9
9
|
query: { type: "string", description: "自然语言查询" },
|
|
10
10
|
mode: { type: "string", enum: ["fast", "deep"], default: "fast" },
|
|
11
|
+
expandedTerms: { type: "string", description: "Agent 预翻译的英文关键词(空格分隔),用于提升中文查询的搜索效果" },
|
|
11
12
|
},
|
|
12
13
|
required: ["query"],
|
|
13
14
|
},
|
|
@@ -106,33 +107,79 @@ export function getCoreTools() {
|
|
|
106
107
|
}
|
|
107
108
|
export function createToolHandlers(engines) {
|
|
108
109
|
return {
|
|
109
|
-
get_project_context: async ({ query, mode }) => {
|
|
110
|
-
|
|
110
|
+
get_project_context: async ({ query, mode, expandedTerms }) => {
|
|
111
|
+
const result = await engines.context.build({
|
|
111
112
|
query: query,
|
|
112
113
|
mode: mode ?? "fast",
|
|
114
|
+
expandedTerms: expandedTerms,
|
|
113
115
|
});
|
|
116
|
+
return {
|
|
117
|
+
...result,
|
|
118
|
+
_devflow_unique: {
|
|
119
|
+
search_method: "bm25_semantic",
|
|
120
|
+
confidence_scored: true,
|
|
121
|
+
memory_injected: true,
|
|
122
|
+
token_estimated: true,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
114
125
|
},
|
|
115
126
|
search_symbol: async ({ symbol }) => {
|
|
116
|
-
|
|
127
|
+
const result = await engines.indexer.findSymbol(symbol);
|
|
128
|
+
return {
|
|
129
|
+
...result,
|
|
130
|
+
_devflow_unique: {
|
|
131
|
+
index_backed: true,
|
|
132
|
+
kind_annotated: true,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
117
135
|
},
|
|
118
136
|
get_dependency_graph: async ({ target, depth }) => {
|
|
119
137
|
const t = target ?? "all";
|
|
120
138
|
const d = depth ?? 2;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
139
|
+
const result = t === "all" ? engines.graph.export() : engines.graph.getSubGraph(t, d);
|
|
140
|
+
return {
|
|
141
|
+
...result,
|
|
142
|
+
_devflow_unique: {
|
|
143
|
+
layer_annotated: true,
|
|
144
|
+
architecture_grouped: true,
|
|
145
|
+
query_depth: d,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
125
148
|
},
|
|
126
149
|
run_workflow: async ({ type, input }) => {
|
|
127
|
-
|
|
150
|
+
const result = await engines.workflow.run(type, { input });
|
|
151
|
+
return {
|
|
152
|
+
...result,
|
|
153
|
+
_devflow_unique: {
|
|
154
|
+
dag_orchestrated: true,
|
|
155
|
+
step_tracked: true,
|
|
156
|
+
workflow_type: type,
|
|
157
|
+
},
|
|
158
|
+
};
|
|
128
159
|
},
|
|
129
160
|
get_memory: async () => {
|
|
130
|
-
|
|
161
|
+
const result = await engines.memory.getAll();
|
|
162
|
+
return {
|
|
163
|
+
...result,
|
|
164
|
+
_devflow_unique: {
|
|
165
|
+
memory_version: 1,
|
|
166
|
+
structured_storage: true,
|
|
167
|
+
project_context_included: true,
|
|
168
|
+
},
|
|
169
|
+
};
|
|
131
170
|
},
|
|
132
171
|
get_knowledge: async ({ query, scope }) => {
|
|
133
|
-
|
|
172
|
+
const result = await engines.knowledge.search(query, {
|
|
134
173
|
sources: scope === "all" ? undefined : [scope],
|
|
135
174
|
});
|
|
175
|
+
return {
|
|
176
|
+
...result,
|
|
177
|
+
_devflow_unique: {
|
|
178
|
+
source_versioned: true,
|
|
179
|
+
code_examples_included: true,
|
|
180
|
+
search_scope: scope,
|
|
181
|
+
},
|
|
182
|
+
};
|
|
136
183
|
},
|
|
137
184
|
devflow_report_event: async (args) => {
|
|
138
185
|
const truncate = (s, max) => {
|
|
@@ -213,7 +260,16 @@ export function createPluginHandlers(engines, plugins) {
|
|
|
213
260
|
continue;
|
|
214
261
|
const toolName = `${prefix}_${mcpTrigger.tool}`;
|
|
215
262
|
handlers[toolName] = async (args) => {
|
|
216
|
-
|
|
263
|
+
const result = await engines.workflow.run(template.name, args);
|
|
264
|
+
return {
|
|
265
|
+
...result,
|
|
266
|
+
_devflow_unique: {
|
|
267
|
+
dag_orchestrated: true,
|
|
268
|
+
step_tracked: true,
|
|
269
|
+
plugin_name: prefix,
|
|
270
|
+
template_name: template.name,
|
|
271
|
+
},
|
|
272
|
+
};
|
|
217
273
|
};
|
|
218
274
|
}
|
|
219
275
|
}
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -8,17 +8,18 @@
|
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
10
|
"build": "tsc -b",
|
|
11
|
+
"postbuild": "NODE_OPTIONS='--experimental-sqlite' npx tsx scripts/generate-registry.ts",
|
|
11
12
|
"test": "cgnode ../../node_modules/.bin/vitest run",
|
|
12
13
|
"typecheck": "tsc --noEmit",
|
|
13
14
|
"clean": "rm -rf dist"
|
|
14
15
|
},
|
|
15
16
|
"dependencies": {
|
|
16
|
-
"@devflow-tools/context-engine": "^0.
|
|
17
|
-
"@devflow-tools/knowledge-engine": "^0.
|
|
18
|
-
"@devflow-tools/memory-engine": "^0.
|
|
19
|
-
"@devflow-tools/sdk": "^0.
|
|
20
|
-
"@devflow-tools/telemetry": "^0.
|
|
21
|
-
"@devflow-tools/workflow-engine": "^0.
|
|
17
|
+
"@devflow-tools/context-engine": "^0.4.0",
|
|
18
|
+
"@devflow-tools/knowledge-engine": "^0.4.0",
|
|
19
|
+
"@devflow-tools/memory-engine": "^0.4.0",
|
|
20
|
+
"@devflow-tools/sdk": "^0.4.0",
|
|
21
|
+
"@devflow-tools/telemetry": "^0.4.0",
|
|
22
|
+
"@devflow-tools/workflow-engine": "^0.4.0",
|
|
22
23
|
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
@@ -29,5 +30,5 @@
|
|
|
29
30
|
"dist",
|
|
30
31
|
"bin"
|
|
31
32
|
],
|
|
32
|
-
"gitHead": "
|
|
33
|
+
"gitHead": "c76bcf3a2bb8ac12b871738d6661979eb45090c6"
|
|
33
34
|
}
|