capybara-mcp 0.1.0 → 0.1.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.
- package/README.md +11 -13
- package/dist/api/capybara-api.d.ts +1 -0
- package/dist/api/capybara-api.d.ts.map +1 -1
- package/dist/api/capybara-api.js +26 -9
- package/dist/api/capybara-api.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/game-id.d.ts +3 -0
- package/dist/lib/game-id.d.ts.map +1 -0
- package/dist/lib/game-id.js +38 -0
- package/dist/lib/game-id.js.map +1 -0
- package/dist/lib/read-workspace-context.d.ts.map +1 -1
- package/dist/lib/read-workspace-context.js +6 -0
- package/dist/lib/read-workspace-context.js.map +1 -1
- package/dist/lib/resolve-art-reference.d.ts +6 -0
- package/dist/lib/resolve-art-reference.d.ts.map +1 -0
- package/dist/lib/resolve-art-reference.js +73 -0
- package/dist/lib/resolve-art-reference.js.map +1 -0
- package/dist/setup.js +4 -4
- package/dist/setup.js.map +1 -1
- package/dist/tools/register-tools.d.ts.map +1 -1
- package/dist/tools/register-tools.js +12 -12
- package/dist/tools/register-tools.js.map +1 -1
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -1,29 +1,26 @@
|
|
|
1
1
|
# capybara-mcp
|
|
2
2
|
|
|
3
|
-
MCP server for [Capybara](https://capybara.
|
|
3
|
+
MCP server for [Capybara](https://www.capybara.build) game asset generation. Works with Claude Code, Cursor, Codex, OpenCode, Pi, and any MCP-capable agent.
|
|
4
4
|
|
|
5
5
|
## Tools
|
|
6
6
|
|
|
7
7
|
| Tool | Description |
|
|
8
8
|
|------|-------------|
|
|
9
|
-
| `
|
|
10
|
-
| `
|
|
9
|
+
| `generate_assets` | Generate maps, characters, props, HUD, and audio |
|
|
10
|
+
| `get_job_status` | Recover results if a session was interrupted |
|
|
11
11
|
|
|
12
12
|
## Quick start
|
|
13
13
|
|
|
14
14
|
### 1. Configure (one time)
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
npx capybara-mcp-setup --api-key <your-api-key>
|
|
17
|
+
npx capybara-mcp-setup --api-key <your-api-key>
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
For Claude Code:
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
claude mcp add capybara-mcp
|
|
24
|
-
-e CAPYBARA_API_KEY=<your-api-key> \
|
|
25
|
-
-e CAPYBARA_API_URL=https://api.capybara.dev/v1 \
|
|
26
|
-
-- npx -y capybara-mcp
|
|
23
|
+
claude mcp add capybara-mcp -e CAPYBARA_API_KEY=<your-api-key> -- npx -y capybara-mcp
|
|
27
24
|
```
|
|
28
25
|
|
|
29
26
|
### 2. Environment variables
|
|
@@ -31,22 +28,23 @@ claude mcp add capybara-mcp \
|
|
|
31
28
|
| Variable | Required | Description |
|
|
32
29
|
|----------|----------|-------------|
|
|
33
30
|
| `CAPYBARA_API_KEY` | Yes | Your Capybara API key |
|
|
34
|
-
|
|
31
|
+
|
|
32
|
+
The API endpoint is built in (`https://caoybaramcp-production.up.railway.app/v1`). No other env vars needed.
|
|
35
33
|
|
|
36
34
|
### 3. Run manually
|
|
37
35
|
|
|
38
36
|
```bash
|
|
39
|
-
CAPYBARA_API_KEY=<key>
|
|
37
|
+
CAPYBARA_API_KEY=<key> npx capybara-mcp
|
|
40
38
|
```
|
|
41
39
|
|
|
42
40
|
## How it works
|
|
43
41
|
|
|
44
|
-
1. The agent calls `
|
|
42
|
+
1. The agent calls `generate_assets` with asset specs (maps, characters, etc.).
|
|
45
43
|
2. The client reads `src/data/assets.md` and existing JSON from your game repo.
|
|
46
44
|
3. Assets are generated via the Capybara API and written back to disk.
|
|
47
45
|
4. Live progress appears in `.capybara/status.md` during the run.
|
|
48
46
|
|
|
49
|
-
If interrupted, use `
|
|
47
|
+
If interrupted, use `get_job_status` with the returned `job_id`.
|
|
50
48
|
|
|
51
49
|
## Requirements
|
|
52
50
|
|
|
@@ -14,6 +14,7 @@ export declare function generateAssets(input: McpGenerateAssetInput, ctx: Client
|
|
|
14
14
|
export declare function formatJobStatus(status: JobStatusResponse): string;
|
|
15
15
|
export declare function checkJobStatus(jobId: string, ctx: ClientContext & {
|
|
16
16
|
output_dir?: string;
|
|
17
|
+
workspace_root?: string;
|
|
17
18
|
}): Promise<{
|
|
18
19
|
summary: string;
|
|
19
20
|
status: JobStatusResponse;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capybara-api.d.ts","sourceRoot":"","sources":["../../src/api/capybara-api.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"capybara-api.d.ts","sourceRoot":"","sources":["../../src/api/capybara-api.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAM7B,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAwBF,wBAAsB,cAAc,CAClC,KAAK,EAAE,qBAAqB,EAC5B,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,gBAAgB,CAAC,CAmD3B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAcjE;AA8BD,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,aAAa,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC,CA8BzD"}
|
package/dist/api/capybara-api.js
CHANGED
|
@@ -1,18 +1,28 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { getJobStatus,
|
|
2
|
+
import { getJobStatus, flattenAssetToolInput, postApiRequest, TOOL_GET_JOB_STATUS, } from "capybara-mcp-shared";
|
|
3
3
|
import { writeFiles } from "../lib/write-files.js";
|
|
4
|
+
import { readGameIdFromWorkspace, writeGameIdToWorkspace } from "../lib/game-id.js";
|
|
5
|
+
import { resolveBaseMapArtReferences } from "../lib/resolve-art-reference.js";
|
|
4
6
|
import { readWorkspaceContext } from "../lib/read-workspace-context.js";
|
|
5
7
|
function withJobId(summary, jobId) {
|
|
6
8
|
if (!jobId) {
|
|
7
9
|
return summary;
|
|
8
10
|
}
|
|
9
|
-
return [summary, "", `job_id: ${jobId}`,
|
|
11
|
+
return [summary, "", `job_id: ${jobId}`, `If interrupted, call ${TOOL_GET_JOB_STATUS} with this job_id.`].join("\n");
|
|
12
|
+
}
|
|
13
|
+
async function persistNewGameId(workspaceRoot, existingGameId, result) {
|
|
14
|
+
if (existingGameId || !result.gameId) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const indexPath = await writeGameIdToWorkspace(workspaceRoot, result.gameId);
|
|
18
|
+
return `Set window.gameId in ${indexPath}`;
|
|
10
19
|
}
|
|
11
20
|
export async function generateAssets(input, ctx) {
|
|
12
|
-
const { output_dir, workspace_root,
|
|
13
|
-
const payload = mapAssetToolInputToLegacy(schemaInput);
|
|
21
|
+
const { output_dir, workspace_root, ...schemaInput } = input;
|
|
14
22
|
const workspaceRoot = path.resolve(workspace_root || ".");
|
|
23
|
+
const payload = await resolveBaseMapArtReferences(flattenAssetToolInput(schemaInput), workspaceRoot);
|
|
15
24
|
const workspace_files = await readWorkspaceContext(workspaceRoot);
|
|
25
|
+
const existingGameId = await readGameIdFromWorkspace(workspaceRoot);
|
|
16
26
|
await ctx.report?.({
|
|
17
27
|
message: `Queued ${payload.assets.length} asset(s) for generation...`,
|
|
18
28
|
progress: 0,
|
|
@@ -24,8 +34,7 @@ export async function generateAssets(input, ctx) {
|
|
|
24
34
|
...payload,
|
|
25
35
|
workspace_files,
|
|
26
36
|
workspace_root: workspaceRoot,
|
|
27
|
-
|
|
28
|
-
art_reference_url,
|
|
37
|
+
...(existingGameId ? { gameId: existingGameId } : {}),
|
|
29
38
|
},
|
|
30
39
|
apiKey: ctx.apiKey,
|
|
31
40
|
apiUrl: ctx.apiUrl,
|
|
@@ -36,9 +45,11 @@ export async function generateAssets(input, ctx) {
|
|
|
36
45
|
const result = data;
|
|
37
46
|
const rootDir = path.resolve(output_dir || workspaceRoot);
|
|
38
47
|
const written = await writeFiles(result.assets ?? result.files ?? [], rootDir);
|
|
48
|
+
const gameIdNote = await persistNewGameId(workspaceRoot, existingGameId, result);
|
|
39
49
|
const summaryParts = [
|
|
40
50
|
result.message || `Generated ${payload.assets.length} asset(s).`,
|
|
41
51
|
result.status ? `Status: ${result.status}` : null,
|
|
52
|
+
gameIdNote,
|
|
42
53
|
result.assets_md ? "Updated src/data/assets.md." : null,
|
|
43
54
|
result.warnings?.length ? `Warnings:\n${result.warnings.map((w) => ` - ${w}`).join("\n")}` : null,
|
|
44
55
|
result.failedAssets?.length
|
|
@@ -64,15 +75,19 @@ export function formatJobStatus(status) {
|
|
|
64
75
|
].filter(Boolean);
|
|
65
76
|
return lines.join("\n");
|
|
66
77
|
}
|
|
67
|
-
async function applyCompletedJob(status, outputDir) {
|
|
78
|
+
async function applyCompletedJob(status, outputDir, workspaceRoot, existingGameId) {
|
|
68
79
|
if (status.status !== "complete" || status.result == null) {
|
|
69
80
|
return null;
|
|
70
81
|
}
|
|
71
82
|
const result = status.result;
|
|
72
|
-
const rootDir = path.resolve(outputDir || ".");
|
|
83
|
+
const rootDir = path.resolve(outputDir || workspaceRoot || ".");
|
|
73
84
|
const written = await writeFiles(result.assets ?? result.files ?? [], rootDir);
|
|
85
|
+
const gameIdNote = workspaceRoot != null
|
|
86
|
+
? await persistNewGameId(workspaceRoot, existingGameId, result)
|
|
87
|
+
: null;
|
|
74
88
|
return [
|
|
75
89
|
result.message || "Recovered generated assets.",
|
|
90
|
+
gameIdNote,
|
|
76
91
|
written.length > 0
|
|
77
92
|
? [`Wrote ${written.length} file(s) to ${rootDir}:`, ...written.map((p) => ` - ${p}`)].join("\n")
|
|
78
93
|
: null,
|
|
@@ -81,6 +96,8 @@ async function applyCompletedJob(status, outputDir) {
|
|
|
81
96
|
.join("\n");
|
|
82
97
|
}
|
|
83
98
|
export async function checkJobStatus(jobId, ctx) {
|
|
99
|
+
const workspaceRoot = path.resolve(ctx.workspace_root || ".");
|
|
100
|
+
const existingGameId = await readGameIdFromWorkspace(workspaceRoot);
|
|
84
101
|
const status = await getJobStatus({
|
|
85
102
|
apiUrl: ctx.apiUrl,
|
|
86
103
|
apiKey: ctx.apiKey,
|
|
@@ -89,7 +106,7 @@ export async function checkJobStatus(jobId, ctx) {
|
|
|
89
106
|
});
|
|
90
107
|
let summary = formatJobStatus(status);
|
|
91
108
|
if (status.status === "complete") {
|
|
92
|
-
const recovered = await applyCompletedJob(status, ctx.output_dir);
|
|
109
|
+
const recovered = await applyCompletedJob(status, ctx.output_dir, workspaceRoot, existingGameId);
|
|
93
110
|
if (recovered) {
|
|
94
111
|
summary = [recovered, "", `job_id: ${status.job_id}`].join("\n");
|
|
95
112
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capybara-api.js","sourceRoot":"","sources":["../../src/api/capybara-api.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"capybara-api.js","sourceRoot":"","sources":["../../src/api/capybara-api.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CAPYBARA_MCP_API_URL } from "capybara-mcp-shared";
|
|
4
5
|
import { registerTools } from "./tools/register-tools.js";
|
|
5
6
|
const API_KEY = process.env.CAPYBARA_API_KEY;
|
|
6
|
-
const API_URL = process.env.CAPYBARA_API_URL || "https://api.capybara.dev/v1";
|
|
7
7
|
if (!API_KEY) {
|
|
8
8
|
console.error("CAPYBARA_API_KEY is not set. Run the setup command first:");
|
|
9
9
|
console.error(" npx -y capybara-mcp-setup --api-key <your-key>");
|
|
10
10
|
process.exit(1);
|
|
11
11
|
}
|
|
12
12
|
const server = new McpServer({
|
|
13
|
-
name: "
|
|
13
|
+
name: "capybara-mcp",
|
|
14
14
|
version: "0.1.0",
|
|
15
15
|
}, {
|
|
16
16
|
capabilities: {
|
|
@@ -19,7 +19,7 @@ const server = new McpServer({
|
|
|
19
19
|
});
|
|
20
20
|
registerTools(server, {
|
|
21
21
|
apiKey: API_KEY,
|
|
22
|
-
apiUrl:
|
|
22
|
+
apiUrl: CAPYBARA_MCP_API_URL,
|
|
23
23
|
});
|
|
24
24
|
const transport = new StdioServerTransport();
|
|
25
25
|
await server.connect(transport);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3E,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,OAAO,EAAE,EAAE;KACZ;CACF,CACF,CAAC;AAEF,aAAa,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,oBAAoB;CAC7B,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game-id.d.ts","sourceRoot":"","sources":["../../src/lib/game-id.ts"],"names":[],"mappings":"AAcA,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAM7B;AAED,wBAAsB,sBAAsB,CAC1C,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parseGameIdFromIndexHtml, setGameIdInIndexHtml } from "capybara-mcp-shared";
|
|
4
|
+
const INDEX_HTML = "index.html";
|
|
5
|
+
async function readIndexHtml(workspaceRoot) {
|
|
6
|
+
try {
|
|
7
|
+
return await fs.readFile(path.join(workspaceRoot, INDEX_HTML), "utf8");
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function readGameIdFromWorkspace(workspaceRoot) {
|
|
14
|
+
const html = await readIndexHtml(workspaceRoot);
|
|
15
|
+
if (!html) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
return parseGameIdFromIndexHtml(html);
|
|
19
|
+
}
|
|
20
|
+
export async function writeGameIdToWorkspace(workspaceRoot, gameId) {
|
|
21
|
+
const indexPath = path.join(workspaceRoot, INDEX_HTML);
|
|
22
|
+
let html = await readIndexHtml(workspaceRoot);
|
|
23
|
+
if (!html) {
|
|
24
|
+
html = `<!DOCTYPE html>
|
|
25
|
+
<html lang="en">
|
|
26
|
+
<head>
|
|
27
|
+
<meta charset="UTF-8" />
|
|
28
|
+
<title>Game</title>
|
|
29
|
+
</head>
|
|
30
|
+
<body></body>
|
|
31
|
+
</html>
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
const updated = setGameIdInIndexHtml(html, gameId);
|
|
35
|
+
await fs.writeFile(indexPath, updated, "utf8");
|
|
36
|
+
return indexPath;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=game-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game-id.js","sourceRoot":"","sources":["../../src/lib/game-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAErF,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,KAAK,UAAU,aAAa,CAAC,aAAqB;IAChD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,aAAqB;IAErB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,aAAqB,EACrB,MAAc;IAEd,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACvD,IAAI,IAAI,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;IAE9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG;;;;;;;;CAQV,CAAC;IACA,CAAC;IAED,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-workspace-context.d.ts","sourceRoot":"","sources":["../../src/lib/read-workspace-context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-workspace-context.d.ts","sourceRoot":"","sources":["../../src/lib/read-workspace-context.ts"],"names":[],"mappings":"AAwCA;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,aAAa,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA+BzG"}
|
|
@@ -2,6 +2,7 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
const ASSETS_REGISTRY_PATH = "src/data/assets.md";
|
|
4
4
|
const DATA_DIR = "src/data";
|
|
5
|
+
const INDEX_HTML_PATH = "index.html";
|
|
5
6
|
const normalizeRepoPath = (rootDir, absolutePath) => path.relative(rootDir, absolutePath).split(path.sep).join("/");
|
|
6
7
|
async function readFileIfExists(filePath) {
|
|
7
8
|
try {
|
|
@@ -53,6 +54,11 @@ export async function readWorkspaceContext(workspaceRoot = process.cwd()) {
|
|
|
53
54
|
if (propsTs != null) {
|
|
54
55
|
files[normalizeRepoPath(rootDir, propsTsPath)] = propsTs;
|
|
55
56
|
}
|
|
57
|
+
const indexHtmlPath = path.join(rootDir, INDEX_HTML_PATH);
|
|
58
|
+
const indexHtml = await readFileIfExists(indexHtmlPath);
|
|
59
|
+
if (indexHtml != null) {
|
|
60
|
+
files[INDEX_HTML_PATH] = indexHtml;
|
|
61
|
+
}
|
|
56
62
|
return files;
|
|
57
63
|
}
|
|
58
64
|
//# sourceMappingURL=read-workspace-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-workspace-context.js","sourceRoot":"","sources":["../../src/lib/read-workspace-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAClD,MAAM,QAAQ,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"read-workspace-context.js","sourceRoot":"","sources":["../../src/lib/read-workspace-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AssetToolInput } from "capybara-mcp-shared";
|
|
2
|
+
/** Load an art reference (http(s) URL or local path) as a data:image base64 URI. */
|
|
3
|
+
export declare function resolveArtReferenceToBase64(source: string, workspaceRoot: string): Promise<string>;
|
|
4
|
+
/** Replace base_map art_reference_url path/URL values with base64 data URIs. */
|
|
5
|
+
export declare function resolveBaseMapArtReferences(payload: AssetToolInput, workspaceRoot: string): Promise<AssetToolInput>;
|
|
6
|
+
//# sourceMappingURL=resolve-art-reference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-art-reference.d.ts","sourceRoot":"","sources":["../../src/lib/resolve-art-reference.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAgCvE,oFAAoF;AACpF,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAmCjB;AAED,gFAAgF;AAChF,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,CAAC,CAqBzB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const EXT_MIME = {
|
|
4
|
+
".png": "image/png",
|
|
5
|
+
".jpg": "image/jpeg",
|
|
6
|
+
".jpeg": "image/jpeg",
|
|
7
|
+
".gif": "image/gif",
|
|
8
|
+
".webp": "image/webp",
|
|
9
|
+
".bmp": "image/bmp",
|
|
10
|
+
".svg": "image/svg+xml",
|
|
11
|
+
};
|
|
12
|
+
function isHttpUrl(value) {
|
|
13
|
+
return /^https?:\/\//i.test(value);
|
|
14
|
+
}
|
|
15
|
+
function isDataImageUri(value) {
|
|
16
|
+
return /^data:image\/[a-zA-Z0-9.+-]+;base64,/i.test(value);
|
|
17
|
+
}
|
|
18
|
+
function mimeFromPath(filePath) {
|
|
19
|
+
return EXT_MIME[path.extname(filePath).toLowerCase()] ?? "image/png";
|
|
20
|
+
}
|
|
21
|
+
function mimeFromContentType(contentType) {
|
|
22
|
+
if (!contentType) {
|
|
23
|
+
return "image/png";
|
|
24
|
+
}
|
|
25
|
+
const mime = contentType.split(";")[0]?.trim().toLowerCase();
|
|
26
|
+
return mime?.startsWith("image/") ? mime : "image/png";
|
|
27
|
+
}
|
|
28
|
+
/** Load an art reference (http(s) URL or local path) as a data:image base64 URI. */
|
|
29
|
+
export async function resolveArtReferenceToBase64(source, workspaceRoot) {
|
|
30
|
+
const trimmed = source.trim();
|
|
31
|
+
if (!trimmed) {
|
|
32
|
+
throw new Error("art_reference_url is empty");
|
|
33
|
+
}
|
|
34
|
+
if (isDataImageUri(trimmed)) {
|
|
35
|
+
return trimmed;
|
|
36
|
+
}
|
|
37
|
+
if (isHttpUrl(trimmed)) {
|
|
38
|
+
const response = await fetch(trimmed);
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
throw new Error(`Failed to fetch art_reference_url (${response.status}): ${trimmed}`);
|
|
41
|
+
}
|
|
42
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
43
|
+
const mime = mimeFromContentType(response.headers.get("content-type"));
|
|
44
|
+
return `data:${mime};base64,${buffer.toString("base64")}`;
|
|
45
|
+
}
|
|
46
|
+
const absolutePath = path.isAbsolute(trimmed)
|
|
47
|
+
? trimmed
|
|
48
|
+
: path.resolve(workspaceRoot, trimmed);
|
|
49
|
+
try {
|
|
50
|
+
const buffer = await fs.readFile(absolutePath);
|
|
51
|
+
return `data:${mimeFromPath(absolutePath)};base64,${buffer.toString("base64")}`;
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
55
|
+
throw new Error(`Failed to read art_reference_url file "${trimmed}" (resolved: ${absolutePath}): ${message}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Replace base_map art_reference_url path/URL values with base64 data URIs. */
|
|
59
|
+
export async function resolveBaseMapArtReferences(payload, workspaceRoot) {
|
|
60
|
+
const assets = await Promise.all(payload.assets.map(async (asset) => {
|
|
61
|
+
if (asset.type !== "base_map") {
|
|
62
|
+
return asset;
|
|
63
|
+
}
|
|
64
|
+
const source = asset.art_reference_url;
|
|
65
|
+
if (typeof source !== "string" || !source.trim()) {
|
|
66
|
+
return asset;
|
|
67
|
+
}
|
|
68
|
+
const art_reference_url = await resolveArtReferenceToBase64(source, workspaceRoot);
|
|
69
|
+
return { ...asset, art_reference_url };
|
|
70
|
+
}));
|
|
71
|
+
return { ...payload, assets };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=resolve-art-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-art-reference.js","sourceRoot":"","sources":["../../src/lib/resolve-art-reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,QAAQ,GAA2B;IACvC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;CACxB,CAAC;AAEF,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,uCAAuC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,WAAW,CAAC;AACvE,CAAC;AAED,SAAS,mBAAmB,CAAC,WAA0B;IACrD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7D,OAAO,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;AACzD,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAc,EACd,aAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,sCAAsC,QAAQ,CAAC,MAAM,MAAM,OAAO,EAAE,CACrE,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;QACvE,OAAO,QAAQ,IAAI,WAAW,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAC3C,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC/C,OAAO,QAAQ,YAAY,CAAC,YAAY,CAAC,WAAW,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAClF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CACb,0CAA0C,OAAO,gBAAgB,YAAY,MAAM,OAAO,EAAE,CAC7F,CAAC;IACJ,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAuB,EACvB,aAAqB;IAErB,MAAM,MAAM,GAAkB,MAAM,OAAO,CAAC,GAAG,CAC7C,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAC;QACvC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,iBAAiB,GAAG,MAAM,2BAA2B,CACzD,MAAM,EACN,aAAa,CACd,CAAC;QACF,OAAO,EAAE,GAAG,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACzC,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC"}
|
package/dist/setup.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
|
+
import { CAPYBARA_MCP_API_URL, TOOL_GET_JOB_STATUS } from "capybara-mcp-shared";
|
|
5
6
|
function parseArgs(argv) {
|
|
6
7
|
const args = {};
|
|
7
8
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -16,7 +17,6 @@ function parseArgs(argv) {
|
|
|
16
17
|
}
|
|
17
18
|
const args = parseArgs(process.argv.slice(2));
|
|
18
19
|
const apiKey = args["api-key"];
|
|
19
|
-
const serverUrl = args["server-url"] || "https://api.capybara.dev/v1";
|
|
20
20
|
if (!apiKey || typeof apiKey !== "string") {
|
|
21
21
|
console.error("Missing required flag: --api-key <your-key>");
|
|
22
22
|
console.error("\nUsage:");
|
|
@@ -58,14 +58,14 @@ parsed.mcpServers["capybara-mcp"] = {
|
|
|
58
58
|
args: ["-y", "capybara-mcp"],
|
|
59
59
|
env: {
|
|
60
60
|
CAPYBARA_API_KEY: apiKey,
|
|
61
|
-
CAPYBARA_API_URL: serverUrl,
|
|
62
61
|
},
|
|
63
62
|
};
|
|
64
63
|
fs.mkdirSync(path.dirname(configPath), { recursive: true });
|
|
65
64
|
fs.writeFileSync(configPath, JSON.stringify(parsed, null, 2), "utf-8");
|
|
66
65
|
console.log(`capybara-mcp configured in:\n ${configPath}`);
|
|
66
|
+
console.log(`API: ${CAPYBARA_MCP_API_URL}`);
|
|
67
67
|
console.log("\nRestart Claude Desktop to load the new tools.");
|
|
68
68
|
console.log("\nUsing Claude Code instead? Run this:");
|
|
69
|
-
console.log(` claude mcp add capybara-mcp -e CAPYBARA_API_KEY=${apiKey}
|
|
70
|
-
console.log(
|
|
69
|
+
console.log(` claude mcp add capybara-mcp -e CAPYBARA_API_KEY=${apiKey} -- npx -y capybara-mcp`);
|
|
70
|
+
console.log(`\nIf a generate tool is interrupted, use ${TOOL_GET_JOB_STATUS} with the returned job_id.`);
|
|
71
71
|
//# sourceMappingURL=setup.js.map
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"register-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAsDhC,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC,QA4DzG"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { ASSET_TOOL_DESCRIPTION, mcpGenerateAssetInputSchema, } from "capybara-mcp-shared";
|
|
2
|
+
import { ASSET_TOOL_DESCRIPTION, mcpGenerateAssetInputSchema, TOOL_GENERATE_ASSETS, TOOL_GET_JOB_STATUS, } from "capybara-mcp-shared";
|
|
3
3
|
import { checkJobStatus, generateAssets, } from "../api/capybara-api.js";
|
|
4
4
|
import { createProgressReporter } from "../lib/progress.js";
|
|
5
5
|
import { createStatusLogger } from "../lib/status-markdown.js";
|
|
@@ -7,7 +7,7 @@ async function runLongTool({ label, extra, server, work, }) {
|
|
|
7
7
|
const statusLog = await createStatusLogger(label);
|
|
8
8
|
const { report } = createProgressReporter({ extra, server, label, statusLog });
|
|
9
9
|
const onJobId = async (jobId) => {
|
|
10
|
-
await statusLog.append(`job_id: ${jobId} (use
|
|
10
|
+
await statusLog.append(`job_id: ${jobId} (use ${TOOL_GET_JOB_STATUS} if interrupted)`);
|
|
11
11
|
};
|
|
12
12
|
try {
|
|
13
13
|
await statusLog.append("Tool call accepted");
|
|
@@ -19,12 +19,12 @@ async function runLongTool({ label, extra, server, work, }) {
|
|
|
19
19
|
}
|
|
20
20
|
catch (err) {
|
|
21
21
|
if (err instanceof DOMException && err.name === "AbortError") {
|
|
22
|
-
await statusLog.finish("cancelled",
|
|
22
|
+
await statusLog.finish("cancelled", `Cancelled — use ${TOOL_GET_JOB_STATUS} with your job_id`);
|
|
23
23
|
return {
|
|
24
24
|
content: [
|
|
25
25
|
{
|
|
26
26
|
type: "text",
|
|
27
|
-
text: `${label} cancelled. If a job_id was issued, call
|
|
27
|
+
text: `${label} cancelled. If a job_id was issued, call ${TOOL_GET_JOB_STATUS} to recover results.`,
|
|
28
28
|
},
|
|
29
29
|
],
|
|
30
30
|
isError: true,
|
|
@@ -39,27 +39,27 @@ async function runLongTool({ label, extra, server, work, }) {
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
export function registerTools(server, ctx) {
|
|
42
|
-
server.registerTool(
|
|
43
|
-
title: "Generate
|
|
42
|
+
server.registerTool(TOOL_GENERATE_ASSETS, {
|
|
43
|
+
title: "Generate assets",
|
|
44
44
|
description: ASSET_TOOL_DESCRIPTION +
|
|
45
|
-
|
|
45
|
+
` Returns a job_id for ${TOOL_GET_JOB_STATUS} if interrupted. ` +
|
|
46
46
|
"Live progress is written to `.capybara/status.md` (removed when the tool finishes).",
|
|
47
47
|
inputSchema: mcpGenerateAssetInputSchema,
|
|
48
48
|
annotations: { openWorldHint: true },
|
|
49
49
|
}, async (input, extra) => runLongTool({
|
|
50
|
-
label:
|
|
50
|
+
label: TOOL_GENERATE_ASSETS,
|
|
51
51
|
extra,
|
|
52
52
|
server,
|
|
53
53
|
work: ({ report, signal, onJobId }) => generateAssets(input, { ...ctx, report, signal, onJobId }).then((r) => ({
|
|
54
54
|
summary: r.summary,
|
|
55
55
|
})),
|
|
56
56
|
}));
|
|
57
|
-
server.registerTool(
|
|
58
|
-
title: "
|
|
59
|
-
description:
|
|
57
|
+
server.registerTool(TOOL_GET_JOB_STATUS, {
|
|
58
|
+
title: "Get job status",
|
|
59
|
+
description: `Poll a generation job by job_id. Use when ${TOOL_GENERATE_ASSETS} was interrupted, or to check ` +
|
|
60
60
|
"progress after closing the agent. When status is complete, writes any recovered files to disk.",
|
|
61
61
|
inputSchema: {
|
|
62
|
-
job_id: z.string().min(1).describe(
|
|
62
|
+
job_id: z.string().min(1).describe(`The job_id from ${TOOL_GENERATE_ASSETS}.`),
|
|
63
63
|
output_dir: z
|
|
64
64
|
.string()
|
|
65
65
|
.optional()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-tools.js","sourceRoot":"","sources":["../../src/tools/register-tools.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,sBAAsB,EACtB,2BAA2B,
|
|
1
|
+
{"version":3,"file":"register-tools.js","sourceRoot":"","sources":["../../src/tools/register-tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "capybara-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Capybara MCP tools — generate game assets from Claude Code, Cursor, Codex, and other MCP agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -8,7 +8,10 @@
|
|
|
8
8
|
"capybara-mcp": "./dist/index.js",
|
|
9
9
|
"capybara-mcp-setup": "./dist/setup.js"
|
|
10
10
|
},
|
|
11
|
-
"files": [
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
12
15
|
"scripts": {
|
|
13
16
|
"build": "tsc -p tsconfig.json",
|
|
14
17
|
"dev": "tsx src/index.ts",
|