codex-skills-mcp 1.4.1 → 1.5.0-beta.1

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 (44) hide show
  1. package/README.md +11 -0
  2. package/dist/index.js +15 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/openai/mentions.d.ts +30 -0
  5. package/dist/openai/mentions.d.ts.map +1 -0
  6. package/dist/openai/mentions.js +256 -0
  7. package/dist/openai/mentions.js.map +1 -0
  8. package/dist/openai/settings.d.ts +43 -0
  9. package/dist/openai/settings.d.ts.map +1 -0
  10. package/dist/openai/settings.js +201 -0
  11. package/dist/openai/settings.js.map +1 -0
  12. package/dist/remote/github.d.ts +12 -0
  13. package/dist/remote/github.d.ts.map +1 -1
  14. package/dist/remote/github.js +207 -29
  15. package/dist/remote/github.js.map +1 -1
  16. package/dist/search/index.d.ts +19 -0
  17. package/dist/search/index.d.ts.map +1 -1
  18. package/dist/search/index.js +43 -1
  19. package/dist/search/index.js.map +1 -1
  20. package/dist/tools/diagnostics.d.ts.map +1 -1
  21. package/dist/tools/diagnostics.js +1 -1
  22. package/dist/tools/diagnostics.js.map +1 -1
  23. package/dist/tools/list-categories.d.ts.map +1 -1
  24. package/dist/tools/list-categories.js +1 -1
  25. package/dist/tools/list-categories.js.map +1 -1
  26. package/dist/tools/list-skill-files.d.ts.map +1 -1
  27. package/dist/tools/list-skill-files.js +1 -1
  28. package/dist/tools/list-skill-files.js.map +1 -1
  29. package/dist/tools/load-skill-file.d.ts.map +1 -1
  30. package/dist/tools/load-skill-file.js +1 -1
  31. package/dist/tools/load-skill-file.js.map +1 -1
  32. package/dist/tools/plan-workflow.d.ts.map +1 -1
  33. package/dist/tools/plan-workflow.js +1 -1
  34. package/dist/tools/plan-workflow.js.map +1 -1
  35. package/dist/tools/read-skill.d.ts.map +1 -1
  36. package/dist/tools/read-skill.js +1 -1
  37. package/dist/tools/read-skill.js.map +1 -1
  38. package/dist/tools/search-skills.d.ts.map +1 -1
  39. package/dist/tools/search-skills.js +1 -1
  40. package/dist/tools/search-skills.js.map +1 -1
  41. package/dist/tools/skill-status.d.ts.map +1 -1
  42. package/dist/tools/skill-status.js +1 -1
  43. package/dist/tools/skill-status.js.map +1 -1
  44. package/package.json +3 -2
package/README.md CHANGED
@@ -273,6 +273,17 @@ input: { include_log?: true, log_lines?: 20 }
273
273
  output: Server / Manifest / Local skill cache / Recent errors / Recent tool calls
274
274
  ```
275
275
 
276
+ ## OpenAI MCP Extensions(ChatGPT 原生集成 · Phase 1)
277
+
278
+ 基于 [openai/mcp-extensions](https://github.com/openai/mcp-extensions) 规范与官方 SDK 新增,详见 [docs/OPENAI-MCP-EXTENSIONS.md](docs/OPENAI-MCP-EXTENSIONS.md):
279
+
280
+ - **⚙️ `settings.read` / `settings.update`** — ChatGPT 插件详情页的原生设置面板(开关/数字控件)。配置项热生效、原子持久化到 `~/.codex-skills-mcp/settings.json`、重启后自动恢复。
281
+ - **🔄 `refresh_skills_list`** — 设置页按钮型动作:立即刷新远端技能清单。
282
+ - **💬 `search_mentions`** — ChatGPT composer 里 `@技能库` 直接 typeahead 搜索技能(对模型隐藏,仅宿主调用;Codex CLI 实测符合规范)。
283
+ - **📄 `skill://{name}` 资源** — 提及的技能引用经 `resources/read` 解析为 SKILL.md(首读即物化),同时是后续官方 `io.modelcontextprotocol/skills` 扩展的 groundwork。
284
+
285
+ > 兼容性:全部通过 MCP 标准扩展点(`_meta` / capability)实现,非 ChatGPT 宿主(Codex/Claude/Cursor 等)自动忽略,8 个核心工具行为零变化(回归测试覆盖)。
286
+
276
287
  ## 使用流程(示例)
