restricted-github-mcp 1.0.7 → 1.0.8
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 +9 -2
- package/dist/index.js +35 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,9 +10,13 @@ Contrairement aux serveurs GitHub classiques, celui-ci ne propose que deux outil
|
|
|
10
10
|
1. Exécute `git add .` (ajoute tous les fichiers modifiés et nouveaux).
|
|
11
11
|
2. Crée un commit avec le message fourni.
|
|
12
12
|
3. Pousse automatiquement vers la branche cible définie dans la configuration.
|
|
13
|
+
*Argument optionnel : `repo_path` (permet à l'IA de spécifier le dossier si différent de la config).*
|
|
13
14
|
- **`pull_request`** :
|
|
14
15
|
1. Crée une Pull Request sur GitHub.
|
|
15
16
|
2. Utilise automatiquement la branche de destination (`TARGET_BRANCH`) et la branche de base (`BASE_BRANCH`) configurées.
|
|
17
|
+
- **`get_info`** :
|
|
18
|
+
1. Renvoie la configuration actuelle (dépôt, branches, chemin local).
|
|
19
|
+
2. Utile pour vérifier que l'agent est sur le bon contexte sans exposer de secrets.
|
|
16
20
|
|
|
17
21
|
## 🛠️ Installation & Utilisation via npx
|
|
18
22
|
|
|
@@ -32,6 +36,7 @@ Le serveur se configure exclusivement via des variables d'environnement. Ces var
|
|
|
32
36
|
| `TARGET_REPO` | Le dépôt cible au format `propriétaire/nom` | `MonPseudo/mon-expose` |
|
|
33
37
|
| `TARGET_BRANCH` | La branche sur laquelle le code doit être poussé | `feature/test` |
|
|
34
38
|
| `BASE_BRANCH` | (Optionnel) La branche de destination pour la PR | `main` (défaut) |
|
|
39
|
+
| `REPO_PATH` | (Optionnel) Le chemin local du dépôt Git | `/chemin/vers/projet` |
|
|
35
40
|
| `READ_ONLY` | (Optionnel) Désactive les actions d'écriture | `false` (défaut) |
|
|
36
41
|
|
|
37
42
|
## 🖥️ Exemple de Configuration MCP
|
|
@@ -52,7 +57,8 @@ Copiez-collez cette configuration dans votre client MCP (ex: `claude_desktop_con
|
|
|
52
57
|
"GITHUB_TOKEN": "votre_token_github_ici",
|
|
53
58
|
"TARGET_REPO": "propriétaire/nom-du-repo",
|
|
54
59
|
"TARGET_BRANCH": "votre-branche-de-travail",
|
|
55
|
-
"BASE_BRANCH": "main"
|
|
60
|
+
"BASE_BRANCH": "main",
|
|
61
|
+
"REPO_PATH": "/chemin/vers/votre/projet/local"
|
|
56
62
|
}
|
|
57
63
|
}
|
|
58
64
|
}
|
|
@@ -73,7 +79,8 @@ Si vous avez cloné le dépôt et exécuté `npm run build` :
|
|
|
73
79
|
"GITHUB_TOKEN": "votre_token_github_ici",
|
|
74
80
|
"TARGET_REPO": "propriétaire/nom-du-repo",
|
|
75
81
|
"TARGET_BRANCH": "votre-branche-de-travail",
|
|
76
|
-
"BASE_BRANCH": "main"
|
|
82
|
+
"BASE_BRANCH": "main",
|
|
83
|
+
"REPO_PATH": "/chemin/vers/votre/projet/local"
|
|
77
84
|
}
|
|
78
85
|
}
|
|
79
86
|
}
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,7 @@ const GITHUB_TOKEN = process.env.GITHUB_TOKEN;
|
|
|
14
14
|
const TARGET_BRANCH = process.env.TARGET_BRANCH;
|
|
15
15
|
const BASE_BRANCH = process.env.BASE_BRANCH || "main";
|
|
16
16
|
const TARGET_REPO = process.env.TARGET_REPO;
|
|
17
|
+
const REPO_PATH = process.env.REPO_PATH || process.cwd();
|
|
17
18
|
const READ_ONLY = process.env.READ_ONLY === "true";
|
|
18
19
|
if (!GITHUB_TOKEN) {
|
|
19
20
|
console.error("GITHUB_TOKEN environment variable is required");
|
|
@@ -36,6 +37,7 @@ const TOOLS = [
|
|
|
36
37
|
type: "object",
|
|
37
38
|
properties: {
|
|
38
39
|
message: { type: "string", description: "The commit message" },
|
|
40
|
+
repo_path: { type: "string", description: "Optional: The local path to the repository (defaults to REPO_PATH env or current directory)" },
|
|
39
41
|
},
|
|
40
42
|
required: ["message"],
|
|
41
43
|
},
|
|
@@ -52,6 +54,14 @@ const TOOLS = [
|
|
|
52
54
|
required: ["title"],
|
|
53
55
|
},
|
|
54
56
|
},
|
|
57
|
+
{
|
|
58
|
+
name: "get_info",
|
|
59
|
+
description: "Get the current configuration of the server (excluding sensitive tokens)",
|
|
60
|
+
inputSchema: {
|
|
61
|
+
type: "object",
|
|
62
|
+
properties: {},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
55
65
|
];
|
|
56
66
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
57
67
|
tools: TOOLS,
|
|
@@ -63,20 +73,22 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
63
73
|
case "push": {
|
|
64
74
|
if (READ_ONLY)
|
|
65
75
|
throw new Error("Server is in read-only mode");
|
|
66
|
-
const { message } = args;
|
|
76
|
+
const { message, repo_path } = args;
|
|
77
|
+
const finalRepoPath = repo_path || REPO_PATH;
|
|
78
|
+
const execOptions = { cwd: finalRepoPath };
|
|
67
79
|
if (!TARGET_BRANCH) {
|
|
68
80
|
throw new Error("TARGET_BRANCH environment variable is not defined");
|
|
69
81
|
}
|
|
70
82
|
try {
|
|
71
83
|
// 1. Add all changes (including untracked)
|
|
72
|
-
execSync("git add .");
|
|
84
|
+
execSync("git add .", execOptions);
|
|
73
85
|
// 2. Commit
|
|
74
86
|
try {
|
|
75
|
-
execSync(`git commit -m "${message}"
|
|
87
|
+
execSync(`git commit -m "${message}"`, execOptions);
|
|
76
88
|
}
|
|
77
89
|
catch (e) {
|
|
78
90
|
// Check if there was nothing to commit
|
|
79
|
-
const status = execSync("git status --porcelain").toString();
|
|
91
|
+
const status = execSync("git status --porcelain", execOptions).toString();
|
|
80
92
|
if (status.length === 0) {
|
|
81
93
|
return {
|
|
82
94
|
content: [{ type: "text", text: "Nothing to commit, working tree clean." }],
|
|
@@ -90,13 +102,13 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
90
102
|
const remote = TARGET_REPO && GITHUB_TOKEN
|
|
91
103
|
? `https://x-access-token:${GITHUB_TOKEN}@github.com/${TARGET_REPO}.git`
|
|
92
104
|
: "origin";
|
|
93
|
-
execSync(`git push ${remote} HEAD:${TARGET_BRANCH}
|
|
105
|
+
execSync(`git push ${remote} HEAD:${TARGET_BRANCH}`, execOptions);
|
|
94
106
|
return {
|
|
95
|
-
content: [{ type: "text", text: `Successfully committed and pushed all changes to branch ${TARGET_BRANCH}` }],
|
|
107
|
+
content: [{ type: "text", text: `Successfully committed and pushed all changes to branch ${TARGET_BRANCH} from ${finalRepoPath}` }],
|
|
96
108
|
};
|
|
97
109
|
}
|
|
98
110
|
catch (error) {
|
|
99
|
-
throw new Error(`Git operation failed: ${error.message}`);
|
|
111
|
+
throw new Error(`Git operation failed at ${finalRepoPath}: ${error.message}`);
|
|
100
112
|
}
|
|
101
113
|
}
|
|
102
114
|
case "pull_request": {
|
|
@@ -130,6 +142,22 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
130
142
|
throw new Error(`Failed to create pull request: ${error.message}`);
|
|
131
143
|
}
|
|
132
144
|
}
|
|
145
|
+
case "get_info": {
|
|
146
|
+
const info = {
|
|
147
|
+
TARGET_REPO,
|
|
148
|
+
TARGET_BRANCH,
|
|
149
|
+
BASE_BRANCH,
|
|
150
|
+
REPO_PATH,
|
|
151
|
+
READ_ONLY,
|
|
152
|
+
CURRENT_WORKING_DIR: process.cwd(),
|
|
153
|
+
};
|
|
154
|
+
return {
|
|
155
|
+
content: [{
|
|
156
|
+
type: "text",
|
|
157
|
+
text: `Current Configuration:\n${JSON.stringify(info, null, 2)}`
|
|
158
|
+
}],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
133
161
|
default:
|
|
134
162
|
throw new Error(`Unknown tool: ${name}`);
|
|
135
163
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,oEAAoE;AACpE,wDAAwD;AACxD,0EAA0E;AAC1E,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC;AAC5B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AAChD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC;AACtD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,CAAC;AAEnD,IAAI,CAAC,YAAY,EAAE,CAAC;IAClB,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;AAEpD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,uBAAuB;IAC7B,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,MAAM,KAAK,GAAW;IACpB;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,kJAAkJ;QAC/J,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|