@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 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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,2 @@
1
+ export declare const BASE_URL: string;
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -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,2 @@
1
+ export const BASE_URL = 'http://localhost:8080';
2
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAW,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ServerConfig } from "./types.js";
2
+ export declare function startServer(config: ServerConfig): Promise<void>;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -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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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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
+ }