277
288
 
278
289
  ```
package/dist/index.js CHANGED
@@ -19,6 +19,7 @@
19
19
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
20
20
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
21
21
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
22
+ import { OpenAIExtensions } from "@openai/mcp-extensions/server";
22
23
  import { createRequire } from "node:module";
23
24
  import { parseConfig, loadManifest } from "./config.js";
24
25
  import { SkillSearchEngine } from "./search/index.js";
@@ -33,6 +34,8 @@ import { registerListSkillFiles } from "./tools/list-skill-files.js";
33
34
  import { registerPlanWorkflow } from "./tools/plan-workflow.js";
34
35
  import { registerSkillStatus } from "./tools/skill-status.js";
35
36
  import { registerDiagnostics } from "./tools/diagnostics.js";
37
+ import { registerOpenAISettings, applyPersistedSettingsAtStartup } from "./openai/settings.js";
38
+ import { registerOpenAIMentions } from "./openai/mentions.js";
36
39
  // Single source of truth for the version: read package.json instead of
37
40
  // hardcoding it here, so releasing a new version only requires one bump.
38
41
  const require = createRequire(import.meta.url);
@@ -52,11 +55,18 @@ function createServer(config, searchEngine, loader) {
52
55
  registerPlanWorkflow(server, searchEngine, loader);
53
56
  registerSkillStatus(server, searchEngine, loader);
54
57
  registerDiagnostics(server, config, searchEngine, loader, PKG_VERSION);
58
+ // OpenAI MCP Extensions (Phase 1, server-side only — see
59
+ // docs/OPENAI-MCP-EXTENSIONS.md): structured settings + composer mentions.
60
+ // Phase 2: the butler (00_codex_skills) is pinned as the fixed entrance in
61
+ // the @ mention typeahead and the resource catalog.
62
+ const openai = new OpenAIExtensions(server);
63
+ registerOpenAISettings(server, openai, config, searchEngine);
64
+ registerOpenAIMentions(server, openai, config, searchEngine, loader);
55
65
  return server;
56
66
  }
57
67
  async function startStdio(config, searchEngine, loader) {
58
68
  const server = createServer(config, searchEngine, loader);
59
- console.error("[codex-skills-mcp] 8 tools registered, starting stdio server...");
69
+ console.error("[codex-skills-mcp] 12 tools registered (8 core + 4 openai-extension), starting stdio server...");
60
70
  const transport = new StdioServerTransport();
61
71
  await server.connect(transport);
62
72
  console.error("[codex-skills-mcp] Server running on stdio");
@@ -150,7 +160,7 @@ async function startHTTP(config, searchEngine, loader, port) {
150
160
  activeSessions: sessions.size,
151
161
  });
152
162
  });
153
- console.error("[codex-skills-mcp] 8 tools registered, starting HTTP server...");
163
+ console.error("[codex-skills-mcp] 12 tools registered (8 core + 4 openai-extension), starting HTTP server...");
154
164
  app.listen(port, () => {
155
165
  console.error(`[codex-skills-mcp] HTTP server running at http://localhost:${port}/mcp`);
156
166
  console.error(`[codex-skills-mcp] Health check: http://localhost:${port}/health`);
@@ -161,6 +171,9 @@ async function main() {
161
171
  const args = process.argv.slice(2);
162
172
  // Parse configuration
163
173
  const config = parseConfig(args);
174
+ // Overlay user settings persisted via the openai/settings extension so
175
+ // they survive restarts and take effect before remote init / manifest fetch.
176
+ applyPersistedSettingsAtStartup(config);
164
177
  if (config.isRemote) {
165
178
  // Activity log lives under <cacheDir>/logs (remote mode only, so local
166
179
  // skill libraries are never polluted). See docs/IMPROVEMENT-PLAN.md §7.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * OpenAI MCP Extensions — Composer At-Mentions
3
+ *
4
+ * Implements the `mentions/search` extension from
5
+ * https://github.com/openai/mcp-extensions (spec §Composer At-Mentions) using
6
+ * the official `@openai/mcp-extensions` SDK helper.
7
+ *
8
+ * What it adds:
9
+ * - A `search_mentions` tool advertised via
10
+ * `_meta["openai/extensions"]["mentions/search"]` with app-only visibility.
11
+ * In ChatGPT, users can @-mention the plugin and typeahead-search skills
12
+ * directly in the composer; picked items become composer references.
13
+ * - A `skill://{name}` MCP resource (read via `resources/read`) so those
14
+ * references resolve to the skill's SKILL.md when the message is sent.
15
+ * This also lays groundwork for the official
16
+ * `io.modelcontextprotocol/skills` MCP extension later.
17
+ *
18
+ * Non-ChatGPT hosts see `search_mentions` as an ordinary read-only tool and
19
+ * the skill:// resources as a normal resource template.
20
+ */
21
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
22
+ import type { OpenAIExtensions } from "@openai/mcp-extensions/server";
23
+ import type { Config } from "../config.js";
24
+ import type { SkillSearchEngine } from "../search/index.js";
25
+ import type { SkillLoader } from "../loader/index.js";
26
+ /**
27
+ * Register the mentions handler and the skill:// resource template.
28
+ */
29
+ export declare function registerOpenAIMentions(server: McpServer, extensions: OpenAIExtensions, config: Config, searchEngine: SkillSearchEngine, loader: SkillLoader): void;
30
+ //# sourceMappingURL=mentions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentions.d.ts","sourceRoot":"","sources":["../../src/openai/mentions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAkDtD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,iBAAiB,EAC/B,MAAM,EAAE,WAAW,GAClB,IAAI,CAyNN"}
@@ -0,0 +1,256 @@
1
+ /**
2
+ * OpenAI MCP Extensions — Composer At-Mentions
3
+ *
4
+ * Implements the `mentions/search` extension from
5
+ * https://github.com/openai/mcp-extensions (spec §Composer At-Mentions) using
6
+ * the official `@openai/mcp-extensions` SDK helper.
7
+ *
8
+ * What it adds:
9
+ * - A `search_mentions` tool advertised via
10
+ * `_meta["openai/extensions"]["mentions/search"]` with app-only visibility.
11
+ * In ChatGPT, users can @-mention the plugin and typeahead-search skills
12
+ * directly in the composer; picked items become composer references.
13
+ * - A `skill://{name}` MCP resource (read via `resources/read`) so those
14
+ * references resolve to the skill's SKILL.md when the message is sent.
15
+ * This also lays groundwork for the official
16
+ * `io.modelcontextprotocol/skills` MCP extension later.
17
+ *
18
+ * Non-ChatGPT hosts see `search_mentions` as an ordinary read-only tool and
19
+ * the skill:// resources as a normal resource template.
20
+ */
21
+ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
22
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
23
+ import { join } from "node:path";
24
+ import { withToolLogging } from "../lib/logger.js";
25
+ /** Max items returned by mention typeahead (picker ergonomics). */
26
+ const MENTION_LIMIT = 10;
27
+ /** The butler (Librarian Router) skill — the fixed entrance to the library. */
28
+ const BUTLER_NAME = "00_codex_skills";
29
+ /**
30
+ * Load the butler's root SKILL.md as a SINGLE FILE. The butler's
31
+ * relative_path is "./" (the repository root), so materializing it as a
32
+ * regular skill would download the entire library — instead we serve only
33
+ * the root SKILL.md: from the skills dir when present, otherwise a one-file
34
+ * remote fetch that is cached for subsequent reads.
35
+ */
36
+ async function loadButlerSkillMd(config) {
37
+ const cached = join(config.skillsDir, "SKILL.md");
38
+ if (existsSync(cached)) {
39
+ return readFileSync(cached, "utf-8");
40
+ }
41
+ if (!config.isRemote) {
42
+ throw new Error("Butler SKILL.md not found next to skills_manifest.json (local mode expects a repository checkout).");
43
+ }
44
+ const { fetchRootSkillMd } = await import("../remote/github.js");
45
+ const text = await fetchRootSkillMd(config);
46
+ try {
47
+ writeFileSync(cached, text, "utf-8");
48
+ }
49
+ catch {
50
+ // Cache write is best-effort; serving the text matters more.
51
+ }
52
+ return text;
53
+ }
54
+ /**
55
+ * Whether the butler itself matches a typed query. The butler is outside the
56
+ * BM25 index (it is the entrance, not content), so typeahead matches it
57
+ * directly against its name/description — "管家", "router", "codex skills"
58
+ * all hit, "视频" does not.
59
+ */
60
+ function butlerMatchesQuery(butler, query) {
61
+ const haystack = `${butler.name} ${butler.description}`.toLowerCase();
62
+ const q = query.trim().toLowerCase();
63
+ if (!q)
64
+ return false;
65
+ if (haystack.includes(q))
66
+ return true;
67
+ return q.split(/\s+/).filter(Boolean).some((t) => haystack.includes(t));
68
+ }
69
+ /**
70
+ * Register the mentions handler and the skill:// resource template.
71
+ */
72
+ export function registerOpenAIMentions(server, extensions, config, searchEngine, loader) {
73
+ extensions.mentions.setHandler(async ({ query }) => withToolLogging("search_mentions", { query }, async () => {
74
+ // Reuse the same throttled freshness poll as search_skills so newly
75
+ // integrated skills show up in the typeahead as well.
76
+ if (typeof searchEngine.maybeRefreshManifest === "function") {
77
+ await searchEngine.maybeRefreshManifest();
78
+ }
79
+ // Butler placement: PINNED FIRST only on the empty query (picker just
80
+ // opened, nothing typed). Once the user searches, it appears only when
81
+ // the query actually matches it ("管家" / "router" / "codex skills") —
82
+ // no forced pinning inside search results.
83
+ const q = query.trim();
84
+ const entries = q
85
+ ? searchEngine.search(query, { limit: MENTION_LIMIT })
86
+ : searchEngine.defaultSuggestions(MENTION_LIMIT);
87
+ const butler = searchEngine.getButlerEntry();
88
+ const items = [];
89
+ if (butler && (!q || butlerMatchesQuery(butler, q))) {
90
+ items.push({
91
+ type: "resource_link",
92
+ uri: `skill://${butler.name}`,
93
+ name: butler.name,
94
+ title: `管家 · ${butler.name}`,
95
+ description: butler.description.substring(0, 180),
96
+ });
97
+ }
98
+ for (const r of entries) {
99
+ items.push({
100
+ type: "resource_link",
101
+ uri: `skill://${r.name}`,
102
+ name: r.name,
103
+ title: r.name,
104
+ description: r.description.substring(0, 160),
105
+ });
106
+ }
107
+ // Never answer a non-empty query with an empty list. IME composition
108
+ // (double-pinyin etc.) sends intermediate romanized queries like
109
+ // "guan"/"管jia" that match nothing; an empty response made the host's
110
+ // composer cancel the mention session and drop the @ chip (observed in
111
+ // ChatGPT desktop). Fall back to usage-ranked suggestions so the
112
+ // picker stays populated until real characters commit.
113
+ if (q && items.length === 0) {
114
+ for (const r of searchEngine.defaultSuggestions(5)) {
115
+ items.push({
116
+ type: "resource_link",
117
+ uri: `skill://${r.name}`,
118
+ name: r.name,
119
+ title: r.name,
120
+ description: r.description.substring(0, 160),
121
+ });
122
+ }
123
+ }
124
+ return { items };
125
+ }));
126
+ // Supporting files within a skill (README.md, scripts/, references/...).
127
+ // Hosts/models naturally probe sub-paths like skill://<name>/README.md
128
+ // after reading a mention's SKILL.md; without this template those probes
129
+ // 404'd (-32602 "Resource not found"). {+path} spans nested directories.
130
+ server.registerResource("skill-file", new ResourceTemplate("skill://{name}/{+path}", { list: undefined }), {
131
+ description: "A supporting file inside a codex-skills skill directory (README.md, " +
132
+ "scripts, configs, references). Reading materializes the skill if needed.",
133
+ mimeType: "text/plain",
134
+ }, async (uri, { name, path }) => withToolLogging("resources/read skill-file://", { skill: String(name), file: String(path) }, async () => {
135
+ const entry = searchEngine.findByName(String(name));
136
+ if (!entry) {
137
+ throw new Error(`Skill "${name}" not found.`);
138
+ }
139
+ // loadSkillFile handles remote fetch, path-traversal security and
140
+ // missing-file errors with clear messages.
141
+ const { content, size_bytes } = await loader.loadSkillFile(entry, String(path));
142
+ const mime = String(path).endsWith(".md")
143
+ ? "text/markdown"
144
+ : String(path).endsWith(".json")
145
+ ? "application/json"
146
+ : "text/plain";
147
+ return {
148
+ contents: [
149
+ {
150
+ uri: uri.href,
151
+ mimeType: mime,
152
+ text: `## ${name} / ${path} (${size_bytes} bytes)\n\n${content}`,
153
+ },
154
+ ],
155
+ };
156
+ }));
157
+ // Resolve skill:// URIs mentioned in the composer. Reading materializes the
158
+ // skill (same code path as read_skill) and serves its SKILL.md.
159
+ server.registerResource("skill", new ResourceTemplate("skill://{name}", {
160
+ // The host's resource registry (and therefore @-mention reference
161
+ // resolution, e.g. mcp-resource://<server>/skill://<name> links) is
162
+ // built from resources/list — returning an empty list made mentioned
163
+ // skills unreadable in ChatGPT ("not in the available skills list").
164
+ list: async () => ({
165
+ // Deliberately description-free: hosts build their resource registry
166
+ // from this list and model-side enumeration output gets truncated
167
+ // around ~12k tokens with descriptions included (observed in
168
+ // ChatGPT). Details live in search_mentions items and resources/read;
169
+ // the registry only needs identity. The butler is pinned first as
170
+ // the library entrance, then skills sorted most-used-first.
171
+ resources: [
172
+ ...(searchEngine.getButlerEntry()
173
+ ? [
174
+ {
175
+ uri: `skill://${BUTLER_NAME}`,
176
+ name: BUTLER_NAME,
177
+ mimeType: "text/markdown",
178
+ },
179
+ ]
180
+ : []),
181
+ ...searchEngine
182
+ .defaultSuggestions(Number.MAX_SAFE_INTEGER)
183
+ .map((entry) => ({
184
+ uri: `skill://${entry.name}`,
185
+ name: entry.name,
186
+ mimeType: "text/markdown",
187
+ })),
188
+ ],
189
+ }),
190
+ }),
191
+ // No template description: the SDK merges it into every resources/list
192
+ // entry (199 × ~50 bytes); omitting keeps the catalog ~5k tokens, safely
193
+ // under the ~12k-token host truncation observed in ChatGPT.
194
+ { mimeType: "text/markdown" }, async (uri, { name }) => withToolLogging("resources/read skill://", { skill: String(name) }, async () => {
195
+ // The butler lives at the repository root: serve its single SKILL.md
196
+ // instead of materializing the entire library as one "skill".
197
+ if (String(name) === BUTLER_NAME) {
198
+ const butler = searchEngine.getButlerEntry();
199
+ if (!butler) {
200
+ throw new Error("Butler skill (00_codex_skills) missing from manifest.");
201
+ }
202
+ const text = await loadButlerSkillMd(config);
203
+ // Host-compatibility note: the butler's gates were written for
204
+ // filesystem hosts (view_file / reading skills_manifest.json). In
205
+ // MCP hosts this teaches it the resource path, so UNCACHED skills
206
+ // routed by Gate 2/3 auto-materialize instead of failing on a
207
+ // shell cat of a nonexistent local file.
208
+ const note = "\n\n---\n\n" +
209
+ "> 🔌 **MCP host note** (appended by the codex-skills server):\n" +
210
+ "> - Read ANY skill — cached or not — via `resources/read skill://<name>`; " +
211
+ "first read auto-downloads (materializes) the complete skill. " +
212
+ "Supporting files: `skill://<name>/<relative-path>`.\n" +
213
+ "> - Prefer `search_skills` / `search_mentions` over reading " +
214
+ "skills_manifest.json directly: same index, BM25-ranked, Chinese-friendly.\n" +
215
+ "> - Local cache root when shell access is available: `~/.codex-skills-cache/`.\n";
216
+ return {
217
+ contents: [
218
+ {
219
+ uri: uri.href,
220
+ mimeType: "text/markdown",
221
+ text: text + note,
222
+ },
223
+ ],
224
+ };
225
+ }
226
+ let entry = searchEngine.findByName(String(name));
227
+ if (!entry) {
228
+ if (typeof searchEngine.maybeRefreshManifest === "function") {
229
+ await searchEngine.maybeRefreshManifest();
230
+ entry = searchEngine.findByName(String(name));
231
+ }
232
+ }
233
+ if (!entry) {
234
+ throw new Error(`Skill "${name}" not found. Search via the search_mentions tool or search_skills.`);
235
+ }
236
+ const result = await loader.readSkill(entry);
237
+ if (typeof searchEngine.recordUsage === "function") {
238
+ searchEngine.recordUsage(entry.name);
239
+ }
240
+ // Self-describing hint so models reading this resource know where
241
+ // supporting files live (they otherwise probe sub-paths blind).
242
+ const hint = `\n\n---\n> 📁 Supporting files for this skill (README.md, scripts/, ` +
243
+ `references/, ...) are readable as MCP resources: ` +
244
+ "`skill://" + entry.name + "/<relative-path>`.";
245
+ return {
246
+ contents: [
247
+ {
248
+ uri: uri.href,
249
+ mimeType: "text/markdown",
250
+ text: result.instructions + hint,
251
+ },
252
+ ],
253
+ };
254
+ }));
255
+ }
256
+ //# sourceMappingURL=mentions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../src/openai/mentions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * OpenAI MCP Extensions — Structured Settings
3
+ *
4
+ * Implements the `openai/settings` extension from
5
+ * https://github.com/openai/mcp-extensions (spec §Structured Settings) using
6
+ * the official `@openai/mcp-extensions` SDK helper.
7
+ *
8
+ * What it adds:
9
+ * - `settings.read` / `settings.update` tools on the server.
10
+ * - `capabilities.extensions["openai/settings"]` (+ legacy `experimental`)
11
+ * advertised in the initialize result, so ChatGPT renders a native
12
+ * settings panel on the plugin details page.
13
+ * - Hosts that do not understand the extension ignore the capability and
14
+ * the two extra tools keep working as ordinary MCP tools.
15
+ *
16
+ * Values are persisted to ~/.codex-skills-mcp/settings.json (never inside a
17
+ * skill library — same policy as the activity log) and applied to the shared
18
+ * Config object, which every subsystem reads at call time, so updates take
19
+ * effect without a restart and survive restarts.
20
+ */
21
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
22
+ import { OpenAIExtensions } from "@openai/mcp-extensions/server";
23
+ import type { Config } from "../config.js";
24
+ import type { SkillSearchEngine } from "../search/index.js";
25
+ /** Effective (persisted-override) settings shape exposed to the host UI. */
26
+ export interface EffectiveSettings {
27
+ cn_mirror: boolean;
28
+ download_concurrency: number;
29
+ download_timeout_seconds: number;
30
+ manifest_ttl_hours: number;
31
+ manifest_poll_seconds: number;
32
+ }
33
+ /**
34
+ * Overlay persisted settings onto a freshly parsed Config. Call once at
35
+ * startup (before remote init / manifest fetch) so restarts honor them.
36
+ */
37
+ export declare function applyPersistedSettingsAtStartup(config: Config): void;
38
+ /**
39
+ * Register the settings extension plus the "refresh skills list" tool action
40
+ * on the given OpenAIExtensions facade.
41
+ */
42
+ export declare function registerOpenAISettings(server: McpServer, extensions: OpenAIExtensions, config: Config, searchEngine: SkillSearchEngine): void;
43
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/openai/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AA0GD;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEpE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,gBAAgB,EAC5B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,iBAAiB,GAC9B,IAAI,CAgFN"}