codex-skills-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 +221 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +95 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +160 -0
- package/dist/index.js.map +1 -0
- package/dist/loader/index.d.ts +68 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +246 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/remote/github.d.ts +14 -0
- package/dist/remote/github.d.ts.map +1 -0
- package/dist/remote/github.js +90 -0
- package/dist/remote/github.js.map +1 -0
- package/dist/search/index.d.ts +45 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +149 -0
- package/dist/search/index.js.map +1 -0
- package/dist/tools/list-categories.d.ts +4 -0
- package/dist/tools/list-categories.d.ts.map +1 -0
- package/dist/tools/list-categories.js +18 -0
- package/dist/tools/list-categories.js.map +1 -0
- package/dist/tools/list-skill-files.d.ts +5 -0
- package/dist/tools/list-skill-files.d.ts.map +1 -0
- package/dist/tools/list-skill-files.js +61 -0
- package/dist/tools/list-skill-files.js.map +1 -0
- package/dist/tools/load-skill-file.d.ts +5 -0
- package/dist/tools/load-skill-file.d.ts.map +1 -0
- package/dist/tools/load-skill-file.js +41 -0
- package/dist/tools/load-skill-file.js.map +1 -0
- package/dist/tools/plan-workflow.d.ts +4 -0
- package/dist/tools/plan-workflow.d.ts.map +1 -0
- package/dist/tools/plan-workflow.js +53 -0
- package/dist/tools/plan-workflow.js.map +1 -0
- package/dist/tools/read-skill.d.ts +5 -0
- package/dist/tools/read-skill.d.ts.map +1 -0
- package/dist/tools/read-skill.js +100 -0
- package/dist/tools/read-skill.js.map +1 -0
- package/dist/tools/search-skills.d.ts +4 -0
- package/dist/tools/search-skills.d.ts.map +1 -0
- package/dist/tools/search-skills.js +32 -0
- package/dist/tools/search-skills.js.map +1 -0
- package/package.json +39 -0
package/README.md
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# codex-skills-mcp
|
|
2
|
+
|
|
3
|
+
> 🧠 Codex-Skills 技能库的 MCP (Model Context Protocol) Server — 让任意 AI 编程工具都能检索、阅读和使用 170+ 专业技能。
|
|
4
|
+
|
|
5
|
+
## 这是什么
|
|
6
|
+
|
|
7
|
+
一个独立的 MCP Server,为 [codex-skills](https://github.com/Zhan-ZhangZ/codex-skills) 技能库提供标准化的 AI 工具接入协议。
|
|
8
|
+
|
|
9
|
+
| 特性 | 说明 |
|
|
10
|
+
|------|------|
|
|
11
|
+
| **6 个 MCP Tools** | search_skills, read_skill, load_skill_file, list_skill_files, list_categories, plan_workflow |
|
|
12
|
+
| **三层渐进加载** | 检索(~500 tokens) → 阅读(~5K tokens) → 深入(按需) |
|
|
13
|
+
| **中文搜索优化** | CJK bigram 分词 + Leading Words 权重 |
|
|
14
|
+
| **零外部 AI 依赖** | 纯关键词搜索,不需要 embedding 模型 |
|
|
15
|
+
| **双传输模式** | stdio(本地)+ HTTP(远程,适配 ChatGPT 桌面端) |
|
|
16
|
+
|
|
17
|
+
## 快速开始
|
|
18
|
+
|
|
19
|
+
### 1. 安装
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cd codex-skills-mcp
|
|
23
|
+
npm install
|
|
24
|
+
npm run build
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 2. 配置客户端
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
#### ⭐ ChatGPT 桌面端(主要推荐)
|
|
32
|
+
|
|
33
|
+
ChatGPT 桌面端仅支持远程 HTTP 连接,不支持本地 stdio。需要以 HTTP 模式启动 MCP Server,再通过 ngrok 等隧道工具暴露为公网地址。
|
|
34
|
+
|
|
35
|
+
**Step 1:启动 HTTP 模式**
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
node dist/index.js --skills-dir /path/to/codex-skills --http --port 3456
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
启动后会看到:
|
|
42
|
+
```
|
|
43
|
+
[codex-skills-mcp] HTTP server running at http://localhost:3456/mcp
|
|
44
|
+
[codex-skills-mcp] Health check: http://localhost:3456/health
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Step 2:用 ngrok 暴露到公网**
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
ngrok http 3456
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
会得到一个公网地址,如 `https://xxxx-xxxx.ngrok-free.app`
|
|
54
|
+
|
|
55
|
+
**Step 3:在 ChatGPT 桌面端添加 MCP Server**
|
|
56
|
+
|
|
57
|
+
1. 打开 ChatGPT 桌面端 → **Settings** → **Advanced** 或 **Connectors**
|
|
58
|
+
2. 找到 **MCP Servers** / **Apps** 区域
|
|
59
|
+
3. 点击 **Add Server**
|
|
60
|
+
4. 填入 URL:`https://xxxx-xxxx.ngrok-free.app/mcp`
|
|
61
|
+
5. 保存,完成
|
|
62
|
+
|
|
63
|
+
> **💡 提示**:ngrok 免费版每次重启会更换地址。如果需要固定地址,可以使用 ngrok 付费版或其他隧道工具(如 Cloudflare Tunnel)。
|
|
64
|
+
|
|
65
|
+
**验证是否正常运行:**
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# 健康检查
|
|
69
|
+
curl http://localhost:3456/health
|
|
70
|
+
|
|
71
|
+
# 预期输出
|
|
72
|
+
{"status":"ok","name":"codex-skills-mcp","version":"1.0.0","skills":181}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
#### Claude Desktop
|
|
78
|
+
|
|
79
|
+
编辑 `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"mcpServers": {
|
|
84
|
+
"codex-skills": {
|
|
85
|
+
"command": "node",
|
|
86
|
+
"args": [
|
|
87
|
+
"/path/to/codex-skills-mcp/dist/index.js",
|
|
88
|
+
"--skills-dir",
|
|
89
|
+
"/path/to/codex-skills"
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
#### Cursor
|
|
99
|
+
|
|
100
|
+
编辑项目根目录 `.cursor/mcp.json`:
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"mcpServers": {
|
|
105
|
+
"codex-skills": {
|
|
106
|
+
"command": "node",
|
|
107
|
+
"args": [
|
|
108
|
+
"/path/to/codex-skills-mcp/dist/index.js",
|
|
109
|
+
"--skills-dir",
|
|
110
|
+
"/path/to/codex-skills"
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
#### Windsurf / VS Code + Copilot
|
|
120
|
+
|
|
121
|
+
在 MCP 配置中添加同样的 command + args(stdio 模式)。
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
#### 环境变量方式
|
|
126
|
+
|
|
127
|
+
也可以通过环境变量指定技能库路径:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
export CODEX_SKILLS_DIR=/path/to/codex-skills
|
|
131
|
+
# stdio 模式
|
|
132
|
+
node /path/to/codex-skills-mcp/dist/index.js
|
|
133
|
+
# HTTP 模式
|
|
134
|
+
node /path/to/codex-skills-mcp/dist/index.js --http --port 3456
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## 两种运行模式
|
|
138
|
+
|
|
139
|
+
| 模式 | 启动方式 | 适用客户端 |
|
|
140
|
+
|------|---------|-----------|
|
|
141
|
+
| **stdio**(默认) | `node dist/index.js --skills-dir ...` | Claude Desktop, Cursor, Windsurf, VS Code |
|
|
142
|
+
| **HTTP** | `node dist/index.js --skills-dir ... --http --port 3456` | ChatGPT 桌面端, 远程客户端 |
|
|
143
|
+
|
|
144
|
+
## MCP Tools
|
|
145
|
+
|
|
146
|
+
### 🔍 search_skills
|
|
147
|
+
搜索技能库。Agent 的主入口。
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
input: { query: "前端性能优化", category?: "01_代码工程与架构", limit?: 8 }
|
|
151
|
+
output: 按相关度排序的技能列表
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 📖 read_skill
|
|
155
|
+
读取技能的完整指令(SKILL.md)+ 文件结构 + 环境依赖。
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
input: { name: "MediaCrawler" }
|
|
159
|
+
output: { instructions, structure, dependencies }
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 📂 load_skill_file
|
|
163
|
+
按需读取技能内的任意文件。
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
input: { skill_name: "KrillinAI", file_path: "README.md" }
|
|
167
|
+
output: { content, size_bytes }
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 🗂️ list_skill_files
|
|
171
|
+
浏览技能的文件树(不读内容)。
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
input: { skill_name: "remotion-skills", path?: "src", max_depth?: 3 }
|
|
175
|
+
output: 目录树
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 📋 list_categories
|
|
179
|
+
列出所有技能分类和数量。
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
input: {}
|
|
183
|
+
output: 14 个分类 + 各自的技能数量
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 🔗 plan_workflow
|
|
187
|
+
给定任务描述,推荐可组合使用的技能。
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
input: { task_description: "把技术博客做成小红书图文" }
|
|
191
|
+
output: 推荐技能列表 + 分类分组
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## 使用流程
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
用户: "帮我把这个视频翻译成中文字幕"
|
|
198
|
+
|
|
199
|
+
Agent → search_skills("视频字幕翻译")
|
|
200
|
+
→ 命中: KrillinAI, videocut-skills, VideoClaw
|
|
201
|
+
|
|
202
|
+
Agent → read_skill("KrillinAI")
|
|
203
|
+
→ 获取 SKILL.md 指令,了解怎么用
|
|
204
|
+
|
|
205
|
+
Agent → load_skill_file("KrillinAI", "README.md")
|
|
206
|
+
→ 获取详细配置参数
|
|
207
|
+
|
|
208
|
+
Agent → 按 SKILL.md 指令执行任务
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## 技术栈
|
|
212
|
+
|
|
213
|
+
- TypeScript + ESM
|
|
214
|
+
- `@modelcontextprotocol/sdk` v1.12+
|
|
215
|
+
- `express` (仅 HTTP 模式)
|
|
216
|
+
- `zod` 运行时 schema 验证
|
|
217
|
+
- Node.js 18+
|
|
218
|
+
|
|
219
|
+
## License
|
|
220
|
+
|
|
221
|
+
MIT
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface Config {
|
|
2
|
+
skillsDir: string;
|
|
3
|
+
manifestPath: string;
|
|
4
|
+
isRemote: boolean;
|
|
5
|
+
githubRepo?: string;
|
|
6
|
+
githubBranch?: string;
|
|
7
|
+
githubPath?: string;
|
|
8
|
+
githubToken?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse config from CLI args and env vars.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseConfig(args: string[]): Config;
|
|
14
|
+
export interface ManifestEntry {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
category: string;
|
|
18
|
+
folder: string;
|
|
19
|
+
relative_path: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function loadManifest(manifestPath: string): ManifestEntry[];
|
|
22
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAuBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CA4ElD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,EAAE,CAGlE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
/**
|
|
5
|
+
* Helper to extract GitHub token from Git credentials
|
|
6
|
+
*/
|
|
7
|
+
function getGitGithubToken() {
|
|
8
|
+
try {
|
|
9
|
+
const output = execSync('echo "protocol=https\\nhost=github.com\\n" | git credential fill', {
|
|
10
|
+
encoding: "utf-8",
|
|
11
|
+
stdio: ["pipe", "pipe", "ignore"]
|
|
12
|
+
});
|
|
13
|
+
const match = output.match(/^password=(.+)$/m);
|
|
14
|
+
if (match && match[1]) {
|
|
15
|
+
// Don't log the full token
|
|
16
|
+
console.error("[codex-skills-mcp] Auto-detected GitHub token from Git credentials");
|
|
17
|
+
return match[1].trim();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
// Ignore errors (git not installed or no credentials)
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse config from CLI args and env vars.
|
|
27
|
+
*/
|
|
28
|
+
export function parseConfig(args) {
|
|
29
|
+
let skillsDir;
|
|
30
|
+
// Parse github arguments
|
|
31
|
+
const getArg = (flag) => {
|
|
32
|
+
const idx = args.indexOf(flag);
|
|
33
|
+
return idx !== -1 && args[idx + 1] ? args[idx + 1] : undefined;
|
|
34
|
+
};
|
|
35
|
+
const githubRepo = getArg("--github-repo");
|
|
36
|
+
const githubBranch = getArg("--github-branch") || "main-lite";
|
|
37
|
+
const githubPath = getArg("--github-path") || "codex-skills";
|
|
38
|
+
let githubToken = getArg("--github-token");
|
|
39
|
+
// Fallback to valid ENV token
|
|
40
|
+
if (!githubToken && process.env.GITHUB_TOKEN && process.env.GITHUB_TOKEN !== "github_pat_antigravitydummytoken") {
|
|
41
|
+
githubToken = process.env.GITHUB_TOKEN;
|
|
42
|
+
}
|
|
43
|
+
// Fallback to Git credentials
|
|
44
|
+
if (!githubToken) {
|
|
45
|
+
githubToken = getGitGithubToken();
|
|
46
|
+
}
|
|
47
|
+
const isRemote = !!githubRepo;
|
|
48
|
+
if (isRemote) {
|
|
49
|
+
skillsDir = resolve(process.cwd(), ".codex-skills-cache");
|
|
50
|
+
if (!existsSync(skillsDir)) {
|
|
51
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Local mode logic
|
|
56
|
+
const dirIdx = args.indexOf("--skills-dir");
|
|
57
|
+
if (dirIdx !== -1 && args[dirIdx + 1]) {
|
|
58
|
+
skillsDir = resolve(args[dirIdx + 1]);
|
|
59
|
+
}
|
|
60
|
+
if (!skillsDir && process.env.CODEX_SKILLS_DIR) {
|
|
61
|
+
skillsDir = resolve(process.env.CODEX_SKILLS_DIR);
|
|
62
|
+
}
|
|
63
|
+
if (!skillsDir) {
|
|
64
|
+
const cwd = process.cwd();
|
|
65
|
+
if (existsSync(resolve(cwd, "skills_manifest.json"))) {
|
|
66
|
+
skillsDir = cwd;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!skillsDir) {
|
|
70
|
+
console.error("Error: Skills directory not found.\n" +
|
|
71
|
+
"Specify via --skills-dir <path> or CODEX_SKILLS_DIR env var.\n" +
|
|
72
|
+
"The directory must contain skills_manifest.json.");
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const manifestPath = resolve(skillsDir, "skills_manifest.json");
|
|
77
|
+
if (!isRemote && !existsSync(manifestPath)) {
|
|
78
|
+
console.error(`Error: skills_manifest.json not found in ${skillsDir}`);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
skillsDir,
|
|
83
|
+
manifestPath,
|
|
84
|
+
isRemote,
|
|
85
|
+
githubRepo,
|
|
86
|
+
githubBranch,
|
|
87
|
+
githubPath,
|
|
88
|
+
githubToken
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export function loadManifest(manifestPath) {
|
|
92
|
+
const raw = readFileSync(manifestPath, "utf-8");
|
|
93
|
+
return JSON.parse(raw);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Codex-Skills MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides intelligent search, read, and orchestration of the codex-skills
|
|
6
|
+
* library via the Model Context Protocol (MCP).
|
|
7
|
+
*
|
|
8
|
+
* Supports two transport modes:
|
|
9
|
+
* 1. stdio (default) — for Claude Desktop, Cursor, Windsurf etc.
|
|
10
|
+
* 2. HTTP (--http) — for ChatGPT desktop app and other remote clients
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* # stdio mode (default)
|
|
14
|
+
* node dist/index.js --skills-dir /path/to/codex-skills
|
|
15
|
+
*
|
|
16
|
+
* # HTTP mode (for ChatGPT desktop)
|
|
17
|
+
* node dist/index.js --skills-dir /path/to/codex-skills --http --port 3456
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;GAgBG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Codex-Skills MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides intelligent search, read, and orchestration of the codex-skills
|
|
6
|
+
* library via the Model Context Protocol (MCP).
|
|
7
|
+
*
|
|
8
|
+
* Supports two transport modes:
|
|
9
|
+
* 1. stdio (default) — for Claude Desktop, Cursor, Windsurf etc.
|
|
10
|
+
* 2. HTTP (--http) — for ChatGPT desktop app and other remote clients
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* # stdio mode (default)
|
|
14
|
+
* node dist/index.js --skills-dir /path/to/codex-skills
|
|
15
|
+
*
|
|
16
|
+
* # HTTP mode (for ChatGPT desktop)
|
|
17
|
+
* node dist/index.js --skills-dir /path/to/codex-skills --http --port 3456
|
|
18
|
+
*/
|
|
19
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
20
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
21
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
22
|
+
import { parseConfig, loadManifest } from "./config.js";
|
|
23
|
+
import { SkillSearchEngine } from "./search/index.js";
|
|
24
|
+
import { SkillLoader } from "./loader/index.js";
|
|
25
|
+
import { registerSearchSkills } from "./tools/search-skills.js";
|
|
26
|
+
import { registerListCategories } from "./tools/list-categories.js";
|
|
27
|
+
import { registerReadSkill } from "./tools/read-skill.js";
|
|
28
|
+
import { registerLoadSkillFile } from "./tools/load-skill-file.js";
|
|
29
|
+
import { registerListSkillFiles } from "./tools/list-skill-files.js";
|
|
30
|
+
import { registerPlanWorkflow } from "./tools/plan-workflow.js";
|
|
31
|
+
function createServer(searchEngine, loader) {
|
|
32
|
+
const server = new McpServer({
|
|
33
|
+
name: "codex-skills",
|
|
34
|
+
version: "1.0.0",
|
|
35
|
+
});
|
|
36
|
+
registerSearchSkills(server, searchEngine);
|
|
37
|
+
registerListCategories(server, searchEngine);
|
|
38
|
+
registerReadSkill(server, searchEngine, loader);
|
|
39
|
+
registerLoadSkillFile(server, searchEngine, loader);
|
|
40
|
+
registerListSkillFiles(server, searchEngine, loader);
|
|
41
|
+
registerPlanWorkflow(server, searchEngine);
|
|
42
|
+
return server;
|
|
43
|
+
}
|
|
44
|
+
async function startStdio(searchEngine, loader) {
|
|
45
|
+
const server = createServer(searchEngine, loader);
|
|
46
|
+
console.error("[codex-skills-mcp] 6 tools registered, starting stdio server...");
|
|
47
|
+
const transport = new StdioServerTransport();
|
|
48
|
+
await server.connect(transport);
|
|
49
|
+
console.error("[codex-skills-mcp] Server running on stdio");
|
|
50
|
+
}
|
|
51
|
+
async function startHTTP(searchEngine, loader, port) {
|
|
52
|
+
// Dynamic import to avoid loading express in stdio mode
|
|
53
|
+
const { default: express } = await import("express");
|
|
54
|
+
const app = express();
|
|
55
|
+
app.use(express.json());
|
|
56
|
+
// Store transports for session management
|
|
57
|
+
const transports = new Map();
|
|
58
|
+
// MCP endpoint — handles POST (messages) and GET (SSE stream) and DELETE (session close)
|
|
59
|
+
app.post("/mcp", async (req, res) => {
|
|
60
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
61
|
+
let transport;
|
|
62
|
+
if (sessionId && transports.has(sessionId)) {
|
|
63
|
+
transport = transports.get(sessionId);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// New session
|
|
67
|
+
transport = new StreamableHTTPServerTransport({
|
|
68
|
+
sessionIdGenerator: () => crypto.randomUUID(),
|
|
69
|
+
onsessioninitialized: (sid) => {
|
|
70
|
+
transports.set(sid, transport);
|
|
71
|
+
console.error(`[codex-skills-mcp] New session: ${sid}`);
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
transport.onclose = () => {
|
|
75
|
+
const sid = transport.sessionId;
|
|
76
|
+
if (sid)
|
|
77
|
+
transports.delete(sid);
|
|
78
|
+
};
|
|
79
|
+
// Each session gets its own server instance
|
|
80
|
+
const server = createServer(searchEngine, loader);
|
|
81
|
+
await server.connect(transport);
|
|
82
|
+
}
|
|
83
|
+
await transport.handleRequest(req, res, req.body);
|
|
84
|
+
});
|
|
85
|
+
// GET endpoint for SSE stream (needed by some clients)
|
|
86
|
+
app.get("/mcp", async (req, res) => {
|
|
87
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
88
|
+
if (!sessionId || !transports.has(sessionId)) {
|
|
89
|
+
res.status(400).json({ error: "Invalid or missing session ID" });
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const transport = transports.get(sessionId);
|
|
93
|
+
await transport.handleRequest(req, res);
|
|
94
|
+
});
|
|
95
|
+
// DELETE endpoint for session cleanup
|
|
96
|
+
app.delete("/mcp", async (req, res) => {
|
|
97
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
98
|
+
if (sessionId && transports.has(sessionId)) {
|
|
99
|
+
const transport = transports.get(sessionId);
|
|
100
|
+
await transport.handleRequest(req, res);
|
|
101
|
+
transports.delete(sessionId);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
res.status(200).end();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
// Health check
|
|
108
|
+
app.get("/health", (_req, res) => {
|
|
109
|
+
res.json({
|
|
110
|
+
status: "ok",
|
|
111
|
+
name: "codex-skills-mcp",
|
|
112
|
+
version: "1.0.0",
|
|
113
|
+
skills: searchEngine.getCategories().reduce((s, c) => s + c.skill_count, 0),
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
console.error("[codex-skills-mcp] 6 tools registered, starting HTTP server...");
|
|
117
|
+
app.listen(port, () => {
|
|
118
|
+
console.error(`[codex-skills-mcp] HTTP server running at http://localhost:${port}/mcp`);
|
|
119
|
+
console.error(`[codex-skills-mcp] Health check: http://localhost:${port}/health`);
|
|
120
|
+
console.error(`[codex-skills-mcp] For ChatGPT desktop: use ngrok or similar to expose this endpoint`);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async function main() {
|
|
124
|
+
const args = process.argv.slice(2);
|
|
125
|
+
// Parse configuration
|
|
126
|
+
const config = parseConfig(args);
|
|
127
|
+
if (config.isRemote) {
|
|
128
|
+
const { initRemote, fetchManifest } = await import("./remote/github.js");
|
|
129
|
+
console.error("[codex-skills-mcp] Initializing remote GitHub fetching...");
|
|
130
|
+
await initRemote(config);
|
|
131
|
+
await fetchManifest(config);
|
|
132
|
+
}
|
|
133
|
+
// Load manifest
|
|
134
|
+
console.error(`[codex-skills-mcp] Loading manifest from: ${config.manifestPath}`);
|
|
135
|
+
const manifest = loadManifest(config.manifestPath);
|
|
136
|
+
console.error(`[codex-skills-mcp] Loaded ${manifest.length} skills`);
|
|
137
|
+
// Build search index
|
|
138
|
+
const searchEngine = new SkillSearchEngine(manifest);
|
|
139
|
+
const categories = searchEngine.getCategories();
|
|
140
|
+
console.error(`[codex-skills-mcp] Index built: ${categories.length} categories, ` +
|
|
141
|
+
`${categories.reduce((s, c) => s + c.skill_count, 0)} indexed skills`);
|
|
142
|
+
// Create skill loader
|
|
143
|
+
const loader = new SkillLoader(config, manifest);
|
|
144
|
+
// Determine transport mode
|
|
145
|
+
const useHTTP = args.includes("--http");
|
|
146
|
+
if (useHTTP) {
|
|
147
|
+
// Parse port
|
|
148
|
+
const portIdx = args.indexOf("--port");
|
|
149
|
+
const port = portIdx !== -1 && args[portIdx + 1] ? parseInt(args[portIdx + 1], 10) : 3456;
|
|
150
|
+
await startHTTP(searchEngine, loader, port);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
await startStdio(searchEngine, loader);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
main().catch((err) => {
|
|
157
|
+
console.error("[codex-skills-mcp] Fatal error:", err);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
});
|
|
160
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { ManifestEntry, Config } from "../config.js";
|
|
2
|
+
export interface SkillStructure {
|
|
3
|
+
files: FileNode[];
|
|
4
|
+
sub_skills: SubSkillInfo[];
|
|
5
|
+
}
|
|
6
|
+
export interface FileNode {
|
|
7
|
+
name: string;
|
|
8
|
+
type: "file" | "directory";
|
|
9
|
+
size_bytes?: number;
|
|
10
|
+
children?: FileNode[];
|
|
11
|
+
}
|
|
12
|
+
export interface SubSkillInfo {
|
|
13
|
+
name: string;
|
|
14
|
+
path: string;
|
|
15
|
+
description: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SkillDependencies {
|
|
18
|
+
language: string;
|
|
19
|
+
package_manager?: string;
|
|
20
|
+
setup_command?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ReadSkillResult {
|
|
23
|
+
instructions: string;
|
|
24
|
+
structure: SkillStructure;
|
|
25
|
+
dependencies: SkillDependencies;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Skill loader — reads SKILL.md, scans structure, detects dependencies.
|
|
29
|
+
*/
|
|
30
|
+
export declare class SkillLoader {
|
|
31
|
+
private config;
|
|
32
|
+
private manifest;
|
|
33
|
+
private skillsDir;
|
|
34
|
+
constructor(config: Config, manifest: ManifestEntry[]);
|
|
35
|
+
/**
|
|
36
|
+
* Resolve the absolute filesystem path for a skill.
|
|
37
|
+
*/
|
|
38
|
+
resolveSkillPath(entry: ManifestEntry): string;
|
|
39
|
+
/**
|
|
40
|
+
* Read a skill's SKILL.md + structure + dependencies.
|
|
41
|
+
*/
|
|
42
|
+
readSkill(entry: ManifestEntry): Promise<ReadSkillResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Scan the file tree of a skill (max depth 2 by default).
|
|
45
|
+
*/
|
|
46
|
+
scanStructure(dirPath: string, entry: ManifestEntry, maxDepth?: number): SkillStructure;
|
|
47
|
+
private scanDirectory;
|
|
48
|
+
/**
|
|
49
|
+
* Recursively find sub-skill SKILL.md files (not the root one).
|
|
50
|
+
*/
|
|
51
|
+
private findSubSkills;
|
|
52
|
+
/**
|
|
53
|
+
* Detect language and package manager from project files.
|
|
54
|
+
*/
|
|
55
|
+
private detectDependencies;
|
|
56
|
+
/**
|
|
57
|
+
* Load a specific file from within a skill directory.
|
|
58
|
+
*/
|
|
59
|
+
loadSkillFile(entry: ManifestEntry, filePath: string): Promise<{
|
|
60
|
+
content: string;
|
|
61
|
+
size_bytes: number;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* List files in a subdirectory of a skill.
|
|
65
|
+
*/
|
|
66
|
+
listSkillFiles(entry: ManifestEntry, subPath?: string, maxDepth?: number): Promise<FileNode[]>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/loader/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG1D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,UAAU,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,cAAc,CAAC;IAC1B,YAAY,EAAE,iBAAiB,CAAC;CACjC;AAYD;;GAEG;AACH,qBAAa,WAAW;IAIpB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAJlB,OAAO,CAAC,SAAS,CAAS;gBAGhB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,aAAa,EAAE;IAKnC;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM;IAM9C;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAyB/D;;OAEG;IACH,aAAa,CACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,EACpB,QAAQ,GAAE,MAAU,GACnB,cAAc;IAUjB,OAAO,CAAC,aAAa;IA+CrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAuCrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8C1B;;OAEG;IACG,aAAa,CACjB,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAiDnD;;OAEG;IACG,cAAc,CAClB,KAAK,EAAE,aAAa,EACpB,OAAO,GAAE,MAAW,EACpB,QAAQ,GAAE,MAAU,GACnB,OAAO,CAAC,QAAQ,EAAE,CAAC;CAmBvB"}
|