truss-code-review-mcp 1.0.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/FUNDING.yml +1 -0
- package/.github/workflows/mcp-registry-publish.yml +21 -0
- package/.mcpize/project.json +4 -0
- package/README.md +46 -0
- package/agent-card.json +89 -0
- package/dist/index.js +8 -24
- package/dist/index.js.map +1 -1
- package/dist/lib/billing.d.ts +7 -0
- package/dist/lib/billing.d.ts.map +1 -0
- package/dist/lib/billing.js +31 -0
- package/dist/lib/billing.js.map +1 -0
- package/dist/lib/license.d.ts +4 -0
- package/dist/lib/license.d.ts.map +1 -1
- package/dist/lib/license.js +5 -5
- package/dist/lib/license.js.map +1 -1
- package/dist/tools/check-complexity.d.ts.map +1 -1
- package/dist/tools/check-complexity.js +3 -1
- package/dist/tools/check-complexity.js.map +1 -1
- package/dist/tools/deep-review.d.ts.map +1 -1
- package/dist/tools/deep-review.js +3 -1
- package/dist/tools/deep-review.js.map +1 -1
- package/dist/tools/detect-antipatterns.d.ts.map +1 -1
- package/dist/tools/detect-antipatterns.js +3 -1
- package/dist/tools/detect-antipatterns.js.map +1 -1
- package/dist/tools/explain-code.d.ts.map +1 -1
- package/dist/tools/explain-code.js +3 -1
- package/dist/tools/explain-code.js.map +1 -1
- package/dist/tools/optimize-code.d.ts.map +1 -1
- package/dist/tools/optimize-code.js +3 -1
- package/dist/tools/optimize-code.js.map +1 -1
- package/dist/tools/review-diff.d.ts.map +1 -1
- package/dist/tools/review-diff.js +3 -1
- package/dist/tools/review-diff.js.map +1 -1
- package/dist/tools/security-review.d.ts.map +1 -1
- package/dist/tools/security-review.js +3 -1
- package/dist/tools/security-review.js.map +1 -1
- package/dist/tools/suggest-tests.d.ts.map +1 -1
- package/dist/tools/suggest-tests.js +3 -1
- package/dist/tools/suggest-tests.js.map +1 -1
- package/package.json +13 -3
- package/server.json +20 -0
- package/src/index.ts +8 -24
- package/src/lib/billing.ts +34 -0
- package/src/lib/license.ts +5 -7
- package/src/tools/check-complexity.ts +3 -1
- package/src/tools/deep-review.ts +3 -1
- package/src/tools/detect-antipatterns.ts +3 -1
- package/src/tools/explain-code.ts +3 -1
- package/src/tools/optimize-code.ts +3 -1
- package/src/tools/review-diff.ts +3 -1
- package/src/tools/security-review.ts +3 -1
- package/src/tools/suggest-tests.ts +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
custom: ["https://claw-factory.github.io/truss-site"]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: Publish to MCP Registry
|
|
2
|
+
on:
|
|
3
|
+
workflow_dispatch:
|
|
4
|
+
|
|
5
|
+
permissions:
|
|
6
|
+
id-token: write
|
|
7
|
+
contents: read
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
publish:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- name: Install mcp-publisher
|
|
15
|
+
run: npm install -g mcp-publisher
|
|
16
|
+
- name: Login via OIDC
|
|
17
|
+
run: mcp-publisher login github-oidc
|
|
18
|
+
- name: Validate
|
|
19
|
+
run: mcp-publisher validate server.json
|
|
20
|
+
- name: Publish
|
|
21
|
+
run: mcp-publisher publish server.json
|
package/README.md
CHANGED
|
@@ -1,9 +1,37 @@
|
|
|
1
1
|
# TRUSS Code Review MCP Server
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/truss-code-review-mcp)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
3
6
|
AI-powered code review tools for Claude Code. Automated complexity analysis, anti-pattern detection, security review, and optimization — directly in your editor.
|
|
4
7
|
|
|
5
8
|
## Quick Start
|
|
6
9
|
|
|
10
|
+
Run with npx (no install needed):
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npx -y truss-code-review-mcp
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### Claude Desktop / Claude Code
|
|
17
|
+
|
|
18
|
+
Add to your `claude_desktop_config.json` or `.claude/settings.json`:
|
|
19
|
+
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"mcpServers": {
|
|
23
|
+
"code-review": {
|
|
24
|
+
"command": "npx",
|
|
25
|
+
"args": ["-y", "truss-code-review-mcp"]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Cursor
|
|
32
|
+
|
|
33
|
+
Add to your Cursor MCP settings:
|
|
34
|
+
|
|
7
35
|
```json
|
|
8
36
|
{
|
|
9
37
|
"mcpServers": {
|
|
@@ -15,6 +43,8 @@ AI-powered code review tools for Claude Code. Automated complexity analysis, ant
|
|
|
15
43
|
}
|
|
16
44
|
```
|
|
17
45
|
|
|
46
|
+
---
|
|
47
|
+
|
|
18
48
|
## Tools
|
|
19
49
|
|
|
20
50
|
### Free Tier (no key needed)
|
|
@@ -58,3 +88,19 @@ export ANTHROPIC_API_KEY="sk-ant-..." # or OPENAI_API_KEY
|
|
|
58
88
|
## License
|
|
59
89
|
|
|
60
90
|
MIT
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## A2A Discovery
|
|
96
|
+
|
|
97
|
+
This server publishes a [Google A2A Protocol](https://a2a-protocol.org) Agent Card, making it discoverable by any A2A-compatible agent framework (LangGraph, CrewAI, Google ADK, AutoGen, and others).
|
|
98
|
+
|
|
99
|
+
**Agent Card:** [`agent-card.json`](./agent-card.json)
|
|
100
|
+
|
|
101
|
+
The agent card describes this server's skills, capabilities, input/output modalities, and authentication requirements in a machine-readable format. A2A clients can use it to discover and invoke tools automatically without manual configuration.
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Fetch the agent card
|
|
105
|
+
curl https://raw.githubusercontent.com/claw-factory/truss-code-review-mcp/main/agent-card.json
|
|
106
|
+
```
|
package/agent-card.json
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "TRUSS Code Review MCP — Automated Code Analysis",
|
|
3
|
+
"description": "AI-powered code review tools for Claude Code and MCP-compatible agents. Automated complexity analysis, anti-pattern detection, diff review, security scanning, and optimization suggestions — directly in your editor.",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"documentationUrl": "https://github.com/claw-factory/truss-code-review-mcp#readme",
|
|
6
|
+
"provider": {
|
|
7
|
+
"organization": "TRUSS / claw-factory",
|
|
8
|
+
"url": "https://claw-factory.github.io/truss-site"
|
|
9
|
+
},
|
|
10
|
+
"supportedInterfaces": [
|
|
11
|
+
{
|
|
12
|
+
"url": "https://claw-factory.github.io/truss-site/a2a/v1",
|
|
13
|
+
"protocolBinding": "HTTP+JSON",
|
|
14
|
+
"protocolVersion": "1.0"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"capabilities": {
|
|
18
|
+
"streaming": false,
|
|
19
|
+
"pushNotifications": false,
|
|
20
|
+
"stateTransitionHistory": false,
|
|
21
|
+
"extendedAgentCard": false
|
|
22
|
+
},
|
|
23
|
+
"securitySchemes": {
|
|
24
|
+
"bearer": {
|
|
25
|
+
"type": "http",
|
|
26
|
+
"scheme": "bearer",
|
|
27
|
+
"description": "TRUSS license key (optional — basic analysis available without authentication)"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"security": [],
|
|
31
|
+
"defaultInputModes": ["text/plain", "application/json"],
|
|
32
|
+
"defaultOutputModes": ["application/json"],
|
|
33
|
+
"pricing": {
|
|
34
|
+
"free": true,
|
|
35
|
+
"paid": {
|
|
36
|
+
"amount": 25,
|
|
37
|
+
"currency": "USD",
|
|
38
|
+
"interval": "month",
|
|
39
|
+
"url": "https://claw-factory.github.io/truss-site"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"skills": [
|
|
43
|
+
{
|
|
44
|
+
"id": "review_diff",
|
|
45
|
+
"name": "Diff Analysis",
|
|
46
|
+
"description": "Analyze a git diff or patch for logic errors, bugs, and code quality issues",
|
|
47
|
+
"tags": ["code-review", "diff", "git", "quality"],
|
|
48
|
+
"examples": ["Review this pull request diff for logic errors and security issues"],
|
|
49
|
+
"inputModes": ["text/plain"],
|
|
50
|
+
"outputModes": ["application/json"]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "review_complexity",
|
|
54
|
+
"name": "Complexity Metrics",
|
|
55
|
+
"description": "Calculate cyclomatic complexity, cognitive complexity, and maintainability index for code",
|
|
56
|
+
"tags": ["code-review", "complexity", "metrics", "quality"],
|
|
57
|
+
"examples": ["Calculate complexity metrics for this function"],
|
|
58
|
+
"inputModes": ["text/plain"],
|
|
59
|
+
"outputModes": ["application/json"]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "review_antipatterns",
|
|
63
|
+
"name": "Anti-Pattern Detection",
|
|
64
|
+
"description": "Detect language-specific anti-patterns, code smells, and bad practices across JS/TS, Python, Go, and Rust",
|
|
65
|
+
"tags": ["code-review", "anti-patterns", "best-practices"],
|
|
66
|
+
"examples": ["Scan this Go code for anti-patterns like ignored errors or goroutine leaks"],
|
|
67
|
+
"inputModes": ["text/plain"],
|
|
68
|
+
"outputModes": ["application/json"]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "review_security",
|
|
72
|
+
"name": "Security Review",
|
|
73
|
+
"description": "Identify security vulnerabilities including injection, XSS, secrets, weak crypto, and SSRF",
|
|
74
|
+
"tags": ["code-review", "security", "vulnerabilities"],
|
|
75
|
+
"examples": ["Perform a security review of this Express.js route handler"],
|
|
76
|
+
"inputModes": ["text/plain"],
|
|
77
|
+
"outputModes": ["application/json"]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "review_optimize",
|
|
81
|
+
"name": "Optimization Suggestions",
|
|
82
|
+
"description": "Suggest performance improvements, algorithmic optimizations, and resource usage reductions",
|
|
83
|
+
"tags": ["code-review", "performance", "optimization"],
|
|
84
|
+
"examples": ["Suggest optimizations for this database query loop"],
|
|
85
|
+
"inputModes": ["text/plain"],
|
|
86
|
+
"outputModes": ["application/json"]
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -1,61 +1,45 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
//
|
|
4
|
+
// Rule-based tools
|
|
5
5
|
import { registerReviewDiff } from './tools/review-diff.js';
|
|
6
6
|
import { registerCheckComplexity } from './tools/check-complexity.js';
|
|
7
7
|
import { registerDetectAntipatterns } from './tools/detect-antipatterns.js';
|
|
8
|
-
//
|
|
8
|
+
// AI-powered tools
|
|
9
9
|
import { registerDeepReview } from './tools/deep-review.js';
|
|
10
10
|
import { registerSuggestTests } from './tools/suggest-tests.js';
|
|
11
11
|
import { registerExplainCode } from './tools/explain-code.js';
|
|
12
12
|
import { registerSecurityReview } from './tools/security-review.js';
|
|
13
13
|
import { registerOptimizeCode } from './tools/optimize-code.js';
|
|
14
14
|
// Helpers
|
|
15
|
-
import {
|
|
15
|
+
import { hasAiKey } from './lib/license.js';
|
|
16
16
|
const server = new McpServer({
|
|
17
17
|
name: '@truss-dev/code-review-mcp',
|
|
18
18
|
version: '1.0.0',
|
|
19
19
|
});
|
|
20
20
|
// ── Status Tool ─────────────────────────────────────────────────────
|
|
21
|
-
server.tool('check_review_status', '
|
|
22
|
-
const license = await getLicenseStatus();
|
|
21
|
+
server.tool('check_review_status', 'Returns current license tier (free/pro), validity, expiration, and whether an AI API key (ANTHROPIC_API_KEY or OPENAI_API_KEY) is configured. Lists all available tools grouped by tier. Use to verify configuration before calling pro or AI-dependent tools.', {}, async () => {
|
|
23
22
|
const aiKeyPresent = hasAiKey();
|
|
24
23
|
return {
|
|
25
24
|
content: [
|
|
26
25
|
{
|
|
27
26
|
type: 'text',
|
|
28
27
|
text: JSON.stringify({
|
|
29
|
-
|
|
30
|
-
tier: license.tier,
|
|
31
|
-
valid: license.valid,
|
|
32
|
-
expires_at: license.expiresAt,
|
|
33
|
-
},
|
|
28
|
+
server: 'truss-code-review-mcp',
|
|
34
29
|
ai_key_configured: aiKeyPresent,
|
|
35
|
-
|
|
30
|
+
tools: [
|
|
36
31
|
'review_diff — Rule-based diff analysis',
|
|
37
32
|
'check_complexity — Cyclomatic complexity calculator',
|
|
38
33
|
'detect_antipatterns — Language-specific anti-pattern detection',
|
|
39
|
-
],
|
|
40
|
-
pro_tools: [
|
|
41
34
|
'deep_review — AI-powered comprehensive review',
|
|
42
35
|
'suggest_tests — Generate test cases',
|
|
43
36
|
'explain_code — Generate documentation',
|
|
44
37
|
'security_review — OWASP security analysis',
|
|
45
38
|
'optimize_code — Performance optimization',
|
|
46
39
|
],
|
|
47
|
-
...(
|
|
48
|
-
? {
|
|
49
|
-
upgrade_info: {
|
|
50
|
-
url: 'https://truss.dev/pricing',
|
|
51
|
-
price: '$25/mo',
|
|
52
|
-
note: 'Set TRUSS_LICENSE_KEY + your own ANTHROPIC_API_KEY or OPENAI_API_KEY',
|
|
53
|
-
},
|
|
54
|
-
}
|
|
55
|
-
: {}),
|
|
56
|
-
...(!aiKeyPresent && license.tier === 'pro'
|
|
40
|
+
...(!aiKeyPresent
|
|
57
41
|
? {
|
|
58
|
-
|
|
42
|
+
note: 'Set ANTHROPIC_API_KEY or OPENAI_API_KEY to enable AI-powered tools (deep_review, suggest_tests, explain_code, security_review, optimize_code).',
|
|
59
43
|
}
|
|
60
44
|
: {}),
|
|
61
45
|
}, null, 2),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAGjF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAGjF,mBAAmB;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAE5E,mBAAmB;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,UAAU;AACV,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,4BAA4B;IAClC,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,uEAAuE;AAEvE,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,gQAAgQ,EAChQ,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,YAAY,GAAG,QAAQ,EAAE,CAAC;IAEhC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,MAAM,EAAE,uBAAuB;oBAC/B,iBAAiB,EAAE,YAAY;oBAC/B,KAAK,EAAE;wBACL,wCAAwC;wBACxC,qDAAqD;wBACrD,gEAAgE;wBAChE,+CAA+C;wBAC/C,qCAAqC;wBACrC,uCAAuC;wBACvC,2CAA2C;wBAC3C,0CAA0C;qBAC3C;oBACD,GAAG,CAAC,CAAC,YAAY;wBACf,CAAC,CAAC;4BACE,IAAI,EAAE,gJAAgJ;yBACvJ;wBACH,CAAC,CAAC,EAAE,CAAC;iBACR,EAAE,IAAI,EAAE,CAAC,CAAC;aACZ;SACF;KACF,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,uEAAuE;AAEvE,YAAY;AACZ,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AAEnC,WAAW;AACX,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAE7B,uEAAuE;AAEvE,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record a tool call for usage-based billing via Stripe Billing Meters.
|
|
3
|
+
* Non-blocking — failures are logged but do not interrupt the tool call.
|
|
4
|
+
* Requires STRIPE_SECRET_KEY and STRIPE_CUSTOMER_ID env vars.
|
|
5
|
+
*/
|
|
6
|
+
export declare function recordToolCall(toolName: string): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=billing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/lib/billing.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import Stripe from 'stripe';
|
|
2
|
+
const stripeKey = process.env.STRIPE_SECRET_KEY;
|
|
3
|
+
const customerId = process.env.STRIPE_CUSTOMER_ID;
|
|
4
|
+
let stripe = null;
|
|
5
|
+
if (stripeKey) {
|
|
6
|
+
stripe = new Stripe(stripeKey);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Record a tool call for usage-based billing via Stripe Billing Meters.
|
|
10
|
+
* Non-blocking — failures are logged but do not interrupt the tool call.
|
|
11
|
+
* Requires STRIPE_SECRET_KEY and STRIPE_CUSTOMER_ID env vars.
|
|
12
|
+
*/
|
|
13
|
+
export async function recordToolCall(toolName) {
|
|
14
|
+
if (!stripe || !customerId)
|
|
15
|
+
return;
|
|
16
|
+
try {
|
|
17
|
+
await stripe.billing.meterEvents.create({
|
|
18
|
+
event_name: 'mcp_tool_call',
|
|
19
|
+
payload: {
|
|
20
|
+
stripe_customer_id: customerId,
|
|
21
|
+
value: '1',
|
|
22
|
+
},
|
|
23
|
+
identifier: `${customerId}_${toolName}_${Date.now()}`,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
// Non-blocking — log and continue
|
|
28
|
+
console.error(`[billing] meter event failed for ${toolName}:`, err.message);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=billing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/lib/billing.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAChD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAElD,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,IAAI,SAAS,EAAE,CAAC;IACd,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;QAAE,OAAO;IAEnC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;YACtC,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE;gBACP,kBAAkB,EAAE,UAAU;gBAC9B,KAAK,EAAE,GAAG;aACX;YACD,UAAU,EAAE,GAAG,UAAU,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;SACtD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,kCAAkC;QAClC,OAAO,CAAC,KAAK,CAAC,oCAAoC,QAAQ,GAAG,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IACzF,CAAC;AACH,CAAC"}
|
package/dist/lib/license.d.ts
CHANGED
|
@@ -9,6 +9,10 @@ export interface LicenseStatus {
|
|
|
9
9
|
expiresAt: string | null;
|
|
10
10
|
}
|
|
11
11
|
export declare function getLicenseStatus(): Promise<LicenseStatus>;
|
|
12
|
+
/**
|
|
13
|
+
* No-op. All tools are available in the free tier.
|
|
14
|
+
* Retained for API compatibility.
|
|
15
|
+
*/
|
|
12
16
|
export declare function requirePro(): Promise<void>;
|
|
13
17
|
export declare function hasAiKey(): boolean;
|
|
14
18
|
export declare function requireAiKey(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/lib/license.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAqCD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAyB/D;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/lib/license.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAqCD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAyB/D;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhD;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAMnC"}
|
package/dist/lib/license.js
CHANGED
|
@@ -54,12 +54,12 @@ export async function getLicenseStatus() {
|
|
|
54
54
|
cachedStatus = { key, status, timestamp: Date.now() };
|
|
55
55
|
return status;
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* No-op. All tools are available in the free tier.
|
|
59
|
+
* Retained for API compatibility.
|
|
60
|
+
*/
|
|
57
61
|
export async function requirePro() {
|
|
58
|
-
|
|
59
|
-
if (status.tier !== 'pro') {
|
|
60
|
-
throw new Error('This feature requires a TRUSS Pro license ($25/mo). ' +
|
|
61
|
-
'Get yours at https://truss.dev/pricing and set TRUSS_LICENSE_KEY.');
|
|
62
|
-
}
|
|
62
|
+
// All tools are free — no license gate
|
|
63
63
|
}
|
|
64
64
|
export function hasAiKey() {
|
|
65
65
|
return !!(process.env.ANTHROPIC_API_KEY || process.env.OPENAI_API_KEY);
|
package/dist/lib/license.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/lib/license.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,cAAc,GAAG,kCAAkC,CAAC;AAE1D,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,IAAI,YAAY,GAAqE,IAAI,CAAC;AAC1F,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAE9C,KAAK,UAAU,cAAc,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,aAAa,GAAG,EAAE,EAAE;YAChE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,QAAQ,EAAE,kBAAkB;gBAC5B,YAAY,EAAE,6BAA6B;aAC5C;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC3C,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA6C,CAAC;QAC9E,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;SACnC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;QAC5C,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAEhD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IAED,wBAAwB;IACxB,IAAI,YAAY,IAAI,YAAY,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;QACnG,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,MAAM,GAAkB;QAC5B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;QACnC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;IAEF,YAAY,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/lib/license.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-complexity.d.ts","sourceRoot":"","sources":["../../src/tools/check-complexity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"check-complexity.d.ts","sourceRoot":"","sources":["../../src/tools/check-complexity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmC/D"}
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { calculateComplexity } from '../lib/complexity.js';
|
|
6
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
6
7
|
export function registerCheckComplexity(server) {
|
|
7
|
-
server.tool('check_complexity', '
|
|
8
|
+
server.tool('check_complexity', 'Calculates cyclomatic complexity for each function/method in source code. Counts decision points: if, else if, for, while, switch case, &&, ||, ternary, catch. Input: code (string), language (javascript, typescript, python, go). Output: per-function complexity scores with ratings (simple 1-5, moderate 6-10, complex 11-20, very complex 21+), overall score, and average. Rule-based static analysis. Free tier.', {
|
|
8
9
|
code: z.string().describe('Source code to analyze'),
|
|
9
10
|
language: z.string().describe('Programming language (javascript, typescript, python, go)'),
|
|
10
11
|
}, async ({ code, language }) => {
|
|
12
|
+
recordToolCall('check_complexity').catch(() => { });
|
|
11
13
|
const result = calculateComplexity(code, language);
|
|
12
14
|
const output = {
|
|
13
15
|
functions: result.functions.map(f => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-complexity.js","sourceRoot":"","sources":["../../src/tools/check-complexity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"check-complexity.js","sourceRoot":"","sources":["../../src/tools/check-complexity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,2ZAA2Z,EAC3Z;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;KAC3F,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,cAAc,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,EAAE;gBACpC,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC;YACH,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,oBAAoB,EAAE,MAAM,CAAC,kBAAkB;YAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE;gBACV,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,OAAO;gBAChB,YAAY,EAAE,KAAK;aACpB;SACF,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep-review.d.ts","sourceRoot":"","sources":["../../src/tools/deep-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"deep-review.d.ts","sourceRoot":"","sources":["../../src/tools/deep-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0D1D"}
|
|
@@ -4,12 +4,14 @@
|
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { requirePro, requireAiKey } from '../lib/license.js';
|
|
6
6
|
import { aiReview, DEEP_REVIEW_SYSTEM } from '../lib/ai-review.js';
|
|
7
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
7
8
|
export function registerDeepReview(server) {
|
|
8
|
-
server.tool('deep_review', '
|
|
9
|
+
server.tool('deep_review', 'Sends source code to an LLM for comprehensive review covering architecture, security, performance, error handling, and maintainability. Input: code (string), language (string), optional context about the code role. Output: structured JSON review with scored findings, severity levels, and remediation suggestions. Requires TRUSS_LICENSE_KEY + ANTHROPIC_API_KEY or OPENAI_API_KEY (customer-provided). Pro tier.', {
|
|
9
10
|
code: z.string().describe('Source code to review'),
|
|
10
11
|
language: z.string().describe('Programming language'),
|
|
11
12
|
context: z.string().optional().describe('Additional context (e.g., "this is a REST API handler", "performance-critical path")'),
|
|
12
13
|
}, async ({ code, language, context }) => {
|
|
14
|
+
recordToolCall('deep_review').catch(() => { });
|
|
13
15
|
await requirePro();
|
|
14
16
|
requireAiKey();
|
|
15
17
|
const userPrompt = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep-review.js","sourceRoot":"","sources":["../../src/tools/deep-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"deep-review.js","sourceRoot":"","sources":["../../src/tools/deep-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,2ZAA2Z,EAC3Z;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAClD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACrD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sFAAsF,CAAC;KAChI,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QACpC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;YACpC,EAAE;YACF,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;YAE9D,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,MAAM;4BACd,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-antipatterns.d.ts","sourceRoot":"","sources":["../../src/tools/detect-antipatterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"detect-antipatterns.d.ts","sourceRoot":"","sources":["../../src/tools/detect-antipatterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8ClE"}
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { detectAntiPatterns, getSupportedLanguages, isLanguageSupported } from '../lib/patterns.js';
|
|
6
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
6
7
|
export function registerDetectAntipatterns(server) {
|
|
7
|
-
server.tool('detect_antipatterns', '
|
|
8
|
+
server.tool('detect_antipatterns', 'Scans source code for language-specific anti-patterns using regex rules. JS/TS: var usage, ==, any type, eval, innerHTML, synchronous I/O. Python: bare except, mutable default arguments, wildcard imports. Go: ignored error returns, goroutine leaks, mutex without defer. Input: code (string), language (javascript, typescript, python, go). Output: findings array with pattern name, description, location, severity, and suggested fix. Rule-based, no AI API key needed. Free tier.', {
|
|
8
9
|
code: z.string().describe('Source code to analyze'),
|
|
9
10
|
language: z.string().describe('Programming language (javascript, typescript, python, go)'),
|
|
10
11
|
}, async ({ code, language }) => {
|
|
12
|
+
recordToolCall('detect_antipatterns').catch(() => { });
|
|
11
13
|
if (!isLanguageSupported(language)) {
|
|
12
14
|
return {
|
|
13
15
|
content: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-antipatterns.js","sourceRoot":"","sources":["../../src/tools/detect-antipatterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"detect-antipatterns.js","sourceRoot":"","sources":["../../src/tools/detect-antipatterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,+dAA+d,EAC/d;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;KAC3F,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,aAAa,QAAQ,qBAAqB;4BACjD,SAAS,EAAE,qBAAqB,EAAE;yBACnC,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG;YACb,QAAQ;YACR,cAAc,EAAE,OAAO,CAAC,MAAM;YAC9B,WAAW,EAAE;gBACX,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM;gBACzD,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM;gBAC7D,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;aACxD;YACD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,GAAG,EAAE,CAAC,CAAC,GAAG;aACX,CAAC,CAAC;SACJ,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain-code.d.ts","sourceRoot":"","sources":["../../src/tools/explain-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"explain-code.d.ts","sourceRoot":"","sources":["../../src/tools/explain-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwD3D"}
|
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { requirePro, requireAiKey } from '../lib/license.js';
|
|
6
6
|
import { aiReview, EXPLAIN_CODE_SYSTEM } from '../lib/ai-review.js';
|
|
7
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
7
8
|
export function registerExplainCode(server) {
|
|
8
|
-
server.tool('explain_code', '
|
|
9
|
+
server.tool('explain_code', 'Sends source code to an LLM to generate documentation. Input: code (string), language (string). Output: high-level explanation, per-function docstrings, data flow analysis, and design notes as structured JSON. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.', {
|
|
9
10
|
code: z.string().describe('Source code to explain'),
|
|
10
11
|
language: z.string().describe('Programming language'),
|
|
11
12
|
}, async ({ code, language }) => {
|
|
13
|
+
recordToolCall('explain_code').catch(() => { });
|
|
12
14
|
await requirePro();
|
|
13
15
|
requireAiKey();
|
|
14
16
|
const userPrompt = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain-code.js","sourceRoot":"","sources":["../../src/tools/explain-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"explain-code.js","sourceRoot":"","sources":["../../src/tools/explain-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,IAAI,CACT,cAAc,EACd,2QAA2Q,EAC3Q;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,cAAc,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,EAAE;YACF,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YAE/D,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,aAAa,EAAE,MAAM;4BACrB,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimize-code.d.ts","sourceRoot":"","sources":["../../src/tools/optimize-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"optimize-code.d.ts","sourceRoot":"","sources":["../../src/tools/optimize-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyD5D"}
|
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { requirePro, requireAiKey } from '../lib/license.js';
|
|
6
6
|
import { aiReview, OPTIMIZE_CODE_SYSTEM } from '../lib/ai-review.js';
|
|
7
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
7
8
|
export function registerOptimizeCode(server) {
|
|
8
|
-
server.tool('optimize_code', '
|
|
9
|
+
server.tool('optimize_code', 'Sends source code to an LLM for performance analysis. Input: code (string), language (string). Output: optimization suggestions with before/after code snippets, expected impact, and categories (algorithmic complexity, memory, I/O, caching). Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.', {
|
|
9
10
|
code: z.string().describe('Source code to optimize'),
|
|
10
11
|
language: z.string().describe('Programming language'),
|
|
11
12
|
}, async ({ code, language }) => {
|
|
13
|
+
recordToolCall('optimize_code').catch(() => { });
|
|
12
14
|
await requirePro();
|
|
13
15
|
requireAiKey();
|
|
14
16
|
const userPrompt = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optimize-code.js","sourceRoot":"","sources":["../../src/tools/optimize-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"optimize-code.js","sourceRoot":"","sources":["../../src/tools/optimize-code.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,0SAA0S,EAC1S;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChD,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,EAAE;YACF,+DAA+D;YAC/D,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;YAEhE,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,aAAa,EAAE,MAAM;4BACrB,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-diff.d.ts","sourceRoot":"","sources":["../../src/tools/review-diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"review-diff.d.ts","sourceRoot":"","sources":["../../src/tools/review-diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0UpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuC1D"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { readFileSync } from 'node:fs';
|
|
8
8
|
import { execSync } from 'node:child_process';
|
|
9
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
9
10
|
// ── Rule checks ─────────────────────────────────────────────────────
|
|
10
11
|
function checkLargeFile(lines, filename) {
|
|
11
12
|
const addedLines = lines.filter(l => l.startsWith('+')).length;
|
|
@@ -300,10 +301,11 @@ function getDiffContent(input) {
|
|
|
300
301
|
}
|
|
301
302
|
// ── Tool registration ───────────────────────────────────────────────
|
|
302
303
|
export function registerReviewDiff(server) {
|
|
303
|
-
server.tool('review_diff', '
|
|
304
|
+
server.tool('review_diff', 'Analyzes a git diff or file for common code review issues using rule-based pattern matching. Checks: oversized changes (>500 lines added), leftover debug statements (console.log, print, debugger, pdb), TODO/FIXME without ticket references, commented-out code blocks, and potential secret leaks. Input: either raw diff text or a file_path to diff. Output: array of findings with file, line number, severity (error/warning/info), message, and suggested fix. No AI API key needed. Free tier.', {
|
|
304
305
|
diff: z.string().optional().describe('Raw git diff content'),
|
|
305
306
|
file_path: z.string().optional().describe('Path to file (will run git diff on it)'),
|
|
306
307
|
}, async (input) => {
|
|
308
|
+
recordToolCall('review_diff').catch(() => { });
|
|
307
309
|
const diffContent = getDiffContent(input);
|
|
308
310
|
const files = parseDiff(diffContent);
|
|
309
311
|
const allComments = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-diff.js","sourceRoot":"","sources":["../../src/tools/review-diff.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"review-diff.js","sourceRoot":"","sources":["../../src/tools/review-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security-review.d.ts","sourceRoot":"","sources":["../../src/tools/security-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"security-review.d.ts","sourceRoot":"","sources":["../../src/tools/security-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyD9D"}
|
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { requirePro, requireAiKey } from '../lib/license.js';
|
|
6
6
|
import { aiReview, SECURITY_REVIEW_SYSTEM } from '../lib/ai-review.js';
|
|
7
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
7
8
|
export function registerSecurityReview(server) {
|
|
8
|
-
server.tool('security_review', '
|
|
9
|
+
server.tool('security_review', 'Sends source code to an LLM for security-focused analysis against OWASP Top 10 categories. Input: code (string), language (string). Output: vulnerabilities with CWE references, attack scenarios, severity ratings, and specific remediation steps. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.', {
|
|
9
10
|
code: z.string().describe('Source code to review for security issues'),
|
|
10
11
|
language: z.string().describe('Programming language'),
|
|
11
12
|
}, async ({ code, language }) => {
|
|
13
|
+
recordToolCall('security_review').catch(() => { });
|
|
12
14
|
await requirePro();
|
|
13
15
|
requireAiKey();
|
|
14
16
|
const userPrompt = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security-review.js","sourceRoot":"","sources":["../../src/tools/security-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"security-review.js","sourceRoot":"","sources":["../../src/tools/security-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,8SAA8S,EAC9S;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACtE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClD,MAAM,UAAU,EAAE,CAAC;QACnB,YAAY,EAAE,CAAC;QAEf,MAAM,UAAU,GAAG;YACjB,aAAa,QAAQ,EAAE;YACvB,EAAE;YACF,gDAAgD;YAChD,KAAK;YACL,IAAI;YACJ,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;YAElE,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1C,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,eAAe,EAAE,MAAM;4BACvB,IAAI,EAAE;gCACJ,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,MAAM,EAAE,MAAM,CAAC,UAAU;6BAC1B;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest-tests.d.ts","sourceRoot":"","sources":["../../src/tools/suggest-tests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"suggest-tests.d.ts","sourceRoot":"","sources":["../../src/tools/suggest-tests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiE5D"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { requirePro, requireAiKey } from '../lib/license.js';
|
|
6
6
|
import { aiReview, SUGGEST_TESTS_SYSTEM } from '../lib/ai-review.js';
|
|
7
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
7
8
|
const FRAMEWORK_DEFAULTS = {
|
|
8
9
|
javascript: 'jest',
|
|
9
10
|
typescript: 'jest with @types/jest',
|
|
@@ -20,11 +21,12 @@ const FRAMEWORK_DEFAULTS = {
|
|
|
20
21
|
swift: 'XCTest',
|
|
21
22
|
};
|
|
22
23
|
export function registerSuggestTests(server) {
|
|
23
|
-
server.tool('suggest_tests', '
|
|
24
|
+
server.tool('suggest_tests', 'Sends source code to an LLM to generate a complete test file. Input: code (string), language (string), optional framework (auto-detected: jest for JS/TS, pytest for Python, testing for Go, etc.). Output: runnable test file covering happy paths, edge cases, error conditions, and boundary values. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.', {
|
|
24
25
|
code: z.string().describe('Source code to generate tests for'),
|
|
25
26
|
language: z.string().describe('Programming language'),
|
|
26
27
|
framework: z.string().optional().describe('Test framework (e.g., jest, pytest, go testing). Auto-detected if omitted.'),
|
|
27
28
|
}, async ({ code, language, framework }) => {
|
|
29
|
+
recordToolCall('suggest_tests').catch(() => { });
|
|
28
30
|
await requirePro();
|
|
29
31
|
requireAiKey();
|
|
30
32
|
const testFramework = framework || FRAMEWORK_DEFAULTS[language.toLowerCase()] || 'appropriate testing framework';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest-tests.js","sourceRoot":"","sources":["../../src/tools/suggest-tests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"suggest-tests.js","sourceRoot":"","sources":["../../src/tools/suggest-tests.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "truss-code-review-mcp",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "AI-powered code review tools for Claude Code — complexity analysis, anti-pattern detection, security review, and optimization",
|
|
5
|
+
"homepage": "https://claw-factory.github.io/truss-site",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/claw-factory/truss-code-review-mcp.git"
|
|
9
|
+
},
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/claw-factory/truss-code-review-mcp/issues"
|
|
12
|
+
},
|
|
5
13
|
"type": "module",
|
|
6
14
|
"bin": {
|
|
7
15
|
"truss-code-review": "./dist/index.js"
|
|
@@ -34,11 +42,13 @@
|
|
|
34
42
|
"author": "TRUSS",
|
|
35
43
|
"license": "MIT",
|
|
36
44
|
"dependencies": {
|
|
37
|
-
"@modelcontextprotocol/sdk": "^1.12.0"
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
46
|
+
"stripe": "^21.0.1"
|
|
38
47
|
},
|
|
39
48
|
"devDependencies": {
|
|
40
49
|
"typescript": "^5.5.0",
|
|
41
50
|
"tsx": "^4.19.0",
|
|
42
51
|
"@types/node": "^22.0.0"
|
|
43
|
-
}
|
|
52
|
+
},
|
|
53
|
+
"mcpName": "io.github.claw-factory/truss-code-review-mcp"
|
|
44
54
|
}
|
package/server.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.claw-factory/truss-code-review-mcp",
|
|
4
|
+
"title": "TRUSS Code Review MCP",
|
|
5
|
+
"description": "AI-powered code review MCP server",
|
|
6
|
+
"version": "1.0.1",
|
|
7
|
+
"packages": [
|
|
8
|
+
{
|
|
9
|
+
"registryType": "npm",
|
|
10
|
+
"identifier": "truss-code-review-mcp",
|
|
11
|
+
"version": "1.0.1",
|
|
12
|
+
"runtimeHint": "node",
|
|
13
|
+
"transport": {
|
|
14
|
+
"type": "stdio"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"sourceUrl": "https://github.com/claw-factory/truss-code-review-mcp",
|
|
19
|
+
"license": "MIT"
|
|
20
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -4,12 +4,12 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
4
4
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
|
|
7
|
-
//
|
|
7
|
+
// Rule-based tools
|
|
8
8
|
import { registerReviewDiff } from './tools/review-diff.js';
|
|
9
9
|
import { registerCheckComplexity } from './tools/check-complexity.js';
|
|
10
10
|
import { registerDetectAntipatterns } from './tools/detect-antipatterns.js';
|
|
11
11
|
|
|
12
|
-
//
|
|
12
|
+
// AI-powered tools
|
|
13
13
|
import { registerDeepReview } from './tools/deep-review.js';
|
|
14
14
|
import { registerSuggestTests } from './tools/suggest-tests.js';
|
|
15
15
|
import { registerExplainCode } from './tools/explain-code.js';
|
|
@@ -17,7 +17,7 @@ import { registerSecurityReview } from './tools/security-review.js';
|
|
|
17
17
|
import { registerOptimizeCode } from './tools/optimize-code.js';
|
|
18
18
|
|
|
19
19
|
// Helpers
|
|
20
|
-
import {
|
|
20
|
+
import { hasAiKey } from './lib/license.js';
|
|
21
21
|
|
|
22
22
|
const server = new McpServer({
|
|
23
23
|
name: '@truss-dev/code-review-mcp',
|
|
@@ -28,10 +28,9 @@ const server = new McpServer({
|
|
|
28
28
|
|
|
29
29
|
server.tool(
|
|
30
30
|
'check_review_status',
|
|
31
|
-
'
|
|
31
|
+
'Returns current license tier (free/pro), validity, expiration, and whether an AI API key (ANTHROPIC_API_KEY or OPENAI_API_KEY) is configured. Lists all available tools grouped by tier. Use to verify configuration before calling pro or AI-dependent tools.',
|
|
32
32
|
{},
|
|
33
33
|
async () => {
|
|
34
|
-
const license = await getLicenseStatus();
|
|
35
34
|
const aiKeyPresent = hasAiKey();
|
|
36
35
|
|
|
37
36
|
return {
|
|
@@ -39,36 +38,21 @@ server.tool(
|
|
|
39
38
|
{
|
|
40
39
|
type: 'text' as const,
|
|
41
40
|
text: JSON.stringify({
|
|
42
|
-
|
|
43
|
-
tier: license.tier,
|
|
44
|
-
valid: license.valid,
|
|
45
|
-
expires_at: license.expiresAt,
|
|
46
|
-
},
|
|
41
|
+
server: 'truss-code-review-mcp',
|
|
47
42
|
ai_key_configured: aiKeyPresent,
|
|
48
|
-
|
|
43
|
+
tools: [
|
|
49
44
|
'review_diff — Rule-based diff analysis',
|
|
50
45
|
'check_complexity — Cyclomatic complexity calculator',
|
|
51
46
|
'detect_antipatterns — Language-specific anti-pattern detection',
|
|
52
|
-
],
|
|
53
|
-
pro_tools: [
|
|
54
47
|
'deep_review — AI-powered comprehensive review',
|
|
55
48
|
'suggest_tests — Generate test cases',
|
|
56
49
|
'explain_code — Generate documentation',
|
|
57
50
|
'security_review — OWASP security analysis',
|
|
58
51
|
'optimize_code — Performance optimization',
|
|
59
52
|
],
|
|
60
|
-
...(
|
|
61
|
-
? {
|
|
62
|
-
upgrade_info: {
|
|
63
|
-
url: 'https://truss.dev/pricing',
|
|
64
|
-
price: '$25/mo',
|
|
65
|
-
note: 'Set TRUSS_LICENSE_KEY + your own ANTHROPIC_API_KEY or OPENAI_API_KEY',
|
|
66
|
-
},
|
|
67
|
-
}
|
|
68
|
-
: {}),
|
|
69
|
-
...(!aiKeyPresent && license.tier === 'pro'
|
|
53
|
+
...(!aiKeyPresent
|
|
70
54
|
? {
|
|
71
|
-
|
|
55
|
+
note: 'Set ANTHROPIC_API_KEY or OPENAI_API_KEY to enable AI-powered tools (deep_review, suggest_tests, explain_code, security_review, optimize_code).',
|
|
72
56
|
}
|
|
73
57
|
: {}),
|
|
74
58
|
}, null, 2),
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import Stripe from 'stripe';
|
|
2
|
+
|
|
3
|
+
const stripeKey = process.env.STRIPE_SECRET_KEY;
|
|
4
|
+
const customerId = process.env.STRIPE_CUSTOMER_ID;
|
|
5
|
+
|
|
6
|
+
let stripe: Stripe | null = null;
|
|
7
|
+
|
|
8
|
+
if (stripeKey) {
|
|
9
|
+
stripe = new Stripe(stripeKey);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Record a tool call for usage-based billing via Stripe Billing Meters.
|
|
14
|
+
* Non-blocking — failures are logged but do not interrupt the tool call.
|
|
15
|
+
* Requires STRIPE_SECRET_KEY and STRIPE_CUSTOMER_ID env vars.
|
|
16
|
+
*/
|
|
17
|
+
export async function recordToolCall(toolName: string): Promise<void> {
|
|
18
|
+
if (!stripe || !customerId) return;
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
await stripe.billing.meterEvents.create({
|
|
22
|
+
event_name: 'mcp_tool_call',
|
|
23
|
+
payload: {
|
|
24
|
+
stripe_customer_id: customerId,
|
|
25
|
+
value: '1',
|
|
26
|
+
},
|
|
27
|
+
identifier: `${customerId}_${toolName}_${Date.now()}`,
|
|
28
|
+
});
|
|
29
|
+
} catch (err) {
|
|
30
|
+
// Non-blocking — log and continue
|
|
31
|
+
console.error(`[billing] meter event failed for ${toolName}:`, (err as Error).message);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
package/src/lib/license.ts
CHANGED
|
@@ -72,14 +72,12 @@ export async function getLicenseStatus(): Promise<LicenseStatus> {
|
|
|
72
72
|
return status;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
+
/**
|
|
76
|
+
* No-op. All tools are available in the free tier.
|
|
77
|
+
* Retained for API compatibility.
|
|
78
|
+
*/
|
|
75
79
|
export async function requirePro(): Promise<void> {
|
|
76
|
-
|
|
77
|
-
if (status.tier !== 'pro') {
|
|
78
|
-
throw new Error(
|
|
79
|
-
'This feature requires a TRUSS Pro license ($25/mo). ' +
|
|
80
|
-
'Get yours at https://truss.dev/pricing and set TRUSS_LICENSE_KEY.'
|
|
81
|
-
);
|
|
82
|
-
}
|
|
80
|
+
// All tools are free — no license gate
|
|
83
81
|
}
|
|
84
82
|
|
|
85
83
|
export function hasAiKey(): boolean {
|
|
@@ -5,16 +5,18 @@
|
|
|
5
5
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { calculateComplexity } from '../lib/complexity.js';
|
|
8
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
8
9
|
|
|
9
10
|
export function registerCheckComplexity(server: McpServer): void {
|
|
10
11
|
server.tool(
|
|
11
12
|
'check_complexity',
|
|
12
|
-
'
|
|
13
|
+
'Calculates cyclomatic complexity for each function/method in source code. Counts decision points: if, else if, for, while, switch case, &&, ||, ternary, catch. Input: code (string), language (javascript, typescript, python, go). Output: per-function complexity scores with ratings (simple 1-5, moderate 6-10, complex 11-20, very complex 21+), overall score, and average. Rule-based static analysis. Free tier.',
|
|
13
14
|
{
|
|
14
15
|
code: z.string().describe('Source code to analyze'),
|
|
15
16
|
language: z.string().describe('Programming language (javascript, typescript, python, go)'),
|
|
16
17
|
},
|
|
17
18
|
async ({ code, language }) => {
|
|
19
|
+
recordToolCall('check_complexity').catch(() => {});
|
|
18
20
|
const result = calculateComplexity(code, language);
|
|
19
21
|
|
|
20
22
|
const output = {
|
package/src/tools/deep-review.ts
CHANGED
|
@@ -6,17 +6,19 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { requirePro, requireAiKey } from '../lib/license.js';
|
|
8
8
|
import { aiReview, DEEP_REVIEW_SYSTEM } from '../lib/ai-review.js';
|
|
9
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
9
10
|
|
|
10
11
|
export function registerDeepReview(server: McpServer): void {
|
|
11
12
|
server.tool(
|
|
12
13
|
'deep_review',
|
|
13
|
-
'
|
|
14
|
+
'Sends source code to an LLM for comprehensive review covering architecture, security, performance, error handling, and maintainability. Input: code (string), language (string), optional context about the code role. Output: structured JSON review with scored findings, severity levels, and remediation suggestions. Requires TRUSS_LICENSE_KEY + ANTHROPIC_API_KEY or OPENAI_API_KEY (customer-provided). Pro tier.',
|
|
14
15
|
{
|
|
15
16
|
code: z.string().describe('Source code to review'),
|
|
16
17
|
language: z.string().describe('Programming language'),
|
|
17
18
|
context: z.string().optional().describe('Additional context (e.g., "this is a REST API handler", "performance-critical path")'),
|
|
18
19
|
},
|
|
19
20
|
async ({ code, language, context }) => {
|
|
21
|
+
recordToolCall('deep_review').catch(() => {});
|
|
20
22
|
await requirePro();
|
|
21
23
|
requireAiKey();
|
|
22
24
|
|
|
@@ -5,16 +5,18 @@
|
|
|
5
5
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { detectAntiPatterns, getSupportedLanguages, isLanguageSupported } from '../lib/patterns.js';
|
|
8
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
8
9
|
|
|
9
10
|
export function registerDetectAntipatterns(server: McpServer): void {
|
|
10
11
|
server.tool(
|
|
11
12
|
'detect_antipatterns',
|
|
12
|
-
'
|
|
13
|
+
'Scans source code for language-specific anti-patterns using regex rules. JS/TS: var usage, ==, any type, eval, innerHTML, synchronous I/O. Python: bare except, mutable default arguments, wildcard imports. Go: ignored error returns, goroutine leaks, mutex without defer. Input: code (string), language (javascript, typescript, python, go). Output: findings array with pattern name, description, location, severity, and suggested fix. Rule-based, no AI API key needed. Free tier.',
|
|
13
14
|
{
|
|
14
15
|
code: z.string().describe('Source code to analyze'),
|
|
15
16
|
language: z.string().describe('Programming language (javascript, typescript, python, go)'),
|
|
16
17
|
},
|
|
17
18
|
async ({ code, language }) => {
|
|
19
|
+
recordToolCall('detect_antipatterns').catch(() => {});
|
|
18
20
|
if (!isLanguageSupported(language)) {
|
|
19
21
|
return {
|
|
20
22
|
content: [{
|
|
@@ -6,16 +6,18 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { requirePro, requireAiKey } from '../lib/license.js';
|
|
8
8
|
import { aiReview, EXPLAIN_CODE_SYSTEM } from '../lib/ai-review.js';
|
|
9
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
9
10
|
|
|
10
11
|
export function registerExplainCode(server: McpServer): void {
|
|
11
12
|
server.tool(
|
|
12
13
|
'explain_code',
|
|
13
|
-
'
|
|
14
|
+
'Sends source code to an LLM to generate documentation. Input: code (string), language (string). Output: high-level explanation, per-function docstrings, data flow analysis, and design notes as structured JSON. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.',
|
|
14
15
|
{
|
|
15
16
|
code: z.string().describe('Source code to explain'),
|
|
16
17
|
language: z.string().describe('Programming language'),
|
|
17
18
|
},
|
|
18
19
|
async ({ code, language }) => {
|
|
20
|
+
recordToolCall('explain_code').catch(() => {});
|
|
19
21
|
await requirePro();
|
|
20
22
|
requireAiKey();
|
|
21
23
|
|
|
@@ -6,16 +6,18 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { requirePro, requireAiKey } from '../lib/license.js';
|
|
8
8
|
import { aiReview, OPTIMIZE_CODE_SYSTEM } from '../lib/ai-review.js';
|
|
9
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
9
10
|
|
|
10
11
|
export function registerOptimizeCode(server: McpServer): void {
|
|
11
12
|
server.tool(
|
|
12
13
|
'optimize_code',
|
|
13
|
-
'
|
|
14
|
+
'Sends source code to an LLM for performance analysis. Input: code (string), language (string). Output: optimization suggestions with before/after code snippets, expected impact, and categories (algorithmic complexity, memory, I/O, caching). Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.',
|
|
14
15
|
{
|
|
15
16
|
code: z.string().describe('Source code to optimize'),
|
|
16
17
|
language: z.string().describe('Programming language'),
|
|
17
18
|
},
|
|
18
19
|
async ({ code, language }) => {
|
|
20
|
+
recordToolCall('optimize_code').catch(() => {});
|
|
19
21
|
await requirePro();
|
|
20
22
|
requireAiKey();
|
|
21
23
|
|
package/src/tools/review-diff.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
8
8
|
import { z } from 'zod';
|
|
9
9
|
import { readFileSync } from 'node:fs';
|
|
10
10
|
import { execSync } from 'node:child_process';
|
|
11
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
11
12
|
|
|
12
13
|
interface ReviewComment {
|
|
13
14
|
file: string;
|
|
@@ -336,12 +337,13 @@ function getDiffContent(input: { diff?: string; file_path?: string }): string {
|
|
|
336
337
|
export function registerReviewDiff(server: McpServer): void {
|
|
337
338
|
server.tool(
|
|
338
339
|
'review_diff',
|
|
339
|
-
'
|
|
340
|
+
'Analyzes a git diff or file for common code review issues using rule-based pattern matching. Checks: oversized changes (>500 lines added), leftover debug statements (console.log, print, debugger, pdb), TODO/FIXME without ticket references, commented-out code blocks, and potential secret leaks. Input: either raw diff text or a file_path to diff. Output: array of findings with file, line number, severity (error/warning/info), message, and suggested fix. No AI API key needed. Free tier.',
|
|
340
341
|
{
|
|
341
342
|
diff: z.string().optional().describe('Raw git diff content'),
|
|
342
343
|
file_path: z.string().optional().describe('Path to file (will run git diff on it)'),
|
|
343
344
|
},
|
|
344
345
|
async (input) => {
|
|
346
|
+
recordToolCall('review_diff').catch(() => {});
|
|
345
347
|
const diffContent = getDiffContent(input);
|
|
346
348
|
const files = parseDiff(diffContent);
|
|
347
349
|
const allComments: ReviewComment[] = [];
|
|
@@ -6,16 +6,18 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { requirePro, requireAiKey } from '../lib/license.js';
|
|
8
8
|
import { aiReview, SECURITY_REVIEW_SYSTEM } from '../lib/ai-review.js';
|
|
9
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
9
10
|
|
|
10
11
|
export function registerSecurityReview(server: McpServer): void {
|
|
11
12
|
server.tool(
|
|
12
13
|
'security_review',
|
|
13
|
-
'
|
|
14
|
+
'Sends source code to an LLM for security-focused analysis against OWASP Top 10 categories. Input: code (string), language (string). Output: vulnerabilities with CWE references, attack scenarios, severity ratings, and specific remediation steps. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.',
|
|
14
15
|
{
|
|
15
16
|
code: z.string().describe('Source code to review for security issues'),
|
|
16
17
|
language: z.string().describe('Programming language'),
|
|
17
18
|
},
|
|
18
19
|
async ({ code, language }) => {
|
|
20
|
+
recordToolCall('security_review').catch(() => {});
|
|
19
21
|
await requirePro();
|
|
20
22
|
requireAiKey();
|
|
21
23
|
|
|
@@ -6,6 +6,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { requirePro, requireAiKey } from '../lib/license.js';
|
|
8
8
|
import { aiReview, SUGGEST_TESTS_SYSTEM } from '../lib/ai-review.js';
|
|
9
|
+
import { recordToolCall } from '../lib/billing.js';
|
|
9
10
|
|
|
10
11
|
const FRAMEWORK_DEFAULTS: Record<string, string> = {
|
|
11
12
|
javascript: 'jest',
|
|
@@ -26,13 +27,14 @@ const FRAMEWORK_DEFAULTS: Record<string, string> = {
|
|
|
26
27
|
export function registerSuggestTests(server: McpServer): void {
|
|
27
28
|
server.tool(
|
|
28
29
|
'suggest_tests',
|
|
29
|
-
'
|
|
30
|
+
'Sends source code to an LLM to generate a complete test file. Input: code (string), language (string), optional framework (auto-detected: jest for JS/TS, pytest for Python, testing for Go, etc.). Output: runnable test file covering happy paths, edge cases, error conditions, and boundary values. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY. Pro tier.',
|
|
30
31
|
{
|
|
31
32
|
code: z.string().describe('Source code to generate tests for'),
|
|
32
33
|
language: z.string().describe('Programming language'),
|
|
33
34
|
framework: z.string().optional().describe('Test framework (e.g., jest, pytest, go testing). Auto-detected if omitted.'),
|
|
34
35
|
},
|
|
35
36
|
async ({ code, language, framework }) => {
|
|
37
|
+
recordToolCall('suggest_tests').catch(() => {});
|
|
36
38
|
await requirePro();
|
|
37
39
|
requireAiKey();
|
|
38
40
|
|