@rectify-so/mcp 1.0.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 +225 -0
- package/dist/api-client.d.ts +21 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +92 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +30 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +238 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
package/README.md
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# Rectify MCP Server
|
|
2
|
+
|
|
3
|
+
An MCP (Model Context Protocol) server to access Rectify project resources from IDEs.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm i -g @rectify-so/mcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Local Development
|
|
12
|
+
|
|
13
|
+
### Prerequisites
|
|
14
|
+
- Node.js (v18 or higher)
|
|
15
|
+
- npm or yarn
|
|
16
|
+
- A valid Rectify MCP token (get from https://app.rectify.so)
|
|
17
|
+
|
|
18
|
+
### Setup
|
|
19
|
+
|
|
20
|
+
1. **Clone and install dependencies:**
|
|
21
|
+
```bash
|
|
22
|
+
cd rectify-mcp
|
|
23
|
+
npm install
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
2. **Build the project (optional):**
|
|
27
|
+
```bash
|
|
28
|
+
npm run build
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Running Locally
|
|
32
|
+
|
|
33
|
+
#### Option 1: Using npm dev script
|
|
34
|
+
```bash
|
|
35
|
+
npm run dev -- --token mcp_xxx:userId
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
#### Option 2: Using the built CLI
|
|
39
|
+
```bash
|
|
40
|
+
node dist/cli.js --token mcp_xxx:userId
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
#### Option 3: Test with tsx locally
|
|
44
|
+
```bash
|
|
45
|
+
npx tsx src/cli.ts --token mcp_xxx:userId
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Testing with MCP Inspector
|
|
49
|
+
|
|
50
|
+
The MCP Inspector is a tool to test your MCP server without an IDE:
|
|
51
|
+
|
|
52
|
+
1. **Run with MCP Inspector:**
|
|
53
|
+
```bash
|
|
54
|
+
npx @modelcontextprotocol/inspector node dist/cli.js --token mcp_xxx:userId
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
2. **The inspector will:**
|
|
58
|
+
- Start your MCP server
|
|
59
|
+
- Open a web interface (usually at http://localhost:5173)
|
|
60
|
+
- Allow you to test resources and see responses
|
|
61
|
+
|
|
62
|
+
### Testing in IDE (Local Development)
|
|
63
|
+
|
|
64
|
+
#### Windsurf Local Testing
|
|
65
|
+
Update `~/.codeium/windsurf/mcp_config.json` to use the compiled CLI:
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"rectify": {
|
|
69
|
+
"command": "node",
|
|
70
|
+
"args": [
|
|
71
|
+
"/absolute/path/to/rectify-mcp/dist/cli.js",
|
|
72
|
+
"--token",
|
|
73
|
+
"mcp_xxx:userId"
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
#### Claude Desktop Local Testing
|
|
80
|
+
Update Claude config (`%APPDATA%/Claude/claude_desktop_config.json` on Windows or `~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"rectify": {
|
|
84
|
+
"command": "node",
|
|
85
|
+
"args": [
|
|
86
|
+
"/absolute/path/to/rectify-mcp/dist/cli.js",
|
|
87
|
+
"--token",
|
|
88
|
+
"mcp_xxx:userId"
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Debugging
|
|
95
|
+
|
|
96
|
+
Enable verbose logging to see detailed output:
|
|
97
|
+
```bash
|
|
98
|
+
node dist/cli.js --token mcp_xxx:userId --base-url http://localhost:5000 --enable-feedback --enable-scan --verbose
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Check logs for:
|
|
102
|
+
- Token validation status
|
|
103
|
+
- Organization and project IDs
|
|
104
|
+
- Resource requests
|
|
105
|
+
- API errors
|
|
106
|
+
|
|
107
|
+
### Common Issues
|
|
108
|
+
|
|
109
|
+
**Token validation fails:**
|
|
110
|
+
- Ensure your backend server is running on the specified base URL
|
|
111
|
+
- Verify the token format is correct: `mcp_xxx:userId`
|
|
112
|
+
- Check that the `/v1/mcp/validate/:mcpKey` endpoint is accessible
|
|
113
|
+
|
|
114
|
+
**Resources not showing:**
|
|
115
|
+
- Make sure `--enable-feedback` or `--enable-scan` flags are set
|
|
116
|
+
- Verify the backend API endpoints are working
|
|
117
|
+
- Check authentication headers are being sent correctly
|
|
118
|
+
|
|
119
|
+
**IDE not connecting:**
|
|
120
|
+
- Rebuild the project after code changes: `npm run build`
|
|
121
|
+
- Restart your IDE after updating the config
|
|
122
|
+
- Check IDE logs for MCP connection errors
|
|
123
|
+
- Verify the absolute path to `dist/cli.js` is correct
|
|
124
|
+
|
|
125
|
+
## Production Usage
|
|
126
|
+
|
|
127
|
+
### Command Line
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
rectify-mcp --token mcp_xxx:userId
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### IDE Configuration
|
|
134
|
+
|
|
135
|
+
Copy just the top-level `rectify` block (do not wrap in `mcpServers` unless your IDE requires it):
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
{
|
|
139
|
+
"rectify": {
|
|
140
|
+
"command": "npx",
|
|
141
|
+
"args": ["-y", "@rectify-so/mcp", "--token", "mcp_xxx:userId"]
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### Claude Desktop
|
|
147
|
+
|
|
148
|
+
Add to Claude Desktop config:
|
|
149
|
+
|
|
150
|
+
**Windows:** `%APPDATA%/Claude/claude_desktop_config.json`
|
|
151
|
+
**macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
{
|
|
155
|
+
"mcpServers": {
|
|
156
|
+
"rectify": {
|
|
157
|
+
"command": "npx",
|
|
158
|
+
"args": [
|
|
159
|
+
"-y",
|
|
160
|
+
"@rectify-so/mcp-server",
|
|
161
|
+
"--enable-feedback",
|
|
162
|
+
"--enable-scan",
|
|
163
|
+
"--ide", "claude"
|
|
164
|
+
],
|
|
165
|
+
"env": {
|
|
166
|
+
"RECTIFY_TOKEN": "mcp_xxx:userId"
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
#### Cursor
|
|
174
|
+
|
|
175
|
+
Add to Cursor settings:
|
|
176
|
+
|
|
177
|
+
```json
|
|
178
|
+
{
|
|
179
|
+
"mcp.servers": {
|
|
180
|
+
"rectify": {
|
|
181
|
+
"command": "npx",
|
|
182
|
+
"args": [
|
|
183
|
+
"-y",
|
|
184
|
+
"@rectify-so/mcp-server",
|
|
185
|
+
"--enable-feedback",
|
|
186
|
+
"--enable-scan",
|
|
187
|
+
"--ide", "cursor"
|
|
188
|
+
],
|
|
189
|
+
"env": {
|
|
190
|
+
"RECTIFY_TOKEN": "mcp_xxx:userId"
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Options
|
|
198
|
+
|
|
199
|
+
- `--token <token>` - MCP authentication token (required, format: mcp_xxx:userId)
|
|
200
|
+
|
|
201
|
+
## Available Resources
|
|
202
|
+
|
|
203
|
+
### Feedback Resources
|
|
204
|
+
- `rectify://{orgId}/{projectId}/feedbacks` - List feedbacks (assets excluded)
|
|
205
|
+
- `rectify://{orgId}/{projectId}/feedbacks/{id}` - Get feedback detail (bug-type includes debugDataUrl if available)
|
|
206
|
+
- `rectify://{orgId}/{projectId}/feedbacks/overview` - Get feedback overview
|
|
207
|
+
|
|
208
|
+
### Scan Job Resources (when enabled)
|
|
209
|
+
- `rectify://{orgId}/{projectId}/scan/job` - Current scan job
|
|
210
|
+
- `rectify://{orgId}/{projectId}/scan/issues` - List scan issues
|
|
211
|
+
- `rectify://{orgId}/{projectId}/scan/issues/{key}` - Get issue detail
|
|
212
|
+
- `rectify://{orgId}/{projectId}/scan/issues/by-file` - Get issues by file
|
|
213
|
+
- `rectify://{orgId}/{projectId}/scan/metrics` - Scan metrics
|
|
214
|
+
- `rectify://{orgId}/{projectId}/scan/history` - Scan history
|
|
215
|
+
|
|
216
|
+
## Tools
|
|
217
|
+
|
|
218
|
+
- `rectify.feedbacks.analyzeDebugUrl`
|
|
219
|
+
- Analyze compressed technical logs from a debugDataUrl.
|
|
220
|
+
- Inputs: `debugDataUrl?`, `feedbackId?` (server resolves URL when an ID is given).
|
|
221
|
+
- Note: debugDataUrl is only available for bug-type feedbacks.
|
|
222
|
+
|
|
223
|
+
## License
|
|
224
|
+
|
|
225
|
+
MIT
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { McpKeyValidationResult, FeedbackQueryParams, ScanIssuesQueryParams, AnalyzeDebugRequest, AnalyzeDebugResponse } from './types.js';
|
|
2
|
+
export declare class ApiClient {
|
|
3
|
+
private client;
|
|
4
|
+
private token;
|
|
5
|
+
private orgId?;
|
|
6
|
+
private projectId?;
|
|
7
|
+
constructor(token: string);
|
|
8
|
+
validateToken(): Promise<McpKeyValidationResult>;
|
|
9
|
+
private getAuthHeaders;
|
|
10
|
+
getFeedbacks(params: FeedbackQueryParams): Promise<unknown>;
|
|
11
|
+
getFeedbackDetail(feedbackId: string): Promise<unknown>;
|
|
12
|
+
getFeedbackOverview(): Promise<unknown>;
|
|
13
|
+
getCurrentScanJob(): Promise<unknown>;
|
|
14
|
+
getScanIssues(params: ScanIssuesQueryParams): Promise<unknown>;
|
|
15
|
+
getScanIssueDetail(issueKey: string): Promise<unknown>;
|
|
16
|
+
getScanIssuesByFile(filePath: string): Promise<unknown>;
|
|
17
|
+
getScanMetrics(): Promise<unknown>;
|
|
18
|
+
getScanHistory(limit?: number): Promise<unknown>;
|
|
19
|
+
analyzeDebugData(payload: AnalyzeDebugRequest): Promise<AnalyzeDebugResponse>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,KAAK,EAAE,MAAM;IAWnB,aAAa,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAsBtD,OAAO,CAAC,cAAc;IAIhB,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3D,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQvD,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAQvC,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAQrC,aAAa,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9D,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQtD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWvD,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAQlC,cAAc,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAWpD,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAQpF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { BASE_URL } from './constants.js';
|
|
3
|
+
export class ApiClient {
|
|
4
|
+
client;
|
|
5
|
+
token;
|
|
6
|
+
orgId;
|
|
7
|
+
projectId;
|
|
8
|
+
constructor(token) {
|
|
9
|
+
this.token = token;
|
|
10
|
+
this.client = axios.create({
|
|
11
|
+
baseURL: BASE_URL,
|
|
12
|
+
headers: {
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
},
|
|
15
|
+
timeout: 30000,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async validateToken() {
|
|
19
|
+
try {
|
|
20
|
+
const response = await this.client.post(`/v1/mcp/validate`, {}, { headers: this.getAuthHeaders() });
|
|
21
|
+
const result = response.data;
|
|
22
|
+
if (result.isValid) {
|
|
23
|
+
this.orgId = result.organization;
|
|
24
|
+
this.projectId = result.project;
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const err = error;
|
|
30
|
+
return {
|
|
31
|
+
isValid: false,
|
|
32
|
+
error: err.response?.data?.message || err.message || 'Unknown error'
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
getAuthHeaders() {
|
|
37
|
+
return { 'x-api-key': this.token };
|
|
38
|
+
}
|
|
39
|
+
async getFeedbacks(params) {
|
|
40
|
+
const response = await this.client.get(`/v1/mcp/feedbacks`, {
|
|
41
|
+
params,
|
|
42
|
+
headers: this.getAuthHeaders()
|
|
43
|
+
});
|
|
44
|
+
return response.data;
|
|
45
|
+
}
|
|
46
|
+
async getFeedbackDetail(feedbackId) {
|
|
47
|
+
const response = await this.client.get(`/v1/mcp/feedbacks/${feedbackId}`, { headers: this.getAuthHeaders() });
|
|
48
|
+
return response.data;
|
|
49
|
+
}
|
|
50
|
+
async getFeedbackOverview() {
|
|
51
|
+
const response = await this.client.get(`/v1/mcp/feedbacks/overview`, { headers: this.getAuthHeaders() });
|
|
52
|
+
return response.data;
|
|
53
|
+
}
|
|
54
|
+
async getCurrentScanJob() {
|
|
55
|
+
const response = await this.client.get(`/v1/mcp/scan-job/current`, { headers: this.getAuthHeaders() });
|
|
56
|
+
return response.data;
|
|
57
|
+
}
|
|
58
|
+
async getScanIssues(params) {
|
|
59
|
+
const response = await this.client.get(`/v1/mcp/scan-job/issues`, {
|
|
60
|
+
params,
|
|
61
|
+
headers: this.getAuthHeaders()
|
|
62
|
+
});
|
|
63
|
+
return response.data;
|
|
64
|
+
}
|
|
65
|
+
async getScanIssueDetail(issueKey) {
|
|
66
|
+
const response = await this.client.get(`/v1/mcp/scan-job/issues/${issueKey}`, { headers: this.getAuthHeaders() });
|
|
67
|
+
return response.data;
|
|
68
|
+
}
|
|
69
|
+
async getScanIssuesByFile(filePath) {
|
|
70
|
+
const response = await this.client.get(`/v1/mcp/scan-job/issues/by-file`, {
|
|
71
|
+
params: { filePath },
|
|
72
|
+
headers: this.getAuthHeaders()
|
|
73
|
+
});
|
|
74
|
+
return response.data;
|
|
75
|
+
}
|
|
76
|
+
async getScanMetrics() {
|
|
77
|
+
const response = await this.client.get(`/v1/mcp/scan-job/metrics`, { headers: this.getAuthHeaders() });
|
|
78
|
+
return response.data;
|
|
79
|
+
}
|
|
80
|
+
async getScanHistory(limit = 20) {
|
|
81
|
+
const response = await this.client.get(`/v1/mcp/scan-job/history`, {
|
|
82
|
+
params: { limit },
|
|
83
|
+
headers: this.getAuthHeaders()
|
|
84
|
+
});
|
|
85
|
+
return response.data;
|
|
86
|
+
}
|
|
87
|
+
async analyzeDebugData(payload) {
|
|
88
|
+
const response = await this.client.post(`/v1/mcp/feedbacks/analyze-debug-data`, payload, { headers: this.getAuthHeaders() });
|
|
89
|
+
return response.data;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { program } from "commander";
|
|
2
|
+
import { startServer } from "./server.js";
|
|
3
|
+
import { readFileSync } from "fs";
|
|
4
|
+
import { join, dirname } from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
|
|
8
|
+
program
|
|
9
|
+
.name("rectify-mcp")
|
|
10
|
+
.description("Rectify MCP Server for IDE integration")
|
|
11
|
+
.version(packageJson.version)
|
|
12
|
+
.requiredOption("--token <token>", "MCP authentication token (format: mcp_xxx:userId)") // Changed to requiredOption
|
|
13
|
+
.action(async (options) => {
|
|
14
|
+
try {
|
|
15
|
+
const tokenParts = options.token.split(":");
|
|
16
|
+
if (tokenParts.length !== 2 || !tokenParts[0].startsWith("mcp_")) {
|
|
17
|
+
console.error("Error: Invalid token format. Expected format: mcp_xxx:userId");
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
await startServer({
|
|
21
|
+
token: options.token,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error("Failed to start MCP server:", error);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
program.parse();
|
|
30
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAC7D,CAAC;AAEF,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,cAAc,CACb,iBAAiB,EACjB,mDAAmD,CACpD,CAAC,4BAA4B;KAC7B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,OAAO,CAAC,KAAK,CACX,8DAA8D,CAC/D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,CAAC;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,EAAE,MAAgC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAW,uBAAuB,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgRrE"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { ListResourcesRequestSchema, ReadResourceRequestSchema, ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
4
|
+
import { ApiClient } from "./api-client.js";
|
|
5
|
+
export async function startServer(config) {
|
|
6
|
+
try {
|
|
7
|
+
const apiClient = new ApiClient(config.token);
|
|
8
|
+
console.error("[MCP] Validating token...");
|
|
9
|
+
const validation = await apiClient.validateToken();
|
|
10
|
+
if (!validation.isValid) {
|
|
11
|
+
console.error(`[MCP] Token validation failed: ${validation.error}`);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
console.error("[MCP] Token validated successfully");
|
|
15
|
+
// Create server and transport
|
|
16
|
+
console.error("[MCP] Creating MCP server...");
|
|
17
|
+
const server = new Server({
|
|
18
|
+
name: "rectify-mcp",
|
|
19
|
+
version: "1.0.0",
|
|
20
|
+
}, {
|
|
21
|
+
capabilities: {
|
|
22
|
+
resources: {},
|
|
23
|
+
tools: {},
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
const tools = [
|
|
27
|
+
{
|
|
28
|
+
name: "rectify.feedbacks.analyzeDebugUrl",
|
|
29
|
+
description: "Analyze compressed technical logs from a debugDataUrl. Note: debugDataUrl is only available for bug-type feedbacks. Provide either debugDataUrl or feedbackId.",
|
|
30
|
+
inputSchema: {
|
|
31
|
+
type: "object",
|
|
32
|
+
properties: {
|
|
33
|
+
debugDataUrl: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "Direct URL to the compressed debug data (only available for bug reports)",
|
|
36
|
+
},
|
|
37
|
+
feedbackId: {
|
|
38
|
+
type: "string",
|
|
39
|
+
description: "Feedback ID to resolve debugDataUrl from (must be a bug-type feedback)",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
additionalProperties: false,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
47
|
+
console.error("[MCP] Listing tools...");
|
|
48
|
+
return { tools };
|
|
49
|
+
});
|
|
50
|
+
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
51
|
+
const name = req.params?.name;
|
|
52
|
+
console.error(`[MCP] Tool called: ${name}`);
|
|
53
|
+
if (name === "rectify.feedbacks.analyzeDebugUrl") {
|
|
54
|
+
const args = (req.params?.arguments ?? {});
|
|
55
|
+
const debugDataUrl = typeof args.debugDataUrl === "string" ? args.debugDataUrl : undefined;
|
|
56
|
+
const feedbackId = typeof args.feedbackId === "string" ? args.feedbackId : undefined;
|
|
57
|
+
const data = await apiClient.analyzeDebugData({
|
|
58
|
+
debugDataUrl,
|
|
59
|
+
feedbackId,
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: "text",
|
|
65
|
+
text: JSON.stringify(data, null, 2),
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
71
|
+
});
|
|
72
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
73
|
+
console.error("[MCP] Listing resources...");
|
|
74
|
+
const base = `rectify://${validation.organization}/${validation.project}`;
|
|
75
|
+
const resources = [
|
|
76
|
+
{
|
|
77
|
+
uri: `${base}/feedbacks`,
|
|
78
|
+
name: "Feedback list",
|
|
79
|
+
description: "List all feedbacks with optional filters (excludes assets)",
|
|
80
|
+
mimeType: "application/json",
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
uri: `${base}/feedbacks/{id}`,
|
|
84
|
+
name: "Feedback detail",
|
|
85
|
+
description: "Get detailed feedback by ID. For bug-type feedbacks, includes debugDataUrl if available.",
|
|
86
|
+
mimeType: "application/json",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
uri: `${base}/feedbacks/overview`,
|
|
90
|
+
name: "Feedback overview",
|
|
91
|
+
description: "Summary of feedback statistics",
|
|
92
|
+
mimeType: "application/json",
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
uri: `${base}/scan/job`,
|
|
96
|
+
name: "Current Code scan",
|
|
97
|
+
description: "Details of the current code scan job",
|
|
98
|
+
mimeType: "application/json",
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
uri: `${base}/scan/issues`,
|
|
102
|
+
name: "Code scan issues",
|
|
103
|
+
description: "List of issues found in code scans",
|
|
104
|
+
mimeType: "application/json",
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
uri: `${base}/scan/issues/by-file`,
|
|
108
|
+
name: "Issues by file",
|
|
109
|
+
description: "Issues grouped by file path",
|
|
110
|
+
mimeType: "application/json",
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
uri: `${base}/scan/metrics`,
|
|
114
|
+
name: "Code scan metrics",
|
|
115
|
+
description: "Metrics from code scan results",
|
|
116
|
+
mimeType: "application/json",
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
uri: `${base}/scan/history`,
|
|
120
|
+
name: "Code scan history",
|
|
121
|
+
description: "Historical code scan results",
|
|
122
|
+
mimeType: "application/json",
|
|
123
|
+
},
|
|
124
|
+
];
|
|
125
|
+
console.error(`[MCP] Returning ${resources.length} resources`);
|
|
126
|
+
return { resources };
|
|
127
|
+
});
|
|
128
|
+
// Read resource content
|
|
129
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (req) => {
|
|
130
|
+
const uri = req.params?.uri;
|
|
131
|
+
console.error(`[MCP] Reading resource: ${uri}`);
|
|
132
|
+
if (!uri) {
|
|
133
|
+
throw new Error("Missing uri parameter");
|
|
134
|
+
}
|
|
135
|
+
const match = uri.match(/^rectify:\/\/([^/]+)\/([^/]+)\/(.+)$/);
|
|
136
|
+
if (!match) {
|
|
137
|
+
throw new Error(`Invalid URI format: ${uri}`);
|
|
138
|
+
}
|
|
139
|
+
const [, orgId, projectId, path] = match;
|
|
140
|
+
if (orgId !== validation.organization ||
|
|
141
|
+
projectId !== validation.project) {
|
|
142
|
+
throw new Error("URI does not match authenticated organization/project");
|
|
143
|
+
}
|
|
144
|
+
let data;
|
|
145
|
+
const [resource, ...queryParts] = path.split("?");
|
|
146
|
+
const queryString = queryParts.join("?");
|
|
147
|
+
const query = new URLSearchParams(queryString);
|
|
148
|
+
switch (resource) {
|
|
149
|
+
case "feedbacks":
|
|
150
|
+
data = await apiClient.getFeedbacks({
|
|
151
|
+
status: query.get("status") || undefined,
|
|
152
|
+
priority: query.get("priority") || undefined,
|
|
153
|
+
type: query.get("type") || undefined,
|
|
154
|
+
page: query.has("page") ? parseInt(query.get("page")) : 1,
|
|
155
|
+
limit: query.has("limit") ? parseInt(query.get("limit")) : 20,
|
|
156
|
+
});
|
|
157
|
+
break;
|
|
158
|
+
case "feedbacks/overview":
|
|
159
|
+
data = await apiClient.getFeedbackOverview();
|
|
160
|
+
break;
|
|
161
|
+
case "scan/job":
|
|
162
|
+
data = await apiClient.getCurrentScanJob();
|
|
163
|
+
break;
|
|
164
|
+
case "scan/issues":
|
|
165
|
+
data = await apiClient.getScanIssues({
|
|
166
|
+
severity: query.get("severity") || undefined,
|
|
167
|
+
type: query.get("type") || undefined,
|
|
168
|
+
status: query.get("status") || undefined,
|
|
169
|
+
page: query.has("page") ? parseInt(query.get("page")) : 1,
|
|
170
|
+
pageSize: query.has("pageSize")
|
|
171
|
+
? parseInt(query.get("pageSize"))
|
|
172
|
+
: 50,
|
|
173
|
+
});
|
|
174
|
+
break;
|
|
175
|
+
case "scan/issues/by-file": {
|
|
176
|
+
const filePath = query.get("filePath");
|
|
177
|
+
if (!filePath) {
|
|
178
|
+
throw new Error("filePath query parameter is required");
|
|
179
|
+
}
|
|
180
|
+
data = await apiClient.getScanIssuesByFile(filePath);
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
case "scan/metrics":
|
|
184
|
+
data = await apiClient.getScanMetrics();
|
|
185
|
+
break;
|
|
186
|
+
case "scan/history": {
|
|
187
|
+
const limit = query.has("limit") ? parseInt(query.get("limit")) : 20;
|
|
188
|
+
data = await apiClient.getScanHistory(limit);
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
default:
|
|
192
|
+
if (resource.startsWith("feedbacks/")) {
|
|
193
|
+
const feedbackId = resource.substring("feedbacks/".length);
|
|
194
|
+
data = await apiClient.getFeedbackDetail(feedbackId);
|
|
195
|
+
}
|
|
196
|
+
else if (resource.startsWith("scan/issues/")) {
|
|
197
|
+
const issueKey = resource.substring("scan/issues/".length);
|
|
198
|
+
data = await apiClient.getScanIssueDetail(issueKey);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
throw new Error(`Unknown resource: ${resource}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
contents: [
|
|
206
|
+
{
|
|
207
|
+
uri,
|
|
208
|
+
mimeType: "application/json",
|
|
209
|
+
text: JSON.stringify(data, null, 2),
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
// Connect to transport
|
|
215
|
+
const transport = new StdioServerTransport();
|
|
216
|
+
await server.connect(transport);
|
|
217
|
+
console.error("[MCP] Server started successfully");
|
|
218
|
+
// Keep process alive
|
|
219
|
+
process.on("SIGINT", async () => {
|
|
220
|
+
console.error("[MCP] Received SIGINT, shutting down...");
|
|
221
|
+
await server.close();
|
|
222
|
+
process.exit(0);
|
|
223
|
+
});
|
|
224
|
+
process.on("SIGTERM", async () => {
|
|
225
|
+
console.error("[MCP] Received SIGTERM, shutting down...");
|
|
226
|
+
await server.close();
|
|
227
|
+
process.exit(0);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
console.error("[MCP] Fatal error:", error);
|
|
232
|
+
if (error instanceof Error) {
|
|
233
|
+
console.error("[MCP] Error stack:", error.stack);
|
|
234
|
+
}
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface ServerConfig {
|
|
2
|
+
token: string;
|
|
3
|
+
}
|
|
4
|
+
export interface McpKeyValidationResult {
|
|
5
|
+
isValid: boolean;
|
|
6
|
+
error?: string;
|
|
7
|
+
organization?: string;
|
|
8
|
+
project?: string;
|
|
9
|
+
userId?: string;
|
|
10
|
+
remainingUsage?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface FeedbackQueryParams {
|
|
13
|
+
status?: string;
|
|
14
|
+
priority?: string;
|
|
15
|
+
type?: string;
|
|
16
|
+
page?: number;
|
|
17
|
+
limit?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ScanIssuesQueryParams {
|
|
20
|
+
severity?: string;
|
|
21
|
+
type?: string;
|
|
22
|
+
status?: string;
|
|
23
|
+
page?: number;
|
|
24
|
+
pageSize?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface AnalyzeDebugRequest {
|
|
27
|
+
debugDataUrl?: string;
|
|
28
|
+
feedbackId?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface AnalyzeDebugResponse {
|
|
31
|
+
network_errors: unknown[];
|
|
32
|
+
performance_issues: unknown[];
|
|
33
|
+
console_logs: unknown[];
|
|
34
|
+
userActions: unknown[];
|
|
35
|
+
duration?: string;
|
|
36
|
+
startedFrom?: string;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,kBAAkB,EAAE,OAAO,EAAE,CAAC;IAC9B,YAAY,EAAE,OAAO,EAAE,CAAC;IACxB,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rectify-so/mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Rectify MCP Server for IDE integration",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"rectify-mcp": "./dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "cross-env NODE_ENV=development tsx src/cli.ts",
|
|
13
|
+
"start": "node dist/cli.js"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://app.rectify.so",
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@modelcontextprotocol/sdk": "1.20.1",
|
|
18
|
+
"axios": "^1.7.9",
|
|
19
|
+
"commander": "^12.0.0"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/node": "^22.13.4",
|
|
23
|
+
"cross-env": "7.0.3",
|
|
24
|
+
"tsx": "4.20.6",
|
|
25
|
+
"typescript": "^5.7.3"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist/**/*",
|
|
29
|
+
"README.md"
|
|
30
|
+
],
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18.0.0"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"mcp",
|
|
36
|
+
"rectify",
|
|
37
|
+
"ide",
|
|
38
|
+
"integration",
|
|
39
|
+
"feedback",
|
|
40
|
+
"scan"
|
|
41
|
+
],
|
|
42
|
+
"author": "Rectify",
|
|
43
|
+
"license": "MIT",
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public"
|
|
46
|
+
}
|
|
47
|
+
}
|