@floomhq/floom-mcp-sync 1.0.3 → 1.0.5
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 +7 -1
- package/dist/lib/paths.js +14 -0
- package/dist/server.js +16 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,13 @@ Tiny MCP server for Floom skills. This package is part of the Floom Version 1 sy
|
|
|
6
6
|
npx -y @floomhq/floom-mcp-sync
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
On startup it reads `~/.floom/config.json`, fetches published, saved, and subscribed library skills, and writes missing files to
|
|
9
|
+
On startup it reads `~/.floom/config.json`, fetches published, saved, and subscribed library skills, and writes missing files to the configured local skills directory. The background sync behavior is a Version 1 preview path.
|
|
10
|
+
|
|
11
|
+
Targets:
|
|
12
|
+
|
|
13
|
+
- default: Claude Code, `~/.claude/skills/`
|
|
14
|
+
- Codex: `FLOOM_TARGET=codex npx -y @floomhq/floom-mcp-sync`, `~/.codex/skills/`
|
|
15
|
+
- direct override: `FLOOM_SKILLS_DIR=/path/to/skills npx -y @floomhq/floom-mcp-sync`
|
|
10
16
|
|
|
11
17
|
Sync stores a machine-local manifest next to the Floom CLI config at `~/.floom/sync-manifest.json`.
|
|
12
18
|
Version 1 sync does not replace existing local Markdown files. Remote updates, existing untracked
|
package/dist/lib/paths.js
CHANGED
|
@@ -4,7 +4,21 @@ import { assertValidSlug } from "./slug.js";
|
|
|
4
4
|
export function configPath() {
|
|
5
5
|
return process.env.FLOOM_CONFIG_PATH ?? join(homedir(), ".floom", "config.json");
|
|
6
6
|
}
|
|
7
|
+
export function agentTarget() {
|
|
8
|
+
const raw = (process.env.FLOOM_TARGET ?? process.env.FLOOM_AGENT_TARGET ?? "claude").toLowerCase();
|
|
9
|
+
if (raw === "codex")
|
|
10
|
+
return "codex";
|
|
11
|
+
if (raw === "claude")
|
|
12
|
+
return "claude";
|
|
13
|
+
throw new Error("Invalid FLOOM_TARGET. Use claude or codex.");
|
|
14
|
+
}
|
|
7
15
|
export function skillsDir() {
|
|
16
|
+
if (process.env.FLOOM_SKILLS_DIR)
|
|
17
|
+
return process.env.FLOOM_SKILLS_DIR;
|
|
18
|
+
if (agentTarget() === "codex") {
|
|
19
|
+
const codexHome = process.env.CODEX_HOME ?? join(homedir(), ".codex");
|
|
20
|
+
return process.env.CODEX_SKILLS_DIR ?? join(codexHome, "skills");
|
|
21
|
+
}
|
|
8
22
|
return process.env.CLAUDE_SKILLS_DIR ?? join(homedir(), ".claude", "skills");
|
|
9
23
|
}
|
|
10
24
|
export function skillPath(slug) {
|
package/dist/server.js
CHANGED
|
@@ -6,7 +6,8 @@ import { installSkill } from "./tools/install.js";
|
|
|
6
6
|
import { publishSkill } from "./tools/publish.js";
|
|
7
7
|
import { listLibraries, moveSkill, subscribeLibrary, unsubscribeLibrary, } from "./tools/libraries.js";
|
|
8
8
|
import { searchSkills } from "./tools/search.js";
|
|
9
|
-
|
|
9
|
+
import { agentTarget, skillsDir } from "./lib/paths.js";
|
|
10
|
+
const SERVER_VERSION = "1.0.5";
|
|
10
11
|
const DEFAULT_INTERVAL_MS = 60_000;
|
|
11
12
|
const MIN_INTERVAL_MS = 10_000;
|
|
12
13
|
const VERSION_RE = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,63}$/;
|
|
@@ -33,7 +34,7 @@ Usage
|
|
|
33
34
|
|
|
34
35
|
Behavior
|
|
35
36
|
Starts a stdio MCP server.
|
|
36
|
-
Syncs published, saved, and subscribed library skills into
|
|
37
|
+
Syncs published, saved, and subscribed library skills into the configured local skills directory.
|
|
37
38
|
Polls for updates while the MCP process is running.
|
|
38
39
|
|
|
39
40
|
Options
|
|
@@ -42,6 +43,10 @@ Options
|
|
|
42
43
|
|
|
43
44
|
Env
|
|
44
45
|
FLOOM_API_URL Override the API host.
|
|
46
|
+
FLOOM_TARGET claude or codex. Default: claude.
|
|
47
|
+
FLOOM_SKILLS_DIR Override the local skills directory directly.
|
|
48
|
+
CLAUDE_SKILLS_DIR Override Claude's skills directory.
|
|
49
|
+
CODEX_SKILLS_DIR Override Codex's skills directory.
|
|
45
50
|
FLOOM_SYNC_INTERVAL_MS Poll interval in milliseconds. Minimum: 10000.
|
|
46
51
|
`.trimStart();
|
|
47
52
|
}
|
|
@@ -96,7 +101,7 @@ function toolList() {
|
|
|
96
101
|
tools: [
|
|
97
102
|
{
|
|
98
103
|
name: "floom_search_skills",
|
|
99
|
-
description: "Search public Floom skills
|
|
104
|
+
description: "Search public Floom skills before recreating reusable behavior from scratch.",
|
|
100
105
|
inputSchema: {
|
|
101
106
|
type: "object",
|
|
102
107
|
properties: {
|
|
@@ -111,7 +116,7 @@ function toolList() {
|
|
|
111
116
|
},
|
|
112
117
|
{
|
|
113
118
|
name: "floom_install_skill",
|
|
114
|
-
description: "Fetch a Floom skill by slug and install it into
|
|
119
|
+
description: "Fetch a Floom skill by slug and install it into the configured local skills directory.",
|
|
115
120
|
inputSchema: {
|
|
116
121
|
type: "object",
|
|
117
122
|
properties: {
|
|
@@ -319,7 +324,12 @@ async function handleRequest(message) {
|
|
|
319
324
|
stdout.write(response(id, {
|
|
320
325
|
protocolVersion: "2025-06-18",
|
|
321
326
|
capabilities: { tools: {} },
|
|
322
|
-
serverInfo: {
|
|
327
|
+
serverInfo: {
|
|
328
|
+
name: "floom-mcp-sync",
|
|
329
|
+
version: SERVER_VERSION,
|
|
330
|
+
target: agentTarget(),
|
|
331
|
+
skillsDir: skillsDir(),
|
|
332
|
+
},
|
|
323
333
|
}));
|
|
324
334
|
return;
|
|
325
335
|
}
|
|
@@ -345,7 +355,7 @@ async function main() {
|
|
|
345
355
|
if (handleCliArgs(process.argv.slice(2)))
|
|
346
356
|
return;
|
|
347
357
|
const intervalMs = resolvePollIntervalMs();
|
|
348
|
-
process.stderr.write(`[floom] starting sync poller (interval ${intervalMs}ms)\n`);
|
|
358
|
+
process.stderr.write(`[floom] starting sync poller for ${agentTarget()} at ${skillsDir()} (interval ${intervalMs}ms)\n`);
|
|
349
359
|
const syncState = { inFlight: true };
|
|
350
360
|
void autoSync().catch((err) => {
|
|
351
361
|
process.stderr.write(`[floom] initial sync failed: ${err instanceof Error ? err.message : String(err)}\n`);
|