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
package/dist/main-http.js
CHANGED
|
@@ -5,6 +5,7 @@ const app_module_1 = require("./app.module");
|
|
|
5
5
|
const bootstrap_1 = require("./bootstrap");
|
|
6
6
|
const origin_validation_guard_1 = require("./http/guards/origin-validation.guard");
|
|
7
7
|
const cli_1 = require("./cli");
|
|
8
|
+
const ngrok_service_1 = require("./services/ngrok.service");
|
|
8
9
|
async function bootstrap() {
|
|
9
10
|
(0, cli_1.checkForUpdates)();
|
|
10
11
|
const options = (0, cli_1.parseCliArgs)();
|
|
@@ -19,10 +20,23 @@ async function bootstrap() {
|
|
|
19
20
|
});
|
|
20
21
|
app.useGlobalGuards(new origin_validation_guard_1.OriginValidationGuard());
|
|
21
22
|
await app.listen(options.port, options.host);
|
|
22
|
-
|
|
23
|
+
let ngrokUrl;
|
|
24
|
+
if (options.ngrok) {
|
|
25
|
+
try {
|
|
26
|
+
const ngrokService = new ngrok_service_1.NgrokService();
|
|
27
|
+
const tunnelInfo = await ngrokService.start(options.port);
|
|
28
|
+
ngrokUrl = tunnelInfo.publicUrl;
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.error("\n❌ Failed to start ngrok:");
|
|
32
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
33
|
+
console.error("\nServer is still running locally without tunnel.\n");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
(0, cli_1.displayStartupBanner)(options, ngrokUrl);
|
|
23
37
|
}
|
|
24
38
|
bootstrap().catch((err) => {
|
|
25
|
-
console.error(
|
|
39
|
+
console.error("Failed to start MCP HTTP server:", err);
|
|
26
40
|
process.exit(1);
|
|
27
41
|
});
|
|
28
42
|
//# sourceMappingURL=main-http.js.map
|
package/dist/main-http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main-http.js","sourceRoot":"","sources":["../src/main-http.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;AACzC,2CAAoE;AACpE,mFAA8E;AAC9E,+
|
|
1
|
+
{"version":3,"file":"main-http.js","sourceRoot":"","sources":["../src/main-http.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;AACzC,2CAAoE;AACpE,mFAA8E;AAC9E,+BAA4E;AAC5E,4DAAwD;AAExD,KAAK,UAAU,SAAS;IAEtB,IAAA,qBAAe,GAAE,CAAC;IAElB,MAAM,OAAO,GAAG,IAAA,kBAAY,GAAE,CAAC;IAG/B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IAGnD,MAAM,UAAU,GAAG,IAAA,4BAAgB,EAAC,CAAC,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,IAAA,+BAAmB,EAAC,UAAU,CAAC,CAAC;IAGtD,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,OAAO,EAAE,EAAE;QACxD,MAAM,EAAE,aAAa;QACrB,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAGH,GAAG,CAAC,eAAe,CAAC,IAAI,+CAAqB,EAAE,CAAC,CAAC;IAEjD,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAG7C,IAAI,QAA4B,CAAC;IACjC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,4BAAY,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1D,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAGD,IAAA,0BAAoB,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/main-stdio.js
CHANGED
|
@@ -10,11 +10,11 @@ async function bootstrap() {
|
|
|
10
10
|
logger: loggerService,
|
|
11
11
|
bufferLogs: true,
|
|
12
12
|
});
|
|
13
|
-
pinoLogger.info(
|
|
13
|
+
pinoLogger.info("MCP STDIO server started successfully");
|
|
14
14
|
await new Promise(() => { });
|
|
15
15
|
}
|
|
16
16
|
bootstrap().catch((err) => {
|
|
17
|
-
console.error(
|
|
17
|
+
console.error("Failed to start MCP STDIO server:", err);
|
|
18
18
|
process.exit(1);
|
|
19
19
|
});
|
|
20
20
|
//# sourceMappingURL=main-stdio.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IAnkiConfig } from
|
|
1
|
+
import type { IAnkiConfig } from "../config/anki-config.interface";
|
|
2
2
|
export declare class AnkiConnectError extends Error {
|
|
3
3
|
readonly action?: string | undefined;
|
|
4
4
|
readonly originalError?: string | undefined;
|
|
@@ -57,7 +57,7 @@ class AnkiConnectError extends Error {
|
|
|
57
57
|
super(message);
|
|
58
58
|
this.action = action;
|
|
59
59
|
this.originalError = originalError;
|
|
60
|
-
this.name =
|
|
60
|
+
this.name = "AnkiConnectError";
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
exports.AnkiConnectError = AnkiConnectError;
|
|
@@ -75,11 +75,11 @@ let AnkiConnectClient = AnkiConnectClient_1 = class AnkiConnectClient {
|
|
|
75
75
|
prefixUrl: config.ankiConnectUrl,
|
|
76
76
|
timeout: config.ankiConnectTimeout,
|
|
77
77
|
headers: {
|
|
78
|
-
|
|
78
|
+
"Content-Type": "application/json",
|
|
79
79
|
},
|
|
80
80
|
retry: {
|
|
81
81
|
limit: 2,
|
|
82
|
-
methods: [
|
|
82
|
+
methods: ["POST"],
|
|
83
83
|
statusCodes: [408, 413, 429, 500, 502, 503, 504],
|
|
84
84
|
backoffLimit: 3000,
|
|
85
85
|
},
|
|
@@ -109,7 +109,7 @@ let AnkiConnectClient = AnkiConnectClient_1 = class AnkiConnectClient {
|
|
|
109
109
|
try {
|
|
110
110
|
this.logger.log(`Invoking AnkiConnect action: ${action}`);
|
|
111
111
|
const response = await this.client
|
|
112
|
-
.post(
|
|
112
|
+
.post("", {
|
|
113
113
|
json: request,
|
|
114
114
|
})
|
|
115
115
|
.json();
|
|
@@ -122,12 +122,12 @@ let AnkiConnectClient = AnkiConnectClient_1 = class AnkiConnectClient {
|
|
|
122
122
|
catch (error) {
|
|
123
123
|
if (error instanceof ky_1.HTTPError) {
|
|
124
124
|
if (error.response.status === 403) {
|
|
125
|
-
throw new AnkiConnectError(
|
|
125
|
+
throw new AnkiConnectError("Permission denied. Please check AnkiConnect configuration and API key.", action);
|
|
126
126
|
}
|
|
127
127
|
throw new AnkiConnectError(`HTTP error ${error.response.status}: ${error.message}`, action);
|
|
128
128
|
}
|
|
129
|
-
if (error instanceof Error && error.message.includes(
|
|
130
|
-
throw new AnkiConnectError(
|
|
129
|
+
if (error instanceof Error && error.message.includes("fetch")) {
|
|
130
|
+
throw new AnkiConnectError("Cannot connect to Anki. Please ensure Anki is running and AnkiConnect plugin is installed.", action);
|
|
131
131
|
}
|
|
132
132
|
if (error instanceof AnkiConnectError) {
|
|
133
133
|
throw error;
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
export { ANKI_CONFIG } from
|
|
2
|
-
export type { IAnkiConfig } from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
export { AnkiConnectClient, AnkiConnectError } from
|
|
6
|
-
export { SyncTool } from
|
|
7
|
-
export { ListDecksTool } from
|
|
8
|
-
export { CreateDeckTool } from
|
|
9
|
-
export { GetDueCardsTool } from
|
|
10
|
-
export { PresentCardTool } from
|
|
11
|
-
export { RateCardTool } from
|
|
12
|
-
export { ModelNamesTool } from
|
|
13
|
-
export { ModelFieldNamesTool } from
|
|
14
|
-
export { ModelStylingTool } from
|
|
15
|
-
export { CreateModelTool } from
|
|
16
|
-
export { UpdateModelStylingTool } from
|
|
17
|
-
export { AddNoteTool } from
|
|
18
|
-
export { FindNotesTool } from
|
|
19
|
-
export { NotesInfoTool } from
|
|
20
|
-
export { UpdateNoteFieldsTool } from
|
|
21
|
-
export { DeleteNotesTool } from
|
|
22
|
-
export { MediaActionsTool } from
|
|
23
|
-
export { ReviewSessionPrompt } from
|
|
24
|
-
export { TwentyRulesPrompt } from
|
|
25
|
-
export { SystemInfoResource } from
|
|
26
|
-
import { DynamicModule, Provider } from
|
|
1
|
+
export { ANKI_CONFIG } from "../../config/anki-config.interface";
|
|
2
|
+
export type { IAnkiConfig } from "../../config/anki-config.interface";
|
|
3
|
+
export * from "../../types/anki.types";
|
|
4
|
+
export * from "../../utils/anki.utils";
|
|
5
|
+
export { AnkiConnectClient, AnkiConnectError, } from "../../clients/anki-connect.client";
|
|
6
|
+
export { SyncTool } from "./tools/sync.tool";
|
|
7
|
+
export { ListDecksTool } from "./tools/list-decks.tool";
|
|
8
|
+
export { CreateDeckTool } from "./tools/create-deck.tool";
|
|
9
|
+
export { GetDueCardsTool } from "./tools/get-due-cards.tool";
|
|
10
|
+
export { PresentCardTool } from "./tools/present-card.tool";
|
|
11
|
+
export { RateCardTool } from "./tools/rate-card.tool";
|
|
12
|
+
export { ModelNamesTool } from "./tools/model-names.tool";
|
|
13
|
+
export { ModelFieldNamesTool } from "./tools/model-field-names.tool";
|
|
14
|
+
export { ModelStylingTool } from "./tools/model-styling.tool";
|
|
15
|
+
export { CreateModelTool } from "./tools/create-model.tool";
|
|
16
|
+
export { UpdateModelStylingTool } from "./tools/update-model-styling.tool";
|
|
17
|
+
export { AddNoteTool } from "./tools/add-note.tool";
|
|
18
|
+
export { FindNotesTool } from "./tools/find-notes.tool";
|
|
19
|
+
export { NotesInfoTool } from "./tools/notes-info.tool";
|
|
20
|
+
export { UpdateNoteFieldsTool } from "./tools/update-note-fields.tool";
|
|
21
|
+
export { DeleteNotesTool } from "./tools/delete-notes.tool";
|
|
22
|
+
export { MediaActionsTool } from "./tools/mediaActions";
|
|
23
|
+
export { ReviewSessionPrompt } from "./prompts/review-session.prompt";
|
|
24
|
+
export { TwentyRulesPrompt } from "./prompts/twenty-rules.prompt";
|
|
25
|
+
export { SystemInfoResource } from "./resources/system-info.resource";
|
|
26
|
+
import { DynamicModule, Provider } from "@nestjs/common";
|
|
27
27
|
export interface McpPrimitivesAnkiEssentialModuleOptions {
|
|
28
28
|
ankiConfigProvider: Provider;
|
|
29
29
|
}
|
|
@@ -118,10 +118,7 @@ let McpPrimitivesAnkiEssentialModule = McpPrimitivesAnkiEssentialModule_1 = clas
|
|
|
118
118
|
static forRoot(options) {
|
|
119
119
|
return {
|
|
120
120
|
module: McpPrimitivesAnkiEssentialModule_1,
|
|
121
|
-
providers: [
|
|
122
|
-
options.ankiConfigProvider,
|
|
123
|
-
...MCP_PRIMITIVES,
|
|
124
|
-
],
|
|
121
|
+
providers: [options.ankiConfigProvider, ...MCP_PRIMITIVES],
|
|
125
122
|
exports: MCP_PRIMITIVES,
|
|
126
123
|
};
|
|
127
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp/primitives/essential/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,4EAAiE;AAAxD,oHAAA,WAAW,OAAA;AAIpB,yDAAuC;AAGvC,yDAAuC;AAGvC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp/primitives/essential/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,4EAAiE;AAAxD,oHAAA,WAAW,OAAA;AAIpB,yDAAuC;AAGvC,yDAAuC;AAGvC,yEAG2C;AAFzC,wHAAA,iBAAiB,OAAA;AACjB,uHAAA,gBAAgB,OAAA;AAIlB,+CAA6C;AAApC,qGAAA,QAAQ,OAAA;AACjB,2DAAwD;AAA/C,gHAAA,aAAa,OAAA;AACtB,6DAA0D;AAAjD,kHAAA,cAAc,OAAA;AACvB,iEAA6D;AAApD,qHAAA,eAAe,OAAA;AACxB,+DAA4D;AAAnD,oHAAA,eAAe,OAAA;AACxB,yDAAsD;AAA7C,8GAAA,YAAY,OAAA;AACrB,6DAA0D;AAAjD,kHAAA,cAAc,OAAA;AACvB,yEAAqE;AAA5D,6HAAA,mBAAmB,OAAA;AAC5B,iEAA8D;AAArD,sHAAA,gBAAgB,OAAA;AACzB,+DAA4D;AAAnD,oHAAA,eAAe,OAAA;AACxB,+EAA2E;AAAlE,mIAAA,sBAAsB,OAAA;AAC/B,uDAAoD;AAA3C,4GAAA,WAAW,OAAA;AACpB,2DAAwD;AAA/C,gHAAA,aAAa,OAAA;AACtB,2DAAwD;AAA/C,gHAAA,aAAa,OAAA;AACtB,2EAAuE;AAA9D,+HAAA,oBAAoB,OAAA;AAC7B,+DAA4D;AAAnD,oHAAA,eAAe,OAAA;AACxB,qDAAwD;AAA/C,gHAAA,gBAAgB,OAAA;AAGzB,yEAAsE;AAA7D,4HAAA,mBAAmB,OAAA;AAC5B,qEAAkE;AAAzD,wHAAA,iBAAiB,OAAA;AAG1B,yEAAsE;AAA7D,0HAAA,kBAAkB,OAAA;AAG3B,2CAAiE;AACjE,2EAAsE;AACtE,iDAA6C;AAC7C,6DAAwD;AACxD,+DAA0D;AAC1D,mEAA6D;AAC7D,iEAA4D;AAC5D,2DAAsD;AACtD,+DAA0D;AAC1D,2EAAqE;AACrE,mEAA8D;AAC9D,iEAA4D;AAC5D,iFAA2E;AAC3E,yDAAoD;AACpD,6DAAwD;AACxD,6DAAwD;AACxD,6EAAuE;AACvE,iEAA4D;AAC5D,uDAAwD;AACxD,2EAAsE;AACtE,uEAAkE;AAClE,2EAAsE;AAEtE,MAAM,cAAc,GAAG;IAErB,uCAAiB;IAEjB,oBAAQ;IACR,+BAAa;IACb,iCAAc;IACd,oCAAe;IACf,mCAAe;IACf,6BAAY;IACZ,iCAAc;IACd,4CAAmB;IACnB,qCAAgB;IAChB,mCAAe;IACf,kDAAsB;IACtB,2BAAW;IACX,+BAAa;IACb,+BAAa;IACb,8CAAoB;IACpB,mCAAe;IACf,+BAAgB;IAEhB,2CAAmB;IACnB,uCAAiB;IAEjB,yCAAkB;CACnB,CAAC;AAOK,IAAM,gCAAgC,wCAAtC,MAAM,gCAAgC;IAC3C,MAAM,CAAC,OAAO,CACZ,OAAgD;QAEhD,OAAO;YACL,MAAM,EAAE,kCAAgC;YACxC,SAAS,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,cAAc,CAAC;YAC1D,OAAO,EAAE,cAAc;SACxB,CAAC;IACJ,CAAC;CACF,CAAA;AAVY,4EAAgC;2CAAhC,gCAAgC;IAD5C,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,gCAAgC,CAU5C"}
|
|
@@ -83,12 +83,12 @@ Assistant: [Uses rate_card with rating: 2]
|
|
|
83
83
|
- Accept user's self-assessment over your suggestion
|
|
84
84
|
- Keep feedback concise and actionable`;
|
|
85
85
|
return {
|
|
86
|
-
description:
|
|
86
|
+
description: "Guidelines for conducting Anki spaced repetition review sessions",
|
|
87
87
|
messages: [
|
|
88
88
|
{
|
|
89
|
-
role:
|
|
89
|
+
role: "user",
|
|
90
90
|
content: {
|
|
91
|
-
type:
|
|
91
|
+
type: "text",
|
|
92
92
|
text: promptText,
|
|
93
93
|
},
|
|
94
94
|
},
|
|
@@ -99,8 +99,8 @@ Assistant: [Uses rate_card with rating: 2]
|
|
|
99
99
|
exports.ReviewSessionPrompt = ReviewSessionPrompt;
|
|
100
100
|
__decorate([
|
|
101
101
|
(0, mcp_nest_1.Prompt)({
|
|
102
|
-
name:
|
|
103
|
-
description:
|
|
102
|
+
name: "anki_review",
|
|
103
|
+
description: "Guidelines for conducting Anki spaced repetition review sessions",
|
|
104
104
|
parameters: zod_1.z.object({}),
|
|
105
105
|
}),
|
|
106
106
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-session.prompt.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/prompts/review-session.prompt.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAmD;AACnD,8CAAyC;AACzC,6BAAwB;AAGjB,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;
|
|
1
|
+
{"version":3,"file":"review-session.prompt.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/prompts/review-session.prompt.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAmD;AACnD,8CAAyC;AACzC,6BAAwB;AAGjB,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAO9B,mBAAmB;QACjB,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCAkEgB,CAAC;QAEpC,OAAO;YACL,WAAW,EACT,kEAAkE;YACpE,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU;qBACjB;iBACF;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AA1FY,kDAAmB;AAO9B;IANC,IAAA,iBAAM,EAAC;QACN,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,kEAAkE;QACpE,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACzB,CAAC;;;;8DAmFD;8BAzFU,mBAAmB;IAD/B,IAAA,mBAAU,EAAC,EAAE,KAAK,EAAE,cAAK,CAAC,OAAO,EAAE,CAAC;GACxB,mBAAmB,CA0F/B"}
|
|
@@ -50,20 +50,21 @@ const fs = __importStar(require("fs"));
|
|
|
50
50
|
const path = __importStar(require("path"));
|
|
51
51
|
const markdown_utils_1 = require("../../../../utils/markdown.utils");
|
|
52
52
|
const PROMPT_SECTIONS = (() => {
|
|
53
|
-
const markdownPath = path.join(__dirname,
|
|
54
|
-
const markdown = fs.readFileSync(markdownPath,
|
|
53
|
+
const markdownPath = path.join(__dirname, "content.md");
|
|
54
|
+
const markdown = fs.readFileSync(markdownPath, "utf-8");
|
|
55
55
|
return (0, markdown_utils_1.parseMarkdownSections)(markdown);
|
|
56
56
|
})();
|
|
57
57
|
let TwentyRulesPrompt = class TwentyRulesPrompt {
|
|
58
58
|
getTwentyRulesPrompt() {
|
|
59
59
|
return {
|
|
60
|
-
description: PROMPT_SECTIONS.Description ||
|
|
60
|
+
description: PROMPT_SECTIONS.Description ||
|
|
61
|
+
"Twenty rules of formulating knowledge for effective Anki flashcard creation",
|
|
61
62
|
messages: [
|
|
62
63
|
{
|
|
63
|
-
role:
|
|
64
|
+
role: "user",
|
|
64
65
|
content: {
|
|
65
|
-
type:
|
|
66
|
-
text: PROMPT_SECTIONS.Content ||
|
|
66
|
+
type: "text",
|
|
67
|
+
text: PROMPT_SECTIONS.Content || "",
|
|
67
68
|
},
|
|
68
69
|
},
|
|
69
70
|
],
|
|
@@ -73,8 +74,9 @@ let TwentyRulesPrompt = class TwentyRulesPrompt {
|
|
|
73
74
|
exports.TwentyRulesPrompt = TwentyRulesPrompt;
|
|
74
75
|
__decorate([
|
|
75
76
|
(0, mcp_nest_1.Prompt)({
|
|
76
|
-
name:
|
|
77
|
-
description: PROMPT_SECTIONS.Description ||
|
|
77
|
+
name: "twenty_rules",
|
|
78
|
+
description: PROMPT_SECTIONS.Description ||
|
|
79
|
+
"Twenty rules of formulating knowledge for effective Anki flashcard creation",
|
|
78
80
|
parameters: zod_1.z.object({}),
|
|
79
81
|
}),
|
|
80
82
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/mcp/primitives/essential/prompts/twenty-rules.prompt/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAmD;AACnD,8CAAyC;AACzC,6BAAwB;AACxB,uCAAyB;AACzB,2CAA6B;AAC7B,qEAAmE;AAInE,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxD,OAAO,IAAA,sCAAqB,EAAC,QAAQ,CAAC,CAAC;AACzC,CAAC,CAAC,EAAE,CAAC;AAGE,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/mcp/primitives/essential/prompts/twenty-rules.prompt/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAmD;AACnD,8CAAyC;AACzC,6BAAwB;AACxB,uCAAyB;AACzB,2CAA6B;AAC7B,qEAAmE;AAInE,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;IAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxD,OAAO,IAAA,sCAAqB,EAAC,QAAQ,CAAC,CAAC;AACzC,CAAC,CAAC,EAAE,CAAC;AAGE,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAQ5B,oBAAoB;QAClB,OAAO;YACL,WAAW,EACT,eAAe,CAAC,WAAW;gBAC3B,6EAA6E;YAC/E,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,eAAe,CAAC,OAAO,IAAI,EAAE;qBACpC;iBACF;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAxBY,8CAAiB;AAQ5B;IAPC,IAAA,iBAAM,EAAC;QACN,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,eAAe,CAAC,WAAW;YAC3B,6EAA6E;QAC/E,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACzB,CAAC;;;;6DAgBD;4BAvBU,iBAAiB;IAD7B,IAAA,mBAAU,EAAC,EAAE,KAAK,EAAE,cAAK,CAAC,OAAO,EAAE,CAAC;GACxB,iBAAiB,CAwB7B"}
|
|
@@ -60,26 +60,26 @@ let SystemInfoResource = class SystemInfoResource {
|
|
|
60
60
|
hostname: os.hostname(),
|
|
61
61
|
nodeVersion: process.version,
|
|
62
62
|
env: {
|
|
63
|
-
NODE_ENV: process.env.NODE_ENV ||
|
|
63
|
+
NODE_ENV: process.env.NODE_ENV || "development",
|
|
64
64
|
},
|
|
65
65
|
};
|
|
66
66
|
return {
|
|
67
67
|
contents: [
|
|
68
68
|
{
|
|
69
69
|
uri: uri,
|
|
70
|
-
mimeType:
|
|
70
|
+
mimeType: "application/json",
|
|
71
71
|
text: JSON.stringify(systemInfo, null, 2),
|
|
72
72
|
},
|
|
73
73
|
],
|
|
74
74
|
};
|
|
75
75
|
}
|
|
76
76
|
getEnvironmentVariable({ uri, name }) {
|
|
77
|
-
const value = process.env[name.toUpperCase()] ||
|
|
77
|
+
const value = process.env[name.toUpperCase()] || "undefined";
|
|
78
78
|
return {
|
|
79
79
|
contents: [
|
|
80
80
|
{
|
|
81
81
|
uri: uri,
|
|
82
|
-
mimeType:
|
|
82
|
+
mimeType: "text/plain",
|
|
83
83
|
text: value,
|
|
84
84
|
},
|
|
85
85
|
],
|
|
@@ -89,10 +89,10 @@ let SystemInfoResource = class SystemInfoResource {
|
|
|
89
89
|
exports.SystemInfoResource = SystemInfoResource;
|
|
90
90
|
__decorate([
|
|
91
91
|
(0, mcp_nest_1.Resource)({
|
|
92
|
-
name:
|
|
93
|
-
description:
|
|
94
|
-
mimeType:
|
|
95
|
-
uri:
|
|
92
|
+
name: "system-info",
|
|
93
|
+
description: "Current system information and environment",
|
|
94
|
+
mimeType: "application/json",
|
|
95
|
+
uri: "system://info",
|
|
96
96
|
}),
|
|
97
97
|
__metadata("design:type", Function),
|
|
98
98
|
__metadata("design:paramtypes", [Object]),
|
|
@@ -100,10 +100,10 @@ __decorate([
|
|
|
100
100
|
], SystemInfoResource.prototype, "getSystemInfo", null);
|
|
101
101
|
__decorate([
|
|
102
102
|
(0, mcp_nest_1.ResourceTemplate)({
|
|
103
|
-
name:
|
|
104
|
-
description:
|
|
105
|
-
mimeType:
|
|
106
|
-
uriTemplate:
|
|
103
|
+
name: "environment-variable",
|
|
104
|
+
description: "Get a specific environment variable",
|
|
105
|
+
mimeType: "text/plain",
|
|
106
|
+
uriTemplate: "env://{name}",
|
|
107
107
|
}),
|
|
108
108
|
__metadata("design:type", Function),
|
|
109
109
|
__metadata("design:paramtypes", [Object]),
|
|
@@ -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 AddNoteTool {
|
|
4
4
|
private readonly ankiClient;
|
|
5
5
|
private readonly logger;
|
|
@@ -10,7 +10,7 @@ export declare class AddNoteTool {
|
|
|
10
10
|
fields: Record<string, string>;
|
|
11
11
|
tags?: string[];
|
|
12
12
|
allowDuplicate?: boolean;
|
|
13
|
-
duplicateScope?:
|
|
13
|
+
duplicateScope?: "deck" | "collection";
|
|
14
14
|
duplicateScopeOptions?: {
|
|
15
15
|
deckName?: string;
|
|
16
16
|
checkChildren?: boolean;
|
|
@@ -24,9 +24,9 @@ let AddNoteTool = AddNoteTool_1 = class AddNoteTool {
|
|
|
24
24
|
}
|
|
25
25
|
async addNote({ deckName, modelName, fields, tags, allowDuplicate, duplicateScope, duplicateScopeOptions, }, context) {
|
|
26
26
|
try {
|
|
27
|
-
const emptyFields = Object.entries(fields).filter(([_, value]) => !value || value.trim() ===
|
|
27
|
+
const emptyFields = Object.entries(fields).filter(([_, value]) => !value || value.trim() === "");
|
|
28
28
|
if (emptyFields.length > 0) {
|
|
29
|
-
return (0, anki_utils_1.createErrorResponse)(new Error(`Fields cannot be empty: ${emptyFields.map(([key]) => key).join(
|
|
29
|
+
return (0, anki_utils_1.createErrorResponse)(new Error(`Fields cannot be empty: ${emptyFields.map(([key]) => key).join(", ")}`), {
|
|
30
30
|
deckName,
|
|
31
31
|
modelName,
|
|
32
32
|
emptyFields: emptyFields.map(([key]) => key),
|
|
@@ -60,19 +60,19 @@ let AddNoteTool = AddNoteTool_1 = class AddNoteTool {
|
|
|
60
60
|
noteParams.options = options;
|
|
61
61
|
}
|
|
62
62
|
await context.reportProgress({ progress: 50, total: 100 });
|
|
63
|
-
const noteId = await this.ankiClient.invoke(
|
|
63
|
+
const noteId = await this.ankiClient.invoke("addNote", {
|
|
64
64
|
note: noteParams,
|
|
65
65
|
});
|
|
66
66
|
await context.reportProgress({ progress: 75, total: 100 });
|
|
67
67
|
if (!noteId) {
|
|
68
|
-
this.logger.warn(
|
|
68
|
+
this.logger.warn("Note creation failed - possibly a duplicate");
|
|
69
69
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
70
|
-
return (0, anki_utils_1.createErrorResponse)(new Error(
|
|
70
|
+
return (0, anki_utils_1.createErrorResponse)(new Error("Failed to create note - it may be a duplicate"), {
|
|
71
71
|
deckName,
|
|
72
72
|
modelName,
|
|
73
73
|
hint: allowDuplicate
|
|
74
|
-
?
|
|
75
|
-
:
|
|
74
|
+
? "The note could not be created. Check if the model and deck names are correct."
|
|
75
|
+
: "The note appears to be a duplicate. Set allowDuplicate to true if you want to add it anyway.",
|
|
76
76
|
});
|
|
77
77
|
}
|
|
78
78
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
@@ -88,40 +88,40 @@ let AddNoteTool = AddNoteTool_1 = class AddNoteTool {
|
|
|
88
88
|
details: {
|
|
89
89
|
fieldsAdded: fieldCount,
|
|
90
90
|
tagsAdded: tagCount,
|
|
91
|
-
duplicateCheckScope: duplicateScope ||
|
|
91
|
+
duplicateCheckScope: duplicateScope || "default",
|
|
92
92
|
},
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
95
|
catch (error) {
|
|
96
|
-
this.logger.error(
|
|
96
|
+
this.logger.error("Failed to add note", error);
|
|
97
97
|
if (error instanceof Error) {
|
|
98
|
-
if (error.message.includes(
|
|
98
|
+
if (error.message.includes("model")) {
|
|
99
99
|
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
100
100
|
deckName,
|
|
101
101
|
modelName,
|
|
102
|
-
hint:
|
|
102
|
+
hint: "Model not found. Use modelNames tool to see available models.",
|
|
103
103
|
});
|
|
104
104
|
}
|
|
105
|
-
if (error.message.includes(
|
|
105
|
+
if (error.message.includes("deck")) {
|
|
106
106
|
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
107
107
|
deckName,
|
|
108
108
|
modelName,
|
|
109
|
-
hint:
|
|
109
|
+
hint: "Deck not found. Use list_decks tool to see available decks or createDeck to create a new one.",
|
|
110
110
|
});
|
|
111
111
|
}
|
|
112
|
-
if (error.message.includes(
|
|
112
|
+
if (error.message.includes("field")) {
|
|
113
113
|
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
114
114
|
deckName,
|
|
115
115
|
modelName,
|
|
116
116
|
providedFields: Object.keys(fields),
|
|
117
|
-
hint:
|
|
117
|
+
hint: "Field mismatch. Use modelFieldNames tool to see required fields for this model.",
|
|
118
118
|
});
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
122
122
|
deckName,
|
|
123
123
|
modelName,
|
|
124
|
-
hint:
|
|
124
|
+
hint: "Make sure Anki is running and the deck/model names are correct",
|
|
125
125
|
});
|
|
126
126
|
}
|
|
127
127
|
}
|
|
@@ -129,13 +129,10 @@ let AddNoteTool = AddNoteTool_1 = class AddNoteTool {
|
|
|
129
129
|
exports.AddNoteTool = AddNoteTool;
|
|
130
130
|
__decorate([
|
|
131
131
|
(0, mcp_nest_1.Tool)({
|
|
132
|
-
name:
|
|
133
|
-
description:
|
|
132
|
+
name: "addNote",
|
|
133
|
+
description: "Add a new note to Anki. Use modelNames to see available note types and modelFieldNames to see required fields. Returns the note ID on success. IMPORTANT: Only create notes that were explicitly requested by the user.",
|
|
134
134
|
parameters: zod_1.z.object({
|
|
135
|
-
deckName: zod_1.z
|
|
136
|
-
.string()
|
|
137
|
-
.min(1)
|
|
138
|
-
.describe('The deck to add the note to'),
|
|
135
|
+
deckName: zod_1.z.string().min(1).describe("The deck to add the note to"),
|
|
139
136
|
modelName: zod_1.z
|
|
140
137
|
.string()
|
|
141
138
|
.min(1)
|
|
@@ -146,35 +143,35 @@ __decorate([
|
|
|
146
143
|
tags: zod_1.z
|
|
147
144
|
.array(zod_1.z.string())
|
|
148
145
|
.optional()
|
|
149
|
-
.describe(
|
|
146
|
+
.describe("Optional tags to add to the note"),
|
|
150
147
|
allowDuplicate: zod_1.z
|
|
151
148
|
.boolean()
|
|
152
149
|
.optional()
|
|
153
150
|
.default(false)
|
|
154
|
-
.describe(
|
|
151
|
+
.describe("Whether to allow adding duplicate notes"),
|
|
155
152
|
duplicateScope: zod_1.z
|
|
156
|
-
.enum([
|
|
153
|
+
.enum(["deck", "collection"])
|
|
157
154
|
.optional()
|
|
158
|
-
.describe(
|
|
155
|
+
.describe("Scope for duplicate checking"),
|
|
159
156
|
duplicateScopeOptions: zod_1.z
|
|
160
157
|
.object({
|
|
161
158
|
deckName: zod_1.z
|
|
162
159
|
.string()
|
|
163
160
|
.optional()
|
|
164
|
-
.describe(
|
|
161
|
+
.describe("Specific deck to check for duplicates"),
|
|
165
162
|
checkChildren: zod_1.z
|
|
166
163
|
.boolean()
|
|
167
164
|
.optional()
|
|
168
165
|
.default(false)
|
|
169
|
-
.describe(
|
|
166
|
+
.describe("Check child decks for duplicates"),
|
|
170
167
|
checkAllModels: zod_1.z
|
|
171
168
|
.boolean()
|
|
172
169
|
.optional()
|
|
173
170
|
.default(false)
|
|
174
|
-
.describe(
|
|
171
|
+
.describe("Check across all note types"),
|
|
175
172
|
})
|
|
176
173
|
.optional()
|
|
177
|
-
.describe(
|
|
174
|
+
.describe("Advanced duplicate checking options"),
|
|
178
175
|
}),
|
|
179
176
|
}),
|
|
180
177
|
__metadata("design:type", Function),
|
|
@@ -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,
|
|
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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"}
|
|
@@ -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 CreateDeckTool {
|
|
4
4
|
private readonly ankiClient;
|
|
5
5
|
private readonly logger;
|