@genart-dev/mcp-server 0.4.2 → 0.4.3
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/dist/index.cjs +51 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +41 -26
- package/dist/index.js.map +1 -1
- package/dist/lib.cjs +52 -40
- package/dist/lib.cjs.map +1 -1
- package/dist/lib.d.cts +6 -2
- package/dist/lib.d.ts +6 -2
- package/dist/lib.js +37 -25
- package/dist/lib.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2743,7 +2743,8 @@ function isDirectComponent(name, components) {
|
|
|
2743
2743
|
}
|
|
2744
2744
|
|
|
2745
2745
|
// src/tools/capture.ts
|
|
2746
|
-
import { writeFile as writeFile6 } from "fs/promises";
|
|
2746
|
+
import { mkdir, writeFile as writeFile6 } from "fs/promises";
|
|
2747
|
+
import { dirname as dirname6, join as join3 } from "path";
|
|
2747
2748
|
import {
|
|
2748
2749
|
createDefaultRegistry as createDefaultRegistry2
|
|
2749
2750
|
} from "@genart-dev/core";
|
|
@@ -2848,8 +2849,9 @@ function generateSketchHtml(sketch, opts) {
|
|
|
2848
2849
|
}
|
|
2849
2850
|
return adapter.generateStandaloneHTML(effective);
|
|
2850
2851
|
}
|
|
2851
|
-
function
|
|
2852
|
-
|
|
2852
|
+
function deriveSnapshotPath(sketchPath, sketchId, seed) {
|
|
2853
|
+
const wsDir = dirname6(sketchPath);
|
|
2854
|
+
return join3(wsDir, "snapshots", `${sketchId}-${seed}-preview.png`);
|
|
2853
2855
|
}
|
|
2854
2856
|
async function captureScreenshot(state, input) {
|
|
2855
2857
|
state.requireWorkspace();
|
|
@@ -2882,11 +2884,12 @@ async function captureScreenshot(state, input) {
|
|
|
2882
2884
|
height,
|
|
2883
2885
|
inlineSize
|
|
2884
2886
|
});
|
|
2885
|
-
const
|
|
2887
|
+
const effectiveSeed = input.seed ?? sketch.state.seed;
|
|
2888
|
+
const previewPath = deriveSnapshotPath(loaded.path, sketchId, effectiveSeed);
|
|
2886
2889
|
const metadata = await buildScreenshotMetadata(state, multi, {
|
|
2887
2890
|
target,
|
|
2888
2891
|
sketchId,
|
|
2889
|
-
seed:
|
|
2892
|
+
seed: effectiveSeed,
|
|
2890
2893
|
previewPath
|
|
2891
2894
|
});
|
|
2892
2895
|
const previewJpegBase64 = Buffer.from(multi.inlineJpeg).toString("base64");
|
|
@@ -2907,8 +2910,10 @@ async function buildScreenshotMetadata(state, multi, info) {
|
|
|
2907
2910
|
previewPath: info.previewPath
|
|
2908
2911
|
};
|
|
2909
2912
|
if (!state.remoteMode) {
|
|
2913
|
+
await mkdir(dirname6(info.previewPath), { recursive: true });
|
|
2910
2914
|
await writeFile6(info.previewPath, multi.previewPng);
|
|
2911
2915
|
metadata.savedPreviewTo = info.previewPath;
|
|
2916
|
+
metadata.previewWritten = true;
|
|
2912
2917
|
}
|
|
2913
2918
|
return metadata;
|
|
2914
2919
|
}
|
|
@@ -2937,11 +2942,12 @@ async function captureBatch(state, input) {
|
|
|
2937
2942
|
height,
|
|
2938
2943
|
inlineSize
|
|
2939
2944
|
});
|
|
2940
|
-
const
|
|
2945
|
+
const effectiveSeed = input.seed ?? sketch.state.seed;
|
|
2946
|
+
const previewPath = deriveSnapshotPath(loaded.path, id, effectiveSeed);
|
|
2941
2947
|
const itemMetadata = await buildScreenshotMetadata(state, multi, {
|
|
2942
2948
|
target: "sketch",
|
|
2943
2949
|
sketchId: id,
|
|
2944
|
-
seed:
|
|
2950
|
+
seed: effectiveSeed,
|
|
2945
2951
|
previewPath
|
|
2946
2952
|
});
|
|
2947
2953
|
items.push({
|
|
@@ -3301,7 +3307,7 @@ function gatherRelevantSkills(aspects) {
|
|
|
3301
3307
|
|
|
3302
3308
|
// src/tools/series.ts
|
|
3303
3309
|
import { writeFile as writeFile7 } from "fs/promises";
|
|
3304
|
-
import { basename as basename8, dirname as
|
|
3310
|
+
import { basename as basename8, dirname as dirname7, resolve as resolve3 } from "path";
|
|
3305
3311
|
import {
|
|
3306
3312
|
serializeGenart as serializeGenart5,
|
|
3307
3313
|
serializeWorkspace as serializeWorkspace4
|
|
@@ -3581,7 +3587,7 @@ async function promoteSketch(state, input) {
|
|
|
3581
3587
|
...input.agent ? { agent: input.agent } : {},
|
|
3582
3588
|
...input.model ? { model: input.model } : {}
|
|
3583
3589
|
};
|
|
3584
|
-
const sourceDir =
|
|
3590
|
+
const sourceDir = dirname7(source.path);
|
|
3585
3591
|
const newPath = resolve3(sourceDir, `${newId}.genart`);
|
|
3586
3592
|
const json = serializeGenart5(promotedDef);
|
|
3587
3593
|
if (!state.remoteMode) {
|
|
@@ -3651,8 +3657,8 @@ function countBy(items) {
|
|
|
3651
3657
|
}
|
|
3652
3658
|
|
|
3653
3659
|
// src/tools/reference.ts
|
|
3654
|
-
import { copyFile, mkdir, readFile as readFile5 } from "fs/promises";
|
|
3655
|
-
import { basename as basename9, dirname as
|
|
3660
|
+
import { copyFile, mkdir as mkdir2, readFile as readFile5 } from "fs/promises";
|
|
3661
|
+
import { basename as basename9, dirname as dirname8, extname, resolve as resolve4 } from "path";
|
|
3656
3662
|
import {
|
|
3657
3663
|
serializeGenart as serializeGenart6,
|
|
3658
3664
|
serializeWorkspace as serializeWorkspace5
|
|
@@ -3707,9 +3713,9 @@ async function addReference(state, input) {
|
|
|
3707
3713
|
`Invalid reference type: '${refType}'. Valid types: ${VALID_REFERENCE_TYPES.join(", ")}`
|
|
3708
3714
|
);
|
|
3709
3715
|
}
|
|
3710
|
-
const workspaceDir =
|
|
3716
|
+
const workspaceDir = dirname8(state.workspacePath);
|
|
3711
3717
|
const refsDir = resolve4(workspaceDir, "references");
|
|
3712
|
-
await
|
|
3718
|
+
await mkdir2(refsDir, { recursive: true });
|
|
3713
3719
|
const ext = extname(input.image);
|
|
3714
3720
|
const destFilename = `${id}${ext}`;
|
|
3715
3721
|
const destPath = resolve4(refsDir, destFilename);
|
|
@@ -3797,7 +3803,7 @@ async function addReference(state, input) {
|
|
|
3797
3803
|
async function analyzeReference(state, input) {
|
|
3798
3804
|
state.requireWorkspace();
|
|
3799
3805
|
const { ref, location } = findReference(state, input.referenceId, input.seriesId, input.sketchId);
|
|
3800
|
-
const workspaceDir =
|
|
3806
|
+
const workspaceDir = dirname8(state.workspacePath);
|
|
3801
3807
|
const imagePath = resolve4(workspaceDir, ref.path);
|
|
3802
3808
|
let previewJpegBase64;
|
|
3803
3809
|
try {
|
|
@@ -3957,7 +3963,7 @@ async function extractPalette(state, input) {
|
|
|
3957
3963
|
input.sketchId
|
|
3958
3964
|
);
|
|
3959
3965
|
const count = input.count ?? 6;
|
|
3960
|
-
const workspaceDir =
|
|
3966
|
+
const workspaceDir = dirname8(state.workspacePath);
|
|
3961
3967
|
const imagePath = resolve4(workspaceDir, ref.path);
|
|
3962
3968
|
let previewJpegBase64;
|
|
3963
3969
|
try {
|
|
@@ -4034,7 +4040,7 @@ function findReference(state, referenceId, seriesId, sketchId) {
|
|
|
4034
4040
|
// src/tools/export.ts
|
|
4035
4041
|
import { createWriteStream } from "fs";
|
|
4036
4042
|
import { stat as stat4, writeFile as writeFile9 } from "fs/promises";
|
|
4037
|
-
import { dirname as
|
|
4043
|
+
import { dirname as dirname9 } from "path";
|
|
4038
4044
|
import archiver from "archiver";
|
|
4039
4045
|
import {
|
|
4040
4046
|
createDefaultRegistry as createDefaultRegistry3,
|
|
@@ -4042,7 +4048,7 @@ import {
|
|
|
4042
4048
|
} from "@genart-dev/core";
|
|
4043
4049
|
var registry4 = createDefaultRegistry3();
|
|
4044
4050
|
async function validateOutputPath(outputPath) {
|
|
4045
|
-
const parentDir =
|
|
4051
|
+
const parentDir = dirname9(outputPath);
|
|
4046
4052
|
try {
|
|
4047
4053
|
const s = await stat4(parentDir);
|
|
4048
4054
|
if (!s.isDirectory()) {
|
|
@@ -5312,20 +5318,24 @@ async function initializePluginRegistry() {
|
|
|
5312
5318
|
await registry5.register(tracePlugin);
|
|
5313
5319
|
return registry5;
|
|
5314
5320
|
}
|
|
5315
|
-
function createServer(state) {
|
|
5321
|
+
function createServer(state, options) {
|
|
5322
|
+
const captureOnly = options?.captureOnly ?? false;
|
|
5316
5323
|
const server = new McpServer(
|
|
5317
5324
|
{
|
|
5318
|
-
name: "@genart/mcp-server",
|
|
5325
|
+
name: captureOnly ? "@genart/mcp-capture" : "@genart/mcp-server",
|
|
5319
5326
|
version: "0.4.0"
|
|
5320
5327
|
},
|
|
5321
5328
|
{
|
|
5322
5329
|
capabilities: {
|
|
5323
5330
|
tools: {},
|
|
5324
|
-
resources: {},
|
|
5325
|
-
prompts: {}
|
|
5331
|
+
...!captureOnly && { resources: {}, prompts: {} }
|
|
5326
5332
|
}
|
|
5327
5333
|
}
|
|
5328
5334
|
);
|
|
5335
|
+
if (captureOnly) {
|
|
5336
|
+
registerCaptureTools(server, state);
|
|
5337
|
+
return server;
|
|
5338
|
+
}
|
|
5329
5339
|
const registryReady = initializePluginRegistry().then((registry5) => {
|
|
5330
5340
|
state.pluginRegistry = registry5;
|
|
5331
5341
|
registerPluginMcpTools(server, registry5, state);
|
|
@@ -5342,7 +5352,9 @@ function createServer(state) {
|
|
|
5342
5352
|
registerSnapshotTools(server, state);
|
|
5343
5353
|
registerKnowledgeTools(server, state);
|
|
5344
5354
|
registerDesignTools(server, state);
|
|
5345
|
-
|
|
5355
|
+
if (!state.remoteMode) {
|
|
5356
|
+
registerCaptureTools(server, state);
|
|
5357
|
+
}
|
|
5346
5358
|
registerCritiqueTools(server, state);
|
|
5347
5359
|
registerSeriesTools(server, state);
|
|
5348
5360
|
registerReferenceTools(server, state);
|
|
@@ -6052,7 +6064,7 @@ function registerSnapshotTools(server, state) {
|
|
|
6052
6064
|
function registerCaptureTools(server, state) {
|
|
6053
6065
|
server.tool(
|
|
6054
6066
|
"capture_screenshot",
|
|
6055
|
-
"Capture a screenshot of a sketch. Returns metadata as text + a small inline JPEG image for visual review. In
|
|
6067
|
+
"Capture a screenshot of a sketch. Returns metadata as text + a small inline JPEG image for visual review. In local mode, writes a full-res PNG to snapshots/<sketchId>-<seed>-preview.png next to the workspace. The savedPreviewTo path in metadata points to the file on disk.",
|
|
6056
6068
|
{
|
|
6057
6069
|
target: z2.enum(["selected", "sketch"]).optional().describe("What to capture (default: selected)"),
|
|
6058
6070
|
sketchId: z2.string().optional().describe("Required when target is 'sketch'"),
|
|
@@ -6714,14 +6726,17 @@ function registerKnowledgeTools(server, state) {
|
|
|
6714
6726
|
|
|
6715
6727
|
// src/index.ts
|
|
6716
6728
|
async function main() {
|
|
6717
|
-
const
|
|
6718
|
-
|
|
6729
|
+
const captureOnly = process.argv.includes("--capture-only");
|
|
6730
|
+
const sidecar = !captureOnly && isSidecarMode();
|
|
6731
|
+
if (captureOnly) {
|
|
6732
|
+
console.error("[genart-mcp] Starting in capture-only mode");
|
|
6733
|
+
} else if (sidecar) {
|
|
6719
6734
|
console.error("[genart-mcp] Starting in sidecar mode");
|
|
6720
6735
|
} else {
|
|
6721
6736
|
console.error("[genart-mcp] Starting in stdio mode");
|
|
6722
6737
|
}
|
|
6723
6738
|
const state = new EditorState();
|
|
6724
|
-
const server = createServer(state);
|
|
6739
|
+
const server = createServer(state, { captureOnly });
|
|
6725
6740
|
const transport = new StdioServerTransport();
|
|
6726
6741
|
await server.connect(transport);
|
|
6727
6742
|
console.error("[genart-mcp] Server connected and ready");
|