mcp-perforce-server 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/LICENSE +21 -0
- package/MCP_CONFIG_EXAMPLES.md +205 -0
- package/README.md +224 -0
- package/dist/p4/config.d.ts +67 -0
- package/dist/p4/config.d.ts.map +1 -0
- package/dist/p4/config.js +259 -0
- package/dist/p4/config.js.map +1 -0
- package/dist/p4/parse.d.ts +39 -0
- package/dist/p4/parse.d.ts.map +1 -0
- package/dist/p4/parse.js +286 -0
- package/dist/p4/parse.js.map +1 -0
- package/dist/p4/runner.d.ts +45 -0
- package/dist/p4/runner.d.ts.map +1 -0
- package/dist/p4/runner.js +303 -0
- package/dist/p4/runner.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +562 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/basic.d.ts +79 -0
- package/dist/tools/basic.d.ts.map +1 -0
- package/dist/tools/basic.js +401 -0
- package/dist/tools/basic.js.map +1 -0
- package/dist/tools/changelist.d.ts +50 -0
- package/dist/tools/changelist.d.ts.map +1 -0
- package/dist/tools/changelist.js +469 -0
- package/dist/tools/changelist.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +28 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/utils.d.ts +32 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +164 -0
- package/dist/tools/utils.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Additional utility tools for MCP Perforce server
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.p4Filelog = p4Filelog;
|
|
40
|
+
exports.p4Clients = p4Clients;
|
|
41
|
+
exports.p4ConfigDetect = p4ConfigDetect;
|
|
42
|
+
const parse = __importStar(require("../p4/parse.js"));
|
|
43
|
+
/**
|
|
44
|
+
* p4 filelog - Show file history
|
|
45
|
+
*/
|
|
46
|
+
async function p4Filelog(context, args) {
|
|
47
|
+
if (!args.filespec) {
|
|
48
|
+
return {
|
|
49
|
+
ok: false,
|
|
50
|
+
command: 'filelog',
|
|
51
|
+
args: [],
|
|
52
|
+
cwd: process.cwd(),
|
|
53
|
+
configUsed: {},
|
|
54
|
+
error: {
|
|
55
|
+
code: 'P4_INVALID_ARGS',
|
|
56
|
+
message: 'filespec parameter is required',
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const { cwd, env, configResult } = await context.config.setupForCommand(args.workspacePath);
|
|
61
|
+
const cmdArgs = [];
|
|
62
|
+
if (args.maxRevisions && args.maxRevisions > 0) {
|
|
63
|
+
cmdArgs.push('-m', args.maxRevisions.toString());
|
|
64
|
+
}
|
|
65
|
+
cmdArgs.push(args.filespec);
|
|
66
|
+
const result = await context.runner.run('filelog', cmdArgs, cwd, {
|
|
67
|
+
env,
|
|
68
|
+
useZtag: false,
|
|
69
|
+
parseOutput: true,
|
|
70
|
+
});
|
|
71
|
+
if (result.ok && result.result) {
|
|
72
|
+
result.result = parse.parseFilelogOutput(result.result);
|
|
73
|
+
}
|
|
74
|
+
result.configUsed = {
|
|
75
|
+
...result.configUsed,
|
|
76
|
+
p4configPath: configResult.configPath,
|
|
77
|
+
};
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* p4 clients - List Perforce clients/workspaces
|
|
82
|
+
*/
|
|
83
|
+
async function p4Clients(context, args = {}) {
|
|
84
|
+
const { cwd, env, configResult } = await context.config.setupForCommand(args.workspacePath);
|
|
85
|
+
const cmdArgs = [];
|
|
86
|
+
if (args.user) {
|
|
87
|
+
cmdArgs.push('-u', args.user);
|
|
88
|
+
}
|
|
89
|
+
const result = await context.runner.run('clients', cmdArgs, cwd, {
|
|
90
|
+
env,
|
|
91
|
+
useZtag: false,
|
|
92
|
+
parseOutput: true,
|
|
93
|
+
});
|
|
94
|
+
if (result.ok && result.result) {
|
|
95
|
+
result.result = parse.parseClientsOutput(result.result);
|
|
96
|
+
}
|
|
97
|
+
result.configUsed = {
|
|
98
|
+
...result.configUsed,
|
|
99
|
+
p4configPath: configResult.configPath,
|
|
100
|
+
};
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* p4.config.detect - Detect and show Perforce configuration
|
|
105
|
+
*/
|
|
106
|
+
async function p4ConfigDetect(context, args = {}) {
|
|
107
|
+
const startPath = args.workspacePath || process.cwd();
|
|
108
|
+
try {
|
|
109
|
+
const configResult = await context.config.findConfig(startPath);
|
|
110
|
+
const validation = context.config.validateEnvironment(configResult);
|
|
111
|
+
// Get MCP environment variables
|
|
112
|
+
const mcpEnv = {};
|
|
113
|
+
const p4Keys = ['P4PORT', 'P4USER', 'P4CLIENT', 'P4CHARSET', 'P4PASSWD'];
|
|
114
|
+
for (const key of p4Keys) {
|
|
115
|
+
if (process.env[key]) {
|
|
116
|
+
mcpEnv[key] = process.env[key];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const result = {
|
|
120
|
+
ok: true,
|
|
121
|
+
command: 'config.detect',
|
|
122
|
+
args: [],
|
|
123
|
+
cwd: startPath,
|
|
124
|
+
configUsed: {
|
|
125
|
+
p4configPath: configResult.configPath,
|
|
126
|
+
...configResult.environment,
|
|
127
|
+
},
|
|
128
|
+
result: {
|
|
129
|
+
found: configResult.found,
|
|
130
|
+
configPath: configResult.configPath,
|
|
131
|
+
projectRoot: configResult.projectRoot,
|
|
132
|
+
config: configResult.config,
|
|
133
|
+
environment: configResult.environment,
|
|
134
|
+
mcpEnvironment: mcpEnv,
|
|
135
|
+
validation: {
|
|
136
|
+
valid: validation.valid,
|
|
137
|
+
errors: validation.errors,
|
|
138
|
+
},
|
|
139
|
+
searchPath: startPath,
|
|
140
|
+
configurationSource: configResult.found ? '.p4config file' :
|
|
141
|
+
Object.keys(mcpEnv).length > 0 ? 'MCP environment variables' :
|
|
142
|
+
'none',
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
if (!validation.valid) {
|
|
146
|
+
result.warnings = validation.errors;
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
return {
|
|
152
|
+
ok: false,
|
|
153
|
+
command: 'config.detect',
|
|
154
|
+
args: [],
|
|
155
|
+
cwd: startPath,
|
|
156
|
+
configUsed: {},
|
|
157
|
+
error: {
|
|
158
|
+
code: 'P4_CONFIG_NOT_FOUND',
|
|
159
|
+
message: `Failed to detect configuration: ${error}`,
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-perforce-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Enterprise-grade MCP (Model Context Protocol) server for Perforce P4 integration with AI assistants like Claude, ChatGPT, and VS Code. Created by Pratik Bhuite using vibe coding to solve real-world Perforce automation challenges. Open source, customizable, and community-driven.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"model-context-protocol",
|
|
8
|
+
"perforce",
|
|
9
|
+
"p4",
|
|
10
|
+
"p4v",
|
|
11
|
+
"vcs",
|
|
12
|
+
"version-control",
|
|
13
|
+
"ai",
|
|
14
|
+
"automation",
|
|
15
|
+
"claude",
|
|
16
|
+
"chatgpt",
|
|
17
|
+
"vscode",
|
|
18
|
+
"cursor",
|
|
19
|
+
"anthropic",
|
|
20
|
+
"openai",
|
|
21
|
+
"git",
|
|
22
|
+
"scm",
|
|
23
|
+
"devops",
|
|
24
|
+
"enterprise",
|
|
25
|
+
"developer-tools",
|
|
26
|
+
"code-assistant",
|
|
27
|
+
"ai-integration",
|
|
28
|
+
"workflow-automation",
|
|
29
|
+
"typescript",
|
|
30
|
+
"cross-platform",
|
|
31
|
+
"windows",
|
|
32
|
+
"macos",
|
|
33
|
+
"linux",
|
|
34
|
+
"production-ready",
|
|
35
|
+
"secure",
|
|
36
|
+
"open-source",
|
|
37
|
+
"community",
|
|
38
|
+
"customizable",
|
|
39
|
+
"vibe-coding"
|
|
40
|
+
],
|
|
41
|
+
"homepage": "https://github.com/iPraBhu/mcp-perforce-server#readme",
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/iPraBhu/mcp-perforce-server/issues"
|
|
44
|
+
},
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "git+https://github.com/iPraBhu/mcp-perforce-server.git"
|
|
48
|
+
},
|
|
49
|
+
"license": "MIT",
|
|
50
|
+
"author": "Pratik Bhuite (https://github.com/iPraBhu)",
|
|
51
|
+
"type": "commonjs",
|
|
52
|
+
"main": "dist/server.js",
|
|
53
|
+
"types": "./dist/server.d.ts",
|
|
54
|
+
"bin": {
|
|
55
|
+
"mcp-perforce-server": "dist/server.js"
|
|
56
|
+
},
|
|
57
|
+
"files": [
|
|
58
|
+
"dist/**/*",
|
|
59
|
+
"README.md",
|
|
60
|
+
"MCP_CONFIG_EXAMPLES.md",
|
|
61
|
+
"LICENSE"
|
|
62
|
+
],
|
|
63
|
+
"scripts": {
|
|
64
|
+
"build": "tsc",
|
|
65
|
+
"dev": "tsc && node dist/server.js",
|
|
66
|
+
"start": "node dist/server.js",
|
|
67
|
+
"watch": "tsc --watch",
|
|
68
|
+
"clean": "rimraf dist",
|
|
69
|
+
"test": "node test-server.js",
|
|
70
|
+
"prepare": "npm run build",
|
|
71
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
72
|
+
},
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@types/node": "^20.0.0",
|
|
78
|
+
"rimraf": "^5.0.0",
|
|
79
|
+
"typescript": "^5.0.0"
|
|
80
|
+
},
|
|
81
|
+
"engines": {
|
|
82
|
+
"node": ">=18.0.0"
|
|
83
|
+
},
|
|
84
|
+
"publishConfig": {
|
|
85
|
+
"access": "public"
|
|
86
|
+
}
|
|
87
|
+
}
|