@ankimcp/anki-mcp-server 0.12.1 → 0.13.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.
- package/README.md +53 -5
- package/bin/ankimcp.js +16 -0
- package/dist/anki-config.service.d.ts +1 -0
- package/dist/anki-config.service.js +4 -0
- package/dist/anki-config.service.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +12 -3
- package/dist/cli.js.map +1 -1
- package/dist/main-http.js +1 -0
- package/dist/main-http.js.map +1 -1
- package/dist/main-stdio.js +28 -1
- package/dist/main-stdio.js.map +1 -1
- package/dist/mcp/clients/anki-connect.client.d.ts +5 -0
- package/dist/mcp/clients/anki-connect.client.js +35 -1
- package/dist/mcp/clients/anki-connect.client.js.map +1 -1
- package/dist/mcp/config/anki-config.interface.d.ts +1 -0
- package/dist/mcp/config/anki-config.interface.js.map +1 -1
- package/dist/mcp/primitives/essential/index.d.ts +4 -8
- package/dist/mcp/primitives/essential/index.js +6 -13
- package/dist/mcp/primitives/essential/index.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/add-note.tool.js +22 -9
- package/dist/mcp/primitives/essential/tools/add-note.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/deckActions/actions/changeDeck.action.d.ts +12 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/changeDeck.action.js +24 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/changeDeck.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/createDeck.action.d.ts +15 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/createDeck.action.js +44 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/createDeck.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/{deck-stats/deck-stats.types.d.ts → deckActions/actions/deckStats.action.d.ts} +5 -2
- package/dist/mcp/primitives/essential/tools/deckActions/actions/deckStats.action.js +78 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/deckStats.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/listDecks.action.d.ts +18 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/listDecks.action.js +63 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/listDecks.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/{deck-stats/deck-stats.tool.d.ts → deckActions/deckActions.tool.d.ts} +8 -4
- package/dist/mcp/primitives/essential/tools/deckActions/deckActions.tool.js +138 -0
- package/dist/mcp/primitives/essential/tools/deckActions/deckActions.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/deckActions/index.d.ts +5 -0
- package/dist/mcp/primitives/essential/tools/deckActions/index.js +6 -0
- package/dist/mcp/primitives/essential/tools/deckActions/index.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +23 -23
- package/dist/mcp/primitives/essential/tools/create-deck.tool.d.ts +0 -105
- package/dist/mcp/primitives/essential/tools/create-deck.tool.js +0 -121
- package/dist/mcp/primitives/essential/tools/create-deck.tool.js.map +0 -1
- package/dist/mcp/primitives/essential/tools/deck-stats/deck-stats.tool.js +0 -165
- package/dist/mcp/primitives/essential/tools/deck-stats/deck-stats.tool.js.map +0 -1
- package/dist/mcp/primitives/essential/tools/deck-stats/deck-stats.types.js +0 -3
- package/dist/mcp/primitives/essential/tools/deck-stats/deck-stats.types.js.map +0 -1
- package/dist/mcp/primitives/essential/tools/deck-stats/index.d.ts +0 -2
- package/dist/mcp/primitives/essential/tools/deck-stats/index.js +0 -6
- package/dist/mcp/primitives/essential/tools/deck-stats/index.js.map +0 -1
- package/dist/mcp/primitives/essential/tools/list-decks.tool.d.ts +0 -105
- package/dist/mcp/primitives/essential/tools/list-decks.tool.js +0 -117
- package/dist/mcp/primitives/essential/tools/list-decks.tool.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-note.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/add-note.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8CAAuC;AAEvC,6BAAwB;AACxB,8EAAsE;AAEtE,0DAGgC;AAMzB,IAAM,WAAW,mBAAjB,MAAM,WAAW;IAGO;IAFZ,MAAM,GAAG,IAAI,eAAM,CAAC,aAAW,CAAC,IAAI,CAAC,CAAC;IAEvD,YAA6B,UAA6B;QAA7B,eAAU,GAAV,UAAU,CAAmB;IAAG,CAAC;IAmDxD,AAAN,KAAK,CAAC,OAAO,CACX,EACE,QAAQ,EACR,SAAS,EACT,MAAM,EACN,IAAI,EACJ,cAAc,EACd,cAAc,EACd,qBAAqB,GAatB,EACD,OAAgB;QAEhB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"add-note.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/add-note.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
2
|
+
export interface ChangeDeckParams {
|
|
3
|
+
cards: number[];
|
|
4
|
+
deck: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ChangeDeckResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
message: string;
|
|
9
|
+
cardsAffected: number;
|
|
10
|
+
targetDeck: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function changeDeck(params: ChangeDeckParams, client: AnkiConnectClient): Promise<ChangeDeckResult>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.changeDeck = changeDeck;
|
|
4
|
+
async function changeDeck(params, client) {
|
|
5
|
+
const { cards, deck } = params;
|
|
6
|
+
if (!cards || cards.length === 0) {
|
|
7
|
+
throw new Error("cards array cannot be empty");
|
|
8
|
+
}
|
|
9
|
+
if (!deck || deck.trim() === "") {
|
|
10
|
+
throw new Error("deck name cannot be empty");
|
|
11
|
+
}
|
|
12
|
+
const trimmedDeck = deck.trim();
|
|
13
|
+
await client.invoke("changeDeck", {
|
|
14
|
+
cards,
|
|
15
|
+
deck: trimmedDeck,
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
success: true,
|
|
19
|
+
message: `Successfully moved ${cards.length} card(s) to deck "${trimmedDeck}"`,
|
|
20
|
+
cardsAffected: cards.length,
|
|
21
|
+
targetDeck: trimmedDeck,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=changeDeck.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changeDeck.action.js","sourceRoot":"","sources":["../../../../../../../src/mcp/primitives/essential/tools/deckActions/actions/changeDeck.action.ts"],"names":[],"mappings":";;AA+BA,gCA8BC;AA9BM,KAAK,UAAU,UAAU,CAC9B,MAAwB,EACxB,MAAyB;IAEzB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAG/B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAGD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAGhC,MAAM,MAAM,CAAC,MAAM,CAAO,YAAY,EAAE;QACtC,KAAK;QACL,IAAI,EAAE,WAAW;KAClB,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,sBAAsB,KAAK,CAAC,MAAM,qBAAqB,WAAW,GAAG;QAC9E,aAAa,EAAE,KAAK,CAAC,MAAM;QAC3B,UAAU,EAAE,WAAW;KACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
2
|
+
export interface CreateDeckParams {
|
|
3
|
+
deckName: string;
|
|
4
|
+
}
|
|
5
|
+
export interface CreateDeckResult {
|
|
6
|
+
success: boolean;
|
|
7
|
+
deckId?: number;
|
|
8
|
+
deckName: string;
|
|
9
|
+
message: string;
|
|
10
|
+
created: boolean;
|
|
11
|
+
exists?: boolean;
|
|
12
|
+
parentDeck?: string;
|
|
13
|
+
childDeck?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function createDeck(params: CreateDeckParams, client: AnkiConnectClient): Promise<CreateDeckResult>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDeck = createDeck;
|
|
4
|
+
async function createDeck(params, client) {
|
|
5
|
+
const { deckName } = params;
|
|
6
|
+
const parts = deckName.split("::");
|
|
7
|
+
if (parts.length > 2) {
|
|
8
|
+
throw new Error("Deck name can have maximum 2 levels (parent::child)");
|
|
9
|
+
}
|
|
10
|
+
if (parts.some((part) => part.trim() === "")) {
|
|
11
|
+
throw new Error("Deck name parts cannot be empty");
|
|
12
|
+
}
|
|
13
|
+
const deckId = await client.invoke("createDeck", {
|
|
14
|
+
deck: deckName,
|
|
15
|
+
});
|
|
16
|
+
if (!deckId) {
|
|
17
|
+
const existingDecks = await client.invoke("deckNames");
|
|
18
|
+
const deckExists = existingDecks.includes(deckName);
|
|
19
|
+
if (deckExists) {
|
|
20
|
+
return {
|
|
21
|
+
success: true,
|
|
22
|
+
message: `Deck "${deckName}" already exists`,
|
|
23
|
+
deckName: deckName,
|
|
24
|
+
created: false,
|
|
25
|
+
exists: true,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
throw new Error("Failed to create deck - unknown error");
|
|
29
|
+
}
|
|
30
|
+
const result = {
|
|
31
|
+
success: true,
|
|
32
|
+
deckId: deckId,
|
|
33
|
+
deckName: deckName,
|
|
34
|
+
message: `Successfully created deck "${deckName}"`,
|
|
35
|
+
created: true,
|
|
36
|
+
};
|
|
37
|
+
if (parts.length === 2) {
|
|
38
|
+
result.parentDeck = parts[0];
|
|
39
|
+
result.childDeck = parts[1];
|
|
40
|
+
result.message = `Successfully created parent deck "${parts[0]}" and child deck "${parts[1]}"`;
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=createDeck.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createDeck.action.js","sourceRoot":"","sources":["../../../../../../../src/mcp/primitives/essential/tools/deckActions/actions/createDeck.action.ts"],"names":[],"mappings":";;AAiCA,gCAwDC;AAxDM,KAAK,UAAU,UAAU,CAC9B,MAAwB,EACxB,MAAyB;IAEzB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAG5B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAGD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAGD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAS,YAAY,EAAE;QACvD,IAAI,EAAE,QAAQ;KACf,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,CAAC;QAEZ,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,MAAM,CAAW,WAAW,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEpD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,SAAS,QAAQ,kBAAkB;gBAC5C,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,IAAI;aACb,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,GAAqB;QAC/B,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,8BAA8B,QAAQ,GAAG;QAClD,OAAO,EAAE,IAAI;KACd,CAAC;IAGF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,OAAO,GAAG,qCAAqC,KAAK,CAAC,CAAC,CAAC,qBAAqB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IACjG,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
1
2
|
import { DistributionMetrics } from "@/mcp/utils/stats.utils";
|
|
2
3
|
export interface AnkiDeckStatsResponse {
|
|
3
4
|
deck_id: number;
|
|
@@ -9,8 +10,8 @@ export interface AnkiDeckStatsResponse {
|
|
|
9
10
|
}
|
|
10
11
|
export interface DeckStatsParams {
|
|
11
12
|
deck: string;
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
easeBuckets?: number[];
|
|
14
|
+
intervalBuckets?: number[];
|
|
14
15
|
}
|
|
15
16
|
export interface DeckStatsResult {
|
|
16
17
|
deck: string;
|
|
@@ -23,3 +24,5 @@ export interface DeckStatsResult {
|
|
|
23
24
|
ease: DistributionMetrics;
|
|
24
25
|
intervals: DistributionMetrics;
|
|
25
26
|
}
|
|
27
|
+
export type ProgressCallback = (progress: number) => Promise<void>;
|
|
28
|
+
export declare function deckStats(params: DeckStatsParams, client: AnkiConnectClient, onProgress?: ProgressCallback): Promise<DeckStatsResult>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deckStats = deckStats;
|
|
4
|
+
const stats_utils_1 = require("../../../../../utils/stats.utils");
|
|
5
|
+
async function deckStats(params, client, onProgress) {
|
|
6
|
+
const { deck, easeBuckets = [2.0, 2.5, 3.0], intervalBuckets = [7, 21, 90], } = params;
|
|
7
|
+
const deckStatsResponse = await client.invoke("getDeckStats", {
|
|
8
|
+
decks: [deck],
|
|
9
|
+
});
|
|
10
|
+
if (!deckStatsResponse || Object.keys(deckStatsResponse).length === 0) {
|
|
11
|
+
throw new Error(`Deck "${deck}" not found`);
|
|
12
|
+
}
|
|
13
|
+
const deckStatsArray = Object.values(deckStatsResponse);
|
|
14
|
+
const deckStatsData = deckStatsArray.find((s) => s.name === deck);
|
|
15
|
+
if (!deckStatsData) {
|
|
16
|
+
throw new Error(`Deck "${deck}" not found in statistics response`);
|
|
17
|
+
}
|
|
18
|
+
const counts = {
|
|
19
|
+
total: deckStatsData.total_in_deck || 0,
|
|
20
|
+
new: deckStatsData.new_count || 0,
|
|
21
|
+
learning: deckStatsData.learn_count || 0,
|
|
22
|
+
review: deckStatsData.review_count || 0,
|
|
23
|
+
};
|
|
24
|
+
await onProgress?.(30);
|
|
25
|
+
if (counts.total === 0) {
|
|
26
|
+
return {
|
|
27
|
+
deck,
|
|
28
|
+
counts,
|
|
29
|
+
ease: (0, stats_utils_1.computeDistribution)([], { boundaries: easeBuckets }),
|
|
30
|
+
intervals: (0, stats_utils_1.computeDistribution)([], {
|
|
31
|
+
boundaries: intervalBuckets,
|
|
32
|
+
unitSuffix: "d",
|
|
33
|
+
}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const escapedDeckName = deck.replace(/"/g, '\\"');
|
|
37
|
+
const cardIds = await client.invoke("findCards", {
|
|
38
|
+
query: `"deck:${escapedDeckName}"`,
|
|
39
|
+
});
|
|
40
|
+
if (!cardIds || cardIds.length === 0) {
|
|
41
|
+
return {
|
|
42
|
+
deck,
|
|
43
|
+
counts,
|
|
44
|
+
ease: (0, stats_utils_1.computeDistribution)([], { boundaries: easeBuckets }),
|
|
45
|
+
intervals: (0, stats_utils_1.computeDistribution)([], {
|
|
46
|
+
boundaries: intervalBuckets,
|
|
47
|
+
unitSuffix: "d",
|
|
48
|
+
}),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
await onProgress?.(50);
|
|
52
|
+
const easeFactorsRaw = await client.invoke("getEaseFactors", {
|
|
53
|
+
cards: cardIds,
|
|
54
|
+
});
|
|
55
|
+
const easeValues = easeFactorsRaw
|
|
56
|
+
.map((e) => e / 1000)
|
|
57
|
+
.filter((e) => e > 0);
|
|
58
|
+
await onProgress?.(70);
|
|
59
|
+
const intervalsRaw = await client.invoke("getIntervals", {
|
|
60
|
+
cards: cardIds,
|
|
61
|
+
});
|
|
62
|
+
const intervalValues = intervalsRaw.filter((i) => i > 0);
|
|
63
|
+
await onProgress?.(90);
|
|
64
|
+
const ease = (0, stats_utils_1.computeDistribution)(easeValues, {
|
|
65
|
+
boundaries: easeBuckets,
|
|
66
|
+
});
|
|
67
|
+
const intervals = (0, stats_utils_1.computeDistribution)(intervalValues, {
|
|
68
|
+
boundaries: intervalBuckets,
|
|
69
|
+
unitSuffix: "d",
|
|
70
|
+
});
|
|
71
|
+
return {
|
|
72
|
+
deck,
|
|
73
|
+
counts,
|
|
74
|
+
ease,
|
|
75
|
+
intervals,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=deckStats.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deckStats.action.js","sourceRoot":"","sources":["../../../../../../../src/mcp/primitives/essential/tools/deckActions/actions/deckStats.action.ts"],"names":[],"mappings":";;AAyEA,8BAgHC;AAxLD,kEAGiC;AAqE1B,KAAK,UAAU,SAAS,CAC7B,MAAuB,EACvB,MAAyB,EACzB,UAA6B;IAE7B,MAAM,EACJ,IAAI,EACJ,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC7B,eAAe,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAC9B,GAAG,MAAM,CAAC;IAGX,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,MAAM,CAE3C,cAAc,EAAE;QAChB,KAAK,EAAE,CAAC,IAAI,CAAC;KACd,CAAC,CAAC;IAGH,IAAI,CAAC,iBAAiB,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,aAAa,CAAC,CAAC;IAC9C,CAAC;IAGD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAElE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,oCAAoC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,aAAa,CAAC,aAAa,IAAI,CAAC;QACvC,GAAG,EAAE,aAAa,CAAC,SAAS,IAAI,CAAC;QACjC,QAAQ,EAAE,aAAa,CAAC,WAAW,IAAI,CAAC;QACxC,MAAM,EAAE,aAAa,CAAC,YAAY,IAAI,CAAC;KACxC,CAAC;IAEF,MAAM,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAGvB,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,IAAI;YACJ,MAAM;YACN,IAAI,EAAE,IAAA,iCAAmB,EAAC,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;YAC1D,SAAS,EAAE,IAAA,iCAAmB,EAAC,EAAE,EAAE;gBACjC,UAAU,EAAE,eAAe;gBAC3B,UAAU,EAAE,GAAG;aAChB,CAAC;SACH,CAAC;IACJ,CAAC;IAID,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAW,WAAW,EAAE;QACzD,KAAK,EAAE,SAAS,eAAe,GAAG;KACnC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,IAAI;YACJ,MAAM;YACN,IAAI,EAAE,IAAA,iCAAmB,EAAC,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;YAC1D,SAAS,EAAE,IAAA,iCAAmB,EAAC,EAAE,EAAE;gBACjC,UAAU,EAAE,eAAe;gBAC3B,UAAU,EAAE,GAAG;aAChB,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAGvB,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,MAAM,CAAW,gBAAgB,EAAE;QACrE,KAAK,EAAE,OAAO;KACf,CAAC,CAAC;IAGH,MAAM,UAAU,GAAG,cAAc;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAExB,MAAM,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAGvB,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAW,cAAc,EAAE;QACjE,KAAK,EAAE,OAAO;KACf,CAAC,CAAC;IAGH,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAEzD,MAAM,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAGvB,MAAM,IAAI,GAAG,IAAA,iCAAmB,EAAC,UAAU,EAAE;QAC3C,UAAU,EAAE,WAAW;KACxB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAA,iCAAmB,EAAC,cAAc,EAAE;QACpD,UAAU,EAAE,eAAe;QAC3B,UAAU,EAAE,GAAG;KAChB,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,MAAM;QACN,IAAI;QACJ,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
2
|
+
import { DeckInfo } from "@/mcp/types/anki.types";
|
|
3
|
+
export interface ListDecksParams {
|
|
4
|
+
includeStats?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface ListDecksResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
decks: DeckInfo[];
|
|
9
|
+
total: number;
|
|
10
|
+
message?: string;
|
|
11
|
+
summary?: {
|
|
12
|
+
total_cards: number;
|
|
13
|
+
new_cards: number;
|
|
14
|
+
learning_cards: number;
|
|
15
|
+
review_cards: number;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare function listDecks(params: ListDecksParams, client: AnkiConnectClient): Promise<ListDecksResult>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listDecks = listDecks;
|
|
4
|
+
async function listDecks(params, client) {
|
|
5
|
+
const { includeStats = false } = params;
|
|
6
|
+
const deckNames = await client.invoke("deckNames");
|
|
7
|
+
if (!deckNames || deckNames.length === 0) {
|
|
8
|
+
return {
|
|
9
|
+
success: true,
|
|
10
|
+
message: "No decks found in Anki",
|
|
11
|
+
decks: [],
|
|
12
|
+
total: 0,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
let decks;
|
|
16
|
+
let summary;
|
|
17
|
+
if (includeStats) {
|
|
18
|
+
const deckStatsResponse = await client.invoke("getDeckStats", {
|
|
19
|
+
decks: deckNames,
|
|
20
|
+
});
|
|
21
|
+
const statsArray = Object.values(deckStatsResponse);
|
|
22
|
+
decks = deckNames.map((name) => {
|
|
23
|
+
const stats = statsArray.find((s) => s.name === name);
|
|
24
|
+
if (stats) {
|
|
25
|
+
return {
|
|
26
|
+
name,
|
|
27
|
+
stats: {
|
|
28
|
+
deck_id: stats.deck_id || 0,
|
|
29
|
+
name,
|
|
30
|
+
new_count: stats.new_count || 0,
|
|
31
|
+
learn_count: stats.learn_count || 0,
|
|
32
|
+
review_count: stats.review_count || 0,
|
|
33
|
+
total_new: stats.new_count || 0,
|
|
34
|
+
total_cards: stats.total_in_deck || 0,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return { name };
|
|
39
|
+
});
|
|
40
|
+
summary = decks.reduce((acc, deck) => {
|
|
41
|
+
if (deck.stats) {
|
|
42
|
+
acc.total_cards += deck.stats.total_cards;
|
|
43
|
+
acc.new_cards += deck.stats.new_count;
|
|
44
|
+
acc.learning_cards += deck.stats.learn_count;
|
|
45
|
+
acc.review_cards += deck.stats.review_count;
|
|
46
|
+
}
|
|
47
|
+
return acc;
|
|
48
|
+
}, { total_cards: 0, new_cards: 0, learning_cards: 0, review_cards: 0 });
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
decks = deckNames.map((name) => ({ name }));
|
|
52
|
+
}
|
|
53
|
+
const result = {
|
|
54
|
+
success: true,
|
|
55
|
+
decks,
|
|
56
|
+
total: decks.length,
|
|
57
|
+
};
|
|
58
|
+
if (summary) {
|
|
59
|
+
result.summary = summary;
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=listDecks.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listDecks.action.js","sourceRoot":"","sources":["../../../../../../../src/mcp/primitives/essential/tools/deckActions/actions/listDecks.action.ts"],"names":[],"mappings":";;AAiCA,8BAoFC;AApFM,KAAK,UAAU,SAAS,CAC7B,MAAuB,EACvB,MAAyB;IAEzB,MAAM,EAAE,YAAY,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;IAGxC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAW,WAAW,CAAC,CAAC;IAE7D,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,wBAAwB;YACjC,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,CAAC;SACT,CAAC;IACJ,CAAC;IAED,IAAI,KAAiB,CAAC;IACtB,IAAI,OAAmC,CAAC;IAExC,IAAI,YAAY,EAAE,CAAC;QAGjB,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,MAAM,CAC3C,cAAc,EACd;YACE,KAAK,EAAE,SAAS;SACjB,CACF,CAAC;QAIF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAEpD,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAE7B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC3D,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO;oBACL,IAAI;oBACJ,KAAK,EAAE;wBACL,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC;wBAC3B,IAAI;wBACJ,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC;wBAC/B,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC;wBACnC,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC;wBACrC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC;wBAC/B,WAAW,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;qBACzB;iBACf,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAGH,OAAO,GAAG,KAAK,CAAC,MAAM,CACpB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACZ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC1C,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;gBACtC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC7C,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;YAC9C,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CACrE,CAAC;IACJ,CAAC;SAAM,CAAC;QAEN,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,MAAM,GAAoB;QAC9B,OAAO,EAAE,IAAI;QACb,KAAK;QACL,KAAK,EAAE,KAAK,CAAC,MAAM;KACpB,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import type { Context } from "@rekog/mcp-nest";
|
|
2
2
|
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
3
|
-
export declare class
|
|
3
|
+
export declare class DeckActionsTool {
|
|
4
4
|
private readonly ankiClient;
|
|
5
5
|
private readonly logger;
|
|
6
6
|
constructor(ankiClient: AnkiConnectClient);
|
|
7
7
|
execute(params: {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
action: "listDecks" | "createDeck" | "deckStats" | "changeDeck";
|
|
9
|
+
includeStats?: boolean;
|
|
10
|
+
deckName?: string;
|
|
11
|
+
deck?: string;
|
|
12
|
+
easeBuckets?: number[];
|
|
13
|
+
intervalBuckets?: number[];
|
|
14
|
+
cards?: number[];
|
|
11
15
|
}, context: Context): Promise<{
|
|
12
16
|
[x: string]: unknown;
|
|
13
17
|
content: ({
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var DeckActionsTool_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.DeckActionsTool = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const mcp_nest_1 = require("@rekog/mcp-nest");
|
|
16
|
+
const zod_1 = require("zod");
|
|
17
|
+
const anki_connect_client_1 = require("../../../../clients/anki-connect.client");
|
|
18
|
+
const anki_utils_1 = require("../../../../utils/anki.utils");
|
|
19
|
+
const changeDeck_action_1 = require("./actions/changeDeck.action");
|
|
20
|
+
const listDecks_action_1 = require("./actions/listDecks.action");
|
|
21
|
+
const createDeck_action_1 = require("./actions/createDeck.action");
|
|
22
|
+
const deckStats_action_1 = require("./actions/deckStats.action");
|
|
23
|
+
let DeckActionsTool = DeckActionsTool_1 = class DeckActionsTool {
|
|
24
|
+
ankiClient;
|
|
25
|
+
logger = new common_1.Logger(DeckActionsTool_1.name);
|
|
26
|
+
constructor(ankiClient) {
|
|
27
|
+
this.ankiClient = ankiClient;
|
|
28
|
+
}
|
|
29
|
+
async execute(params, context) {
|
|
30
|
+
try {
|
|
31
|
+
this.logger.log(`Executing deck action: ${params.action}`);
|
|
32
|
+
let result;
|
|
33
|
+
switch (params.action) {
|
|
34
|
+
case "listDecks":
|
|
35
|
+
await context.reportProgress({ progress: 10, total: 100 });
|
|
36
|
+
result = await (0, listDecks_action_1.listDecks)({ includeStats: params.includeStats }, this.ankiClient);
|
|
37
|
+
await context.reportProgress({ progress: 100, total: 100 });
|
|
38
|
+
break;
|
|
39
|
+
case "createDeck":
|
|
40
|
+
if (!params.deckName) {
|
|
41
|
+
throw new Error("deckName is required for createDeck action");
|
|
42
|
+
}
|
|
43
|
+
await context.reportProgress({ progress: 25, total: 100 });
|
|
44
|
+
result = await (0, createDeck_action_1.createDeck)({ deckName: params.deckName }, this.ankiClient);
|
|
45
|
+
await context.reportProgress({ progress: 100, total: 100 });
|
|
46
|
+
break;
|
|
47
|
+
case "deckStats":
|
|
48
|
+
if (!params.deck) {
|
|
49
|
+
throw new Error("deck name is required for deckStats action");
|
|
50
|
+
}
|
|
51
|
+
await context.reportProgress({ progress: 10, total: 100 });
|
|
52
|
+
result = await (0, deckStats_action_1.deckStats)({
|
|
53
|
+
deck: params.deck,
|
|
54
|
+
easeBuckets: params.easeBuckets,
|
|
55
|
+
intervalBuckets: params.intervalBuckets,
|
|
56
|
+
}, this.ankiClient, async (progress) => {
|
|
57
|
+
await context.reportProgress({ progress, total: 100 });
|
|
58
|
+
});
|
|
59
|
+
await context.reportProgress({ progress: 100, total: 100 });
|
|
60
|
+
break;
|
|
61
|
+
case "changeDeck":
|
|
62
|
+
if (!params.cards || params.cards.length === 0) {
|
|
63
|
+
throw new Error("cards array is required for changeDeck action");
|
|
64
|
+
}
|
|
65
|
+
if (!params.deck) {
|
|
66
|
+
throw new Error("deck name is required for changeDeck action");
|
|
67
|
+
}
|
|
68
|
+
await context.reportProgress({ progress: 25, total: 100 });
|
|
69
|
+
result = await (0, changeDeck_action_1.changeDeck)({ cards: params.cards, deck: params.deck }, this.ankiClient);
|
|
70
|
+
await context.reportProgress({ progress: 100, total: 100 });
|
|
71
|
+
break;
|
|
72
|
+
default: {
|
|
73
|
+
const _exhaustive = params.action;
|
|
74
|
+
throw new Error(`Unknown action: ${_exhaustive}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
this.logger.log(`Successfully executed ${params.action}`);
|
|
78
|
+
return (0, anki_utils_1.createSuccessResponse)(result);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
this.logger.error(`Failed to execute ${params.action}`, error);
|
|
82
|
+
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
83
|
+
action: params.action,
|
|
84
|
+
hint: "Make sure Anki is running and the deck name/card IDs are valid",
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
exports.DeckActionsTool = DeckActionsTool;
|
|
90
|
+
__decorate([
|
|
91
|
+
(0, mcp_nest_1.Tool)({
|
|
92
|
+
name: "deckActions",
|
|
93
|
+
description: `Manage Anki deck operations. Supports four actions:
|
|
94
|
+
- listDecks: List all decks, optionally with statistics (includeStats: boolean)
|
|
95
|
+
- createDeck: Create a new empty deck (deckName: string, max 2 levels like "Parent::Child")
|
|
96
|
+
- deckStats: Get comprehensive statistics for a single deck including card counts, ease and interval distributions (deck: string, optional easeBuckets/intervalBuckets arrays)
|
|
97
|
+
- changeDeck: Move cards to a different deck (cards: number[], deck: string)
|
|
98
|
+
|
|
99
|
+
Remember to sync first at the start of a session for latest data.`,
|
|
100
|
+
parameters: zod_1.z.object({
|
|
101
|
+
action: zod_1.z
|
|
102
|
+
.enum(["listDecks", "createDeck", "deckStats", "changeDeck"])
|
|
103
|
+
.describe("The deck action to perform"),
|
|
104
|
+
includeStats: zod_1.z
|
|
105
|
+
.boolean()
|
|
106
|
+
.optional()
|
|
107
|
+
.describe("[listDecks] Include card count statistics for each deck"),
|
|
108
|
+
deckName: zod_1.z
|
|
109
|
+
.string()
|
|
110
|
+
.optional()
|
|
111
|
+
.describe('[createDeck] The name of the deck to create. Use "::" for parent::child structure (max 2 levels)'),
|
|
112
|
+
deck: zod_1.z
|
|
113
|
+
.string()
|
|
114
|
+
.optional()
|
|
115
|
+
.describe('[deckStats/changeDeck] Deck name (e.g., "Japanese::JLPT N5")'),
|
|
116
|
+
easeBuckets: zod_1.z
|
|
117
|
+
.array(zod_1.z.number().positive())
|
|
118
|
+
.optional()
|
|
119
|
+
.describe("[deckStats] Bucket boundaries for ease factor distribution. Default: [2.0, 2.5, 3.0]"),
|
|
120
|
+
intervalBuckets: zod_1.z
|
|
121
|
+
.array(zod_1.z.number().positive())
|
|
122
|
+
.optional()
|
|
123
|
+
.describe("[deckStats] Bucket boundaries for interval distribution in days. Default: [7, 21, 90]"),
|
|
124
|
+
cards: zod_1.z
|
|
125
|
+
.array(zod_1.z.number())
|
|
126
|
+
.optional()
|
|
127
|
+
.describe("[changeDeck] Array of card IDs to move"),
|
|
128
|
+
}),
|
|
129
|
+
}),
|
|
130
|
+
__metadata("design:type", Function),
|
|
131
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
132
|
+
__metadata("design:returntype", Promise)
|
|
133
|
+
], DeckActionsTool.prototype, "execute", null);
|
|
134
|
+
exports.DeckActionsTool = DeckActionsTool = DeckActionsTool_1 = __decorate([
|
|
135
|
+
(0, common_1.Injectable)(),
|
|
136
|
+
__metadata("design:paramtypes", [anki_connect_client_1.AnkiConnectClient])
|
|
137
|
+
], DeckActionsTool);
|
|
138
|
+
//# sourceMappingURL=deckActions.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deckActions.tool.js","sourceRoot":"","sources":["../../../../../../src/mcp/primitives/essential/tools/deckActions/deckActions.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { DeckActionsTool } from "./deckActions.tool";
|
|
2
|
+
export type { ChangeDeckParams, ChangeDeckResult, } from "./actions/changeDeck.action";
|
|
3
|
+
export type { ListDecksParams, ListDecksResult, } from "./actions/listDecks.action";
|
|
4
|
+
export type { CreateDeckParams, CreateDeckResult, } from "./actions/createDeck.action";
|
|
5
|
+
export type { DeckStatsParams, DeckStatsResult, AnkiDeckStatsResponse, } from "./actions/deckStats.action";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeckActionsTool = void 0;
|
|
4
|
+
var deckActions_tool_1 = require("./deckActions.tool");
|
|
5
|
+
Object.defineProperty(exports, "DeckActionsTool", { enumerable: true, get: function () { return deckActions_tool_1.DeckActionsTool; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/mcp/primitives/essential/tools/deckActions/index.ts"],"names":[],"mappings":";;;AAIA,uDAAqD;AAA5C,mHAAA,eAAe,OAAA"}
|