anki-mcp-http 0.7.1 → 0.8.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/LICENSE +5 -19
- package/README.md +152 -35
- package/bin/ankimcp.js +0 -0
- package/dist/anki-config.service.d.ts +2 -2
- package/dist/anki-config.service.js +4 -4
- package/dist/app.module.d.ts +1 -1
- package/dist/app.module.js +7 -7
- package/dist/app.module.js.map +1 -1
- package/dist/bootstrap.d.ts +1 -1
- package/dist/bootstrap.js +4 -4
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +41 -27
- package/dist/cli.js.map +1 -1
- package/dist/http/guards/origin-validation.guard.d.ts +1 -1
- package/dist/http/guards/origin-validation.guard.js +5 -5
- package/dist/main-http.js +16 -2
- package/dist/main-http.js.map +1 -1
- package/dist/main-stdio.js +2 -2
- package/dist/mcp/clients/__mocks__/anki-connect.client.js +1 -1
- package/dist/mcp/clients/anki-connect.client.d.ts +1 -1
- package/dist/mcp/clients/anki-connect.client.js +7 -7
- package/dist/mcp/config/anki-config.interface.js +1 -1
- package/dist/mcp/primitives/essential/index.d.ts +26 -26
- package/dist/mcp/primitives/essential/index.js +1 -4
- package/dist/mcp/primitives/essential/index.js.map +1 -1
- package/dist/mcp/primitives/essential/prompts/review-session.prompt.js +5 -5
- package/dist/mcp/primitives/essential/prompts/review-session.prompt.js.map +1 -1
- package/dist/mcp/primitives/essential/prompts/twenty-rules.prompt/index.js +10 -8
- package/dist/mcp/primitives/essential/prompts/twenty-rules.prompt/index.js.map +1 -1
- package/dist/mcp/primitives/essential/resources/system-info.resource.js +12 -12
- package/dist/mcp/primitives/essential/tools/add-note.tool.d.ts +3 -3
- package/dist/mcp/primitives/essential/tools/add-note.tool.js +27 -30
- package/dist/mcp/primitives/essential/tools/add-note.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/create-deck.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/create-deck.tool.js +15 -15
- package/dist/mcp/primitives/essential/tools/create-deck.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/create-model.tool.d.ts +3 -3
- package/dist/mcp/primitives/essential/tools/create-model.tool.js +20 -18
- package/dist/mcp/primitives/essential/tools/create-model.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/delete-notes.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/delete-notes.tool.js +22 -22
- package/dist/mcp/primitives/essential/tools/delete-notes.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/find-notes.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/find-notes.tool.js +14 -14
- package/dist/mcp/primitives/essential/tools/find-notes.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/get-due-cards.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/get-due-cards.tool.js +17 -15
- package/dist/mcp/primitives/essential/tools/get-due-cards.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/list-decks.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/list-decks.tool.js +10 -10
- package/dist/mcp/primitives/essential/tools/list-decks.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/deleteMediaFile.action.d.ts +1 -1
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/deleteMediaFile.action.js +3 -3
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.d.ts +1 -1
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.js +1 -1
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/retrieveMediaFile.action.d.ts +1 -1
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/retrieveMediaFile.action.js +3 -3
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.d.ts +1 -1
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.js +7 -7
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/mediaActions/index.d.ts +5 -5
- package/dist/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.d.ts +3 -3
- package/dist/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.js +23 -17
- package/dist/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/model-field-names.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/model-field-names.tool.js +20 -17
- package/dist/mcp/primitives/essential/tools/model-field-names.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/model-names.tool.d.ts +3 -3
- package/dist/mcp/primitives/essential/tools/model-names.tool.js +13 -11
- package/dist/mcp/primitives/essential/tools/model-names.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/model-styling.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/model-styling.tool.js +11 -11
- package/dist/mcp/primitives/essential/tools/model-styling.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/notes-info.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/notes-info.tool.js +19 -19
- package/dist/mcp/primitives/essential/tools/notes-info.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/present-card.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/present-card.tool.js +11 -11
- package/dist/mcp/primitives/essential/tools/present-card.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/rate-card.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/rate-card.tool.js +19 -14
- package/dist/mcp/primitives/essential/tools/rate-card.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/sync.tool.d.ts +3 -3
- package/dist/mcp/primitives/essential/tools/sync.tool.js +8 -8
- package/dist/mcp/primitives/essential/tools/sync.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/update-model-styling.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/update-model-styling.tool.js +19 -19
- package/dist/mcp/primitives/essential/tools/update-model-styling.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/update-note-fields.tool.d.ts +3 -3
- package/dist/mcp/primitives/essential/tools/update-note-fields.tool.js +32 -32
- package/dist/mcp/primitives/essential/tools/update-note-fields.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/index.d.ts +17 -17
- package/dist/mcp/primitives/gui/index.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.d.ts +2 -2
- package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.js +22 -22
- package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-browse.tool.d.ts +3 -3
- package/dist/mcp/primitives/gui/tools/gui-browse.tool.js +15 -14
- package/dist/mcp/primitives/gui/tools/gui-browse.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-current-card.tool.d.ts +3 -3
- package/dist/mcp/primitives/gui/tools/gui-current-card.tool.js +13 -13
- package/dist/mcp/primitives/gui/tools/gui-current-card.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.d.ts +3 -3
- package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.js +12 -12
- package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.d.ts +2 -2
- package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.js +15 -12
- package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.d.ts +2 -2
- package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.js +13 -12
- package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-select-card.tool.d.ts +2 -2
- package/dist/mcp/primitives/gui/tools/gui-select-card.tool.js +18 -15
- package/dist/mcp/primitives/gui/tools/gui-select-card.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.d.ts +3 -3
- package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.js +15 -14
- package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.d.ts +3 -3
- package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.js +15 -15
- package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-show-question.tool.d.ts +3 -3
- package/dist/mcp/primitives/gui/tools/gui-show-question.tool.js +15 -15
- package/dist/mcp/primitives/gui/tools/gui-show-question.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-undo.tool.d.ts +3 -3
- package/dist/mcp/primitives/gui/tools/gui-undo.tool.js +15 -15
- package/dist/mcp/primitives/gui/tools/gui-undo.tool.js.map +1 -1
- package/dist/mcp/types/anki.types.d.ts +2 -2
- package/dist/mcp/utils/anki.utils.d.ts +3 -3
- package/dist/mcp/utils/anki.utils.js +42 -38
- package/dist/mcp/utils/anki.utils.js.map +1 -1
- package/dist/mcp/utils/markdown.utils.js +16 -12
- package/dist/mcp/utils/markdown.utils.js.map +1 -1
- package/dist/mcp/utils/mcpb-workarounds.js +2 -2
- package/dist/mcp/utils/mcpb-workarounds.js.map +1 -1
- package/dist/services/ngrok.service.d.ts +15 -0
- package/dist/services/ngrok.service.js +120 -0
- package/dist/services/ngrok.service.js.map +1 -0
- package/dist/test-fixtures/mock-data.d.ts +2 -2
- package/dist/test-fixtures/mock-data.js +46 -46
- package/dist/test-fixtures/mock-data.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +12 -7
|
@@ -27,13 +27,13 @@ let ListDecksTool = ListDecksTool_1 = class ListDecksTool {
|
|
|
27
27
|
const includeStats = include_stats || false;
|
|
28
28
|
this.logger.log(`Listing Anki decks with stats: ${includeStats}`);
|
|
29
29
|
await context.reportProgress({ progress: 10, total: 100 });
|
|
30
|
-
const deckNames = await this.ankiClient.invoke(
|
|
30
|
+
const deckNames = await this.ankiClient.invoke("deckNames");
|
|
31
31
|
if (!deckNames || deckNames.length === 0) {
|
|
32
|
-
this.logger.log(
|
|
32
|
+
this.logger.log("No decks found");
|
|
33
33
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
34
34
|
return (0, anki_utils_1.createSuccessResponse)({
|
|
35
35
|
success: true,
|
|
36
|
-
message:
|
|
36
|
+
message: "No decks found in Anki",
|
|
37
37
|
decks: [],
|
|
38
38
|
});
|
|
39
39
|
}
|
|
@@ -41,11 +41,11 @@ let ListDecksTool = ListDecksTool_1 = class ListDecksTool {
|
|
|
41
41
|
let decks;
|
|
42
42
|
let summary;
|
|
43
43
|
if (includeStats) {
|
|
44
|
-
const deckStatsResponse = await this.ankiClient.invoke(
|
|
44
|
+
const deckStatsResponse = await this.ankiClient.invoke("getDeckStats", {
|
|
45
45
|
decks: deckNames,
|
|
46
46
|
});
|
|
47
47
|
const statsArray = Object.values(deckStatsResponse);
|
|
48
|
-
decks = deckNames.map(name => {
|
|
48
|
+
decks = deckNames.map((name) => {
|
|
49
49
|
const stats = statsArray.find((s) => s.name === name);
|
|
50
50
|
if (stats) {
|
|
51
51
|
return {
|
|
@@ -74,7 +74,7 @@ let ListDecksTool = ListDecksTool_1 = class ListDecksTool {
|
|
|
74
74
|
}, { total_cards: 0, new_cards: 0, learning_cards: 0, review_cards: 0 });
|
|
75
75
|
}
|
|
76
76
|
else {
|
|
77
|
-
decks = deckNames.map(name => ({ name }));
|
|
77
|
+
decks = deckNames.map((name) => ({ name }));
|
|
78
78
|
}
|
|
79
79
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
80
80
|
this.logger.log(`Found ${decks.length} decks`);
|
|
@@ -89,7 +89,7 @@ let ListDecksTool = ListDecksTool_1 = class ListDecksTool {
|
|
|
89
89
|
return (0, anki_utils_1.createSuccessResponse)(response);
|
|
90
90
|
}
|
|
91
91
|
catch (error) {
|
|
92
|
-
this.logger.error(
|
|
92
|
+
this.logger.error("Failed to list decks", error);
|
|
93
93
|
return (0, anki_utils_1.createErrorResponse)(error);
|
|
94
94
|
}
|
|
95
95
|
}
|
|
@@ -97,13 +97,13 @@ let ListDecksTool = ListDecksTool_1 = class ListDecksTool {
|
|
|
97
97
|
exports.ListDecksTool = ListDecksTool;
|
|
98
98
|
__decorate([
|
|
99
99
|
(0, mcp_nest_1.Tool)({
|
|
100
|
-
name:
|
|
101
|
-
description:
|
|
100
|
+
name: "list_decks",
|
|
101
|
+
description: "List all available Anki decks, optionally with statistics. Remember to sync first at the start of a review session for latest data.",
|
|
102
102
|
parameters: zod_1.z.object({
|
|
103
103
|
include_stats: zod_1.z
|
|
104
104
|
.boolean()
|
|
105
105
|
.default(false)
|
|
106
|
-
.describe(
|
|
106
|
+
.describe("Include card count statistics for each deck"),
|
|
107
107
|
}),
|
|
108
108
|
}),
|
|
109
109
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-decks.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/list-decks.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8CAAuC;AAEvC,6BAAwB;AACxB,8EAAsE;AAEtE,
|
|
1
|
+
{"version":3,"file":"list-decks.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/list-decks.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.deleteMediaFile = deleteMediaFile;
|
|
4
4
|
async function deleteMediaFile(params, client) {
|
|
5
5
|
const { filename } = params;
|
|
6
|
-
if (!filename || filename.trim() ===
|
|
7
|
-
throw new Error(
|
|
6
|
+
if (!filename || filename.trim() === "") {
|
|
7
|
+
throw new Error("Filename cannot be empty");
|
|
8
8
|
}
|
|
9
|
-
await client.invoke(
|
|
9
|
+
await client.invoke("deleteMediaFile", {
|
|
10
10
|
filename,
|
|
11
11
|
});
|
|
12
12
|
return {
|
package/dist/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.js
CHANGED
|
@@ -7,7 +7,7 @@ async function getMediaFilesNames(params, client) {
|
|
|
7
7
|
if (pattern) {
|
|
8
8
|
ankiParams.pattern = pattern;
|
|
9
9
|
}
|
|
10
|
-
const result = await client.invoke(
|
|
10
|
+
const result = await client.invoke("getMediaFilesNames", ankiParams);
|
|
11
11
|
const message = pattern
|
|
12
12
|
? `Found ${result.length} media file(s) matching pattern "${pattern}"`
|
|
13
13
|
: `Found ${result.length} media file(s)`;
|
package/dist/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMediaFilesNames.action.js","sourceRoot":"","sources":["../../../../../../../src/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.ts"],"names":[],"mappings":";;AAyBA,
|
|
1
|
+
{"version":3,"file":"getMediaFilesNames.action.js","sourceRoot":"","sources":["../../../../../../../src/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.ts"],"names":[],"mappings":";;AAyBA,gDA6BC;AA7BM,KAAK,UAAU,kBAAkB,CACtC,MAAgC,EAChC,MAAyB;IAEzB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAG3B,MAAM,UAAU,GAAwB,EAAE,CAAC;IAC3C,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAC/B,CAAC;IAGD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAChC,oBAAoB,EACpB,UAAU,CACX,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO;QACrB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,oCAAoC,OAAO,GAAG;QACtE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,gBAAgB,CAAC;IAE3C,OAAO;QACL,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,OAAO;QACP,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;KAC5B,CAAC;AACJ,CAAC"}
|
package/dist/mcp/primitives/essential/tools/mediaActions/actions/retrieveMediaFile.action.js
CHANGED
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.retrieveMediaFile = retrieveMediaFile;
|
|
4
4
|
async function retrieveMediaFile(params, client) {
|
|
5
5
|
const { filename } = params;
|
|
6
|
-
if (!filename || filename.trim() ===
|
|
7
|
-
throw new Error(
|
|
6
|
+
if (!filename || filename.trim() === "") {
|
|
7
|
+
throw new Error("Filename cannot be empty");
|
|
8
8
|
}
|
|
9
|
-
const result = await client.invoke(
|
|
9
|
+
const result = await client.invoke("retrieveMediaFile", {
|
|
10
10
|
filename,
|
|
11
11
|
});
|
|
12
12
|
if (result === false) {
|
|
@@ -4,16 +4,16 @@ exports.storeMediaFile = storeMediaFile;
|
|
|
4
4
|
async function storeMediaFile(params, client) {
|
|
5
5
|
const { filename, data, path, url, deleteExisting = true } = params;
|
|
6
6
|
if (!data && !path && !url) {
|
|
7
|
-
throw new Error(
|
|
7
|
+
throw new Error("Must provide either data, path, or url parameter");
|
|
8
8
|
}
|
|
9
9
|
const sources = [data, path, url].filter(Boolean);
|
|
10
10
|
if (sources.length > 1) {
|
|
11
|
-
throw new Error(
|
|
11
|
+
throw new Error("Cannot provide multiple sources (data, path, url). Choose one.");
|
|
12
12
|
}
|
|
13
|
-
if (!filename || filename.trim() ===
|
|
14
|
-
throw new Error(
|
|
13
|
+
if (!filename || filename.trim() === "") {
|
|
14
|
+
throw new Error("Filename cannot be empty");
|
|
15
15
|
}
|
|
16
|
-
const prefixedWithUnderscore = filename.startsWith(
|
|
16
|
+
const prefixedWithUnderscore = filename.startsWith("_");
|
|
17
17
|
const ankiParams = {
|
|
18
18
|
filename,
|
|
19
19
|
deleteExisting,
|
|
@@ -27,9 +27,9 @@ async function storeMediaFile(params, client) {
|
|
|
27
27
|
else if (url) {
|
|
28
28
|
ankiParams.url = url;
|
|
29
29
|
}
|
|
30
|
-
const result = await client.invoke(
|
|
30
|
+
const result = await client.invoke("storeMediaFile", ankiParams);
|
|
31
31
|
if (!result) {
|
|
32
|
-
throw new Error(
|
|
32
|
+
throw new Error("Failed to store media file");
|
|
33
33
|
}
|
|
34
34
|
return {
|
|
35
35
|
success: true,
|
package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storeMediaFile.action.js","sourceRoot":"","sources":["../../../../../../../src/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.ts"],"names":[],"mappings":";;AAoCA,
|
|
1
|
+
{"version":3,"file":"storeMediaFile.action.js","sourceRoot":"","sources":["../../../../../../../src/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.ts"],"names":[],"mappings":";;AAoCA,wCAuDC;AAvDM,KAAK,UAAU,cAAc,CAClC,MAA4B,EAC5B,MAAyB;IAEzB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAGpE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAGD,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAGD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAGD,MAAM,sBAAsB,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAGxD,MAAM,UAAU,GAAwB;QACtC,QAAQ;QACR,cAAc;KACf,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;IACzB,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;IACzB,CAAC;SAAM,IAAI,GAAG,EAAE,CAAC;QACf,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC;IACvB,CAAC;IAGD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAS,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAGzE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,mCAAmC,MAAM,EAAE;QACpD,sBAAsB;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { MediaActionsTool } from
|
|
2
|
-
export type { StoreMediaFileParams, StoreMediaFileResult, } from
|
|
3
|
-
export type { RetrieveMediaFileParams, RetrieveMediaFileResult, } from
|
|
4
|
-
export type { GetMediaFilesNamesParams, GetMediaFilesNamesResult, } from
|
|
5
|
-
export type { DeleteMediaFileParams, DeleteMediaFileResult, } from
|
|
1
|
+
export { MediaActionsTool } from "./mediaActions.tool";
|
|
2
|
+
export type { StoreMediaFileParams, StoreMediaFileResult, } from "./actions/storeMediaFile.action";
|
|
3
|
+
export type { RetrieveMediaFileParams, RetrieveMediaFileResult, } from "./actions/retrieveMediaFile.action";
|
|
4
|
+
export type { GetMediaFilesNamesParams, GetMediaFilesNamesResult, } from "./actions/getMediaFilesNames.action";
|
|
5
|
+
export type { DeleteMediaFileParams, DeleteMediaFileResult, } from "./actions/deleteMediaFile.action";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type { Context } from
|
|
2
|
-
import { AnkiConnectClient } from
|
|
1
|
+
import type { Context } from "@rekog/mcp-nest";
|
|
2
|
+
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
3
3
|
export declare class MediaActionsTool {
|
|
4
4
|
private readonly ankiClient;
|
|
5
5
|
private readonly logger;
|
|
6
6
|
constructor(ankiClient: AnkiConnectClient);
|
|
7
7
|
execute(params: {
|
|
8
|
-
action:
|
|
8
|
+
action: "storeMediaFile" | "retrieveMediaFile" | "getMediaFilesNames" | "deleteMediaFile";
|
|
9
9
|
filename?: string;
|
|
10
10
|
data?: string;
|
|
11
11
|
path?: string;
|
|
@@ -31,9 +31,9 @@ let MediaActionsTool = MediaActionsTool_1 = class MediaActionsTool {
|
|
|
31
31
|
this.logger.log(`Executing media action: ${params.action}`);
|
|
32
32
|
let result;
|
|
33
33
|
switch (params.action) {
|
|
34
|
-
case
|
|
34
|
+
case "storeMediaFile":
|
|
35
35
|
if (!params.filename) {
|
|
36
|
-
throw new Error(
|
|
36
|
+
throw new Error("filename is required for storeMediaFile action");
|
|
37
37
|
}
|
|
38
38
|
await context.reportProgress({ progress: 25, total: 100 });
|
|
39
39
|
result = await (0, storeMediaFile_action_1.storeMediaFile)({
|
|
@@ -45,30 +45,31 @@ let MediaActionsTool = MediaActionsTool_1 = class MediaActionsTool {
|
|
|
45
45
|
}, this.ankiClient);
|
|
46
46
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
47
47
|
break;
|
|
48
|
-
case
|
|
48
|
+
case "retrieveMediaFile":
|
|
49
49
|
if (!params.filename) {
|
|
50
|
-
throw new Error(
|
|
50
|
+
throw new Error("filename is required for retrieveMediaFile action");
|
|
51
51
|
}
|
|
52
52
|
await context.reportProgress({ progress: 50, total: 100 });
|
|
53
53
|
result = await (0, retrieveMediaFile_action_1.retrieveMediaFile)({ filename: params.filename }, this.ankiClient);
|
|
54
54
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
55
55
|
break;
|
|
56
|
-
case
|
|
56
|
+
case "getMediaFilesNames":
|
|
57
57
|
await context.reportProgress({ progress: 50, total: 100 });
|
|
58
58
|
result = await (0, getMediaFilesNames_action_1.getMediaFilesNames)({ pattern: params.pattern }, this.ankiClient);
|
|
59
59
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
60
60
|
break;
|
|
61
|
-
case
|
|
61
|
+
case "deleteMediaFile":
|
|
62
62
|
if (!params.filename) {
|
|
63
|
-
throw new Error(
|
|
63
|
+
throw new Error("filename is required for deleteMediaFile action");
|
|
64
64
|
}
|
|
65
65
|
await context.reportProgress({ progress: 50, total: 100 });
|
|
66
66
|
result = await (0, deleteMediaFile_action_1.deleteMediaFile)({ filename: params.filename }, this.ankiClient);
|
|
67
67
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
68
68
|
break;
|
|
69
|
-
default:
|
|
69
|
+
default: {
|
|
70
70
|
const _exhaustive = params.action;
|
|
71
71
|
throw new Error(`Unknown action: ${_exhaustive}`);
|
|
72
|
+
}
|
|
72
73
|
}
|
|
73
74
|
this.logger.log(`Successfully executed ${params.action}`);
|
|
74
75
|
return (0, anki_utils_1.createSuccessResponse)(result);
|
|
@@ -77,7 +78,7 @@ let MediaActionsTool = MediaActionsTool_1 = class MediaActionsTool {
|
|
|
77
78
|
this.logger.error(`Failed to execute ${params.action}`, error);
|
|
78
79
|
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
79
80
|
action: params.action,
|
|
80
|
-
hint:
|
|
81
|
+
hint: "Make sure Anki is running and the media file/path is valid",
|
|
81
82
|
});
|
|
82
83
|
}
|
|
83
84
|
}
|
|
@@ -85,7 +86,7 @@ let MediaActionsTool = MediaActionsTool_1 = class MediaActionsTool {
|
|
|
85
86
|
exports.MediaActionsTool = MediaActionsTool;
|
|
86
87
|
__decorate([
|
|
87
88
|
(0, mcp_nest_1.Tool)({
|
|
88
|
-
name:
|
|
89
|
+
name: "mediaActions",
|
|
89
90
|
description: `Manage Anki media files (audio/images). Supports four actions:
|
|
90
91
|
- storeMediaFile: Upload media to Anki (supports base64 data, file paths, or URLs)
|
|
91
92
|
- retrieveMediaFile: Download media from Anki as base64
|
|
@@ -95,29 +96,34 @@ __decorate([
|
|
|
95
96
|
Perfect for workflows like ElevenLabs TTS → Anki audio flashcards.`,
|
|
96
97
|
parameters: zod_1.z.object({
|
|
97
98
|
action: zod_1.z
|
|
98
|
-
.enum([
|
|
99
|
-
|
|
99
|
+
.enum([
|
|
100
|
+
"storeMediaFile",
|
|
101
|
+
"retrieveMediaFile",
|
|
102
|
+
"getMediaFilesNames",
|
|
103
|
+
"deleteMediaFile",
|
|
104
|
+
])
|
|
105
|
+
.describe("The media action to perform"),
|
|
100
106
|
filename: zod_1.z
|
|
101
107
|
.string()
|
|
102
108
|
.optional()
|
|
103
|
-
.describe(
|
|
109
|
+
.describe("Filename (required for storeMediaFile, retrieveMediaFile, deleteMediaFile)"),
|
|
104
110
|
data: zod_1.z
|
|
105
111
|
.string()
|
|
106
112
|
.optional()
|
|
107
|
-
.describe(
|
|
113
|
+
.describe("[storeMediaFile only] Base64-encoded file content"),
|
|
108
114
|
path: zod_1.z
|
|
109
115
|
.string()
|
|
110
116
|
.optional()
|
|
111
|
-
.describe(
|
|
117
|
+
.describe("[storeMediaFile only] Absolute file path"),
|
|
112
118
|
url: zod_1.z
|
|
113
119
|
.string()
|
|
114
120
|
.optional()
|
|
115
|
-
.describe(
|
|
121
|
+
.describe("[storeMediaFile only] URL to download file from"),
|
|
116
122
|
deleteExisting: zod_1.z
|
|
117
123
|
.boolean()
|
|
118
124
|
.optional()
|
|
119
125
|
.default(true)
|
|
120
|
-
.describe(
|
|
126
|
+
.describe("[storeMediaFile only] Overwrite existing file (default: true)"),
|
|
121
127
|
pattern: zod_1.z
|
|
122
128
|
.string()
|
|
123
129
|
.optional()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaActions.tool.js","sourceRoot":"","sources":["../../../../../../src/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8CAAuC;AAEvC,6BAAwB;AACxB,iFAAsE;AACtE,
|
|
1
|
+
{"version":3,"file":"mediaActions.tool.js","sourceRoot":"","sources":["../../../../../../src/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Context } from
|
|
2
|
-
import { AnkiConnectClient } from
|
|
1
|
+
import type { Context } from "@rekog/mcp-nest";
|
|
2
|
+
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
3
3
|
export declare class ModelFieldNamesTool {
|
|
4
4
|
private readonly ankiClient;
|
|
5
5
|
private readonly logger;
|
|
@@ -26,7 +26,7 @@ let ModelFieldNamesTool = ModelFieldNamesTool_1 = class ModelFieldNamesTool {
|
|
|
26
26
|
try {
|
|
27
27
|
this.logger.log(`Retrieving field names for model: ${modelName}`);
|
|
28
28
|
await context.reportProgress({ progress: 25, total: 100 });
|
|
29
|
-
const fieldNames = await this.ankiClient.invoke(
|
|
29
|
+
const fieldNames = await this.ankiClient.invoke("modelFieldNames", {
|
|
30
30
|
modelName: modelName,
|
|
31
31
|
});
|
|
32
32
|
await context.reportProgress({ progress: 75, total: 100 });
|
|
@@ -35,7 +35,7 @@ let ModelFieldNamesTool = ModelFieldNamesTool_1 = class ModelFieldNamesTool {
|
|
|
35
35
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
36
36
|
return (0, anki_utils_1.createErrorResponse)(new Error(`Model "${modelName}" not found`), {
|
|
37
37
|
modelName: modelName,
|
|
38
|
-
hint:
|
|
38
|
+
hint: "Use modelNames tool to see available models",
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
41
|
if (fieldNames.length === 0) {
|
|
@@ -53,22 +53,24 @@ let ModelFieldNamesTool = ModelFieldNamesTool_1 = class ModelFieldNamesTool {
|
|
|
53
53
|
this.logger.log(`Found ${fieldNames.length} fields for model ${modelName}`);
|
|
54
54
|
let exampleFields;
|
|
55
55
|
const lowerModelName = modelName.toLowerCase();
|
|
56
|
-
if (lowerModelName.includes(
|
|
56
|
+
if (lowerModelName.includes("basic") &&
|
|
57
|
+
!lowerModelName.includes("reversed")) {
|
|
57
58
|
exampleFields = {
|
|
58
|
-
Front:
|
|
59
|
-
Back:
|
|
59
|
+
Front: "Question or prompt text",
|
|
60
|
+
Back: "Answer or response text",
|
|
60
61
|
};
|
|
61
62
|
}
|
|
62
|
-
else if (lowerModelName.includes(
|
|
63
|
+
else if (lowerModelName.includes("basic") &&
|
|
64
|
+
lowerModelName.includes("reversed")) {
|
|
63
65
|
exampleFields = {
|
|
64
|
-
Front:
|
|
65
|
-
Back:
|
|
66
|
+
Front: "First side of the card",
|
|
67
|
+
Back: "Second side of the card",
|
|
66
68
|
};
|
|
67
69
|
}
|
|
68
|
-
else if (lowerModelName.includes(
|
|
70
|
+
else if (lowerModelName.includes("cloze")) {
|
|
69
71
|
exampleFields = {
|
|
70
|
-
Text:
|
|
71
|
-
Extra:
|
|
72
|
+
Text: "The {{c1::hidden}} text will be replaced with [...] on the card",
|
|
73
|
+
Extra: "Additional information or hints",
|
|
72
74
|
};
|
|
73
75
|
}
|
|
74
76
|
const response = {
|
|
@@ -76,11 +78,12 @@ let ModelFieldNamesTool = ModelFieldNamesTool_1 = class ModelFieldNamesTool {
|
|
|
76
78
|
modelName: modelName,
|
|
77
79
|
fieldNames: fieldNames,
|
|
78
80
|
total: fieldNames.length,
|
|
79
|
-
message: `Model "${modelName}" has ${fieldNames.length} field${fieldNames.length !== 1 ?
|
|
81
|
+
message: `Model "${modelName}" has ${fieldNames.length} field${fieldNames.length !== 1 ? "s" : ""}`,
|
|
80
82
|
};
|
|
81
83
|
if (exampleFields) {
|
|
82
84
|
response.example = exampleFields;
|
|
83
|
-
response.hint =
|
|
85
|
+
response.hint =
|
|
86
|
+
"Use these field names as keys when creating notes with addNote tool";
|
|
84
87
|
}
|
|
85
88
|
return (0, anki_utils_1.createSuccessResponse)(response);
|
|
86
89
|
}
|
|
@@ -88,7 +91,7 @@ let ModelFieldNamesTool = ModelFieldNamesTool_1 = class ModelFieldNamesTool {
|
|
|
88
91
|
this.logger.error(`Failed to retrieve field names for model ${modelName}`, error);
|
|
89
92
|
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
90
93
|
modelName: modelName,
|
|
91
|
-
hint:
|
|
94
|
+
hint: "Make sure the model name is correct and Anki is running",
|
|
92
95
|
});
|
|
93
96
|
}
|
|
94
97
|
}
|
|
@@ -96,13 +99,13 @@ let ModelFieldNamesTool = ModelFieldNamesTool_1 = class ModelFieldNamesTool {
|
|
|
96
99
|
exports.ModelFieldNamesTool = ModelFieldNamesTool;
|
|
97
100
|
__decorate([
|
|
98
101
|
(0, mcp_nest_1.Tool)({
|
|
99
|
-
name:
|
|
100
|
-
description:
|
|
102
|
+
name: "modelFieldNames",
|
|
103
|
+
description: "Get the field names for a specific note type (model). Use this to know what fields are required when creating notes of this type.",
|
|
101
104
|
parameters: zod_1.z.object({
|
|
102
105
|
modelName: zod_1.z
|
|
103
106
|
.string()
|
|
104
107
|
.min(1)
|
|
105
|
-
.describe(
|
|
108
|
+
.describe("The name of the model/note type to get fields for"),
|
|
106
109
|
}),
|
|
107
110
|
}),
|
|
108
111
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-field-names.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/model-field-names.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8CAAuC;AAEvC,6BAAwB;AACxB,8EAAsE;AACtE,
|
|
1
|
+
{"version":3,"file":"model-field-names.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/model-field-names.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { Context } from
|
|
2
|
-
import { AnkiConnectClient } from
|
|
1
|
+
import type { Context } from "@rekog/mcp-nest";
|
|
2
|
+
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
3
3
|
export declare class ModelNamesTool {
|
|
4
4
|
private readonly ankiClient;
|
|
5
5
|
private readonly logger;
|
|
6
6
|
constructor(ankiClient: AnkiConnectClient);
|
|
7
|
-
modelNames(_args:
|
|
7
|
+
modelNames(_args: Record<string, never>, context: Context): Promise<{
|
|
8
8
|
[x: string]: unknown;
|
|
9
9
|
content: ({
|
|
10
10
|
[x: string]: unknown;
|
|
@@ -24,16 +24,16 @@ let ModelNamesTool = ModelNamesTool_1 = class ModelNamesTool {
|
|
|
24
24
|
}
|
|
25
25
|
async modelNames(_args, context) {
|
|
26
26
|
try {
|
|
27
|
-
this.logger.log(
|
|
27
|
+
this.logger.log("Retrieving model names from Anki");
|
|
28
28
|
await context.reportProgress({ progress: 25, total: 100 });
|
|
29
|
-
const modelNames = await this.ankiClient.invoke(
|
|
29
|
+
const modelNames = await this.ankiClient.invoke("modelNames");
|
|
30
30
|
await context.reportProgress({ progress: 75, total: 100 });
|
|
31
31
|
if (!modelNames || modelNames.length === 0) {
|
|
32
|
-
this.logger.log(
|
|
32
|
+
this.logger.log("No models found");
|
|
33
33
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
34
34
|
return (0, anki_utils_1.createSuccessResponse)({
|
|
35
35
|
success: true,
|
|
36
|
-
message:
|
|
36
|
+
message: "No note types found in Anki",
|
|
37
37
|
modelNames: [],
|
|
38
38
|
total: 0,
|
|
39
39
|
});
|
|
@@ -46,16 +46,18 @@ let ModelNamesTool = ModelNamesTool_1 = class ModelNamesTool {
|
|
|
46
46
|
total: modelNames.length,
|
|
47
47
|
message: `Found ${modelNames.length} note types`,
|
|
48
48
|
commonTypes: {
|
|
49
|
-
basic: modelNames.includes(
|
|
50
|
-
basicReversed: modelNames.includes(
|
|
51
|
-
|
|
49
|
+
basic: modelNames.includes("Basic") ? "Basic" : null,
|
|
50
|
+
basicReversed: modelNames.includes("Basic (and reversed card)")
|
|
51
|
+
? "Basic (and reversed card)"
|
|
52
|
+
: null,
|
|
53
|
+
cloze: modelNames.includes("Cloze") ? "Cloze" : null,
|
|
52
54
|
},
|
|
53
55
|
});
|
|
54
56
|
}
|
|
55
57
|
catch (error) {
|
|
56
|
-
this.logger.error(
|
|
58
|
+
this.logger.error("Failed to retrieve model names", error);
|
|
57
59
|
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
58
|
-
hint:
|
|
60
|
+
hint: "Make sure Anki is running and AnkiConnect is installed",
|
|
59
61
|
});
|
|
60
62
|
}
|
|
61
63
|
}
|
|
@@ -63,8 +65,8 @@ let ModelNamesTool = ModelNamesTool_1 = class ModelNamesTool {
|
|
|
63
65
|
exports.ModelNamesTool = ModelNamesTool;
|
|
64
66
|
__decorate([
|
|
65
67
|
(0, mcp_nest_1.Tool)({
|
|
66
|
-
name:
|
|
67
|
-
description:
|
|
68
|
+
name: "modelNames",
|
|
69
|
+
description: "Get a list of all available note type (model) names in Anki. Use this to see what note types are available before creating notes.",
|
|
68
70
|
parameters: zod_1.z.object({}),
|
|
69
71
|
}),
|
|
70
72
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-names.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/model-names.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8CAAuC;AAEvC,6BAAwB;AACxB,8EAAsE;AACtE,
|
|
1
|
+
{"version":3,"file":"model-names.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/model-names.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8CAAuC;AAEvC,6BAAwB;AACxB,8EAAsE;AACtE,0DAGgC;AAMzB,IAAM,cAAc,sBAApB,MAAM,cAAc;IAGI;IAFZ,MAAM,GAAG,IAAI,eAAM,CAAC,gBAAc,CAAC,IAAI,CAAC,CAAC;IAE1D,YAA6B,UAA6B;QAA7B,eAAU,GAAV,UAAU,CAAmB;IAAG,CAAC;IAQxD,AAAN,KAAK,CAAC,UAAU,CAAC,KAA4B,EAAE,OAAgB;QAC7D,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YACpD,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAG3D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAW,YAAY,CAAC,CAAC;YAExE,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAE3D,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBACnC,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC5D,OAAO,IAAA,kCAAqB,EAAC;oBAC3B,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,6BAA6B;oBACtC,UAAU,EAAE,EAAE;oBACd,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;YACL,CAAC;YAED,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,UAAU,CAAC,MAAM,SAAS,CAAC,CAAC;YAErD,OAAO,IAAA,kCAAqB,EAAC;gBAC3B,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,UAAU;gBACtB,KAAK,EAAE,UAAU,CAAC,MAAM;gBACxB,OAAO,EAAE,SAAS,UAAU,CAAC,MAAM,aAAa;gBAChD,WAAW,EAAE;oBACX,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;oBACpD,aAAa,EAAE,UAAU,CAAC,QAAQ,CAAC,2BAA2B,CAAC;wBAC7D,CAAC,CAAC,2BAA2B;wBAC7B,CAAC,CAAC,IAAI;oBACR,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;iBACrD;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,IAAA,gCAAmB,EAAC,KAAK,EAAE;gBAChC,IAAI,EAAE,wDAAwD;aAC/D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAA;AAvDY,wCAAc;AAWnB;IANL,IAAA,eAAI,EAAC;QACJ,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,mIAAmI;QACrI,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACzB,CAAC;;;;gDA4CD;yBAtDU,cAAc;IAD1B,IAAA,mBAAU,GAAE;qCAI8B,uCAAiB;GAH/C,cAAc,CAuD1B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Context } from
|
|
2
|
-
import { AnkiConnectClient } from
|
|
1
|
+
import type { Context } from "@rekog/mcp-nest";
|
|
2
|
+
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
3
3
|
export declare class ModelStylingTool {
|
|
4
4
|
private readonly ankiClient;
|
|
5
5
|
private readonly logger;
|