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.
Files changed (46) hide show
  1. package/README.md +221 -0
  2. package/dist/config.d.ts +22 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +95 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/index.d.ts +20 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +160 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/loader/index.d.ts +68 -0
  11. package/dist/loader/index.d.ts.map +1 -0
  12. package/dist/loader/index.js +246 -0
  13. package/dist/loader/index.js.map +1 -0
  14. package/dist/remote/github.d.ts +14 -0
  15. package/dist/remote/github.d.ts.map +1 -0
  16. package/dist/remote/github.js +90 -0
  17. package/dist/remote/github.js.map +1 -0
  18. package/dist/search/index.d.ts +45 -0
  19. package/dist/search/index.d.ts.map +1 -0
  20. package/dist/search/index.js +149 -0
  21. package/dist/search/index.js.map +1 -0
  22. package/dist/tools/list-categories.d.ts +4 -0
  23. package/dist/tools/list-categories.d.ts.map +1 -0
  24. package/dist/tools/list-categories.js +18 -0
  25. package/dist/tools/list-categories.js.map +1 -0
  26. package/dist/tools/list-skill-files.d.ts +5 -0
  27. package/dist/tools/list-skill-files.d.ts.map +1 -0
  28. package/dist/tools/list-skill-files.js +61 -0
  29. package/dist/tools/list-skill-files.js.map +1 -0
  30. package/dist/tools/load-skill-file.d.ts +5 -0
  31. package/dist/tools/load-skill-file.d.ts.map +1 -0
  32. package/dist/tools/load-skill-file.js +41 -0
  33. package/dist/tools/load-skill-file.js.map +1 -0
  34. package/dist/tools/plan-workflow.d.ts +4 -0
  35. package/dist/tools/plan-workflow.d.ts.map +1 -0
  36. package/dist/tools/plan-workflow.js +53 -0
  37. package/dist/tools/plan-workflow.js.map +1 -0
  38. package/dist/tools/read-skill.d.ts +5 -0
  39. package/dist/tools/read-skill.d.ts.map +1 -0
  40. package/dist/tools/read-skill.js +100 -0
  41. package/dist/tools/read-skill.js.map +1 -0
  42. package/dist/tools/search-skills.d.ts +4 -0
  43. package/dist/tools/search-skills.d.ts.map +1 -0
  44. package/dist/tools/search-skills.js +32 -0
  45. package/dist/tools/search-skills.js.map +1 -0
  46. 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
@@ -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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"}
@@ -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"}