anki-mcp-http 0.8.0 → 0.8.2
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 +74 -35
- 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.js +13 -13
- 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 +3 -3
- 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.js +30 -30
- package/dist/services/ngrok.service.js.map +1 -1
- 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
|
@@ -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;
|
|
@@ -24,26 +24,26 @@ let CreateDeckTool = CreateDeckTool_1 = class CreateDeckTool {
|
|
|
24
24
|
}
|
|
25
25
|
async createDeck({ deck_name }, context) {
|
|
26
26
|
try {
|
|
27
|
-
const parts = deck_name.split(
|
|
27
|
+
const parts = deck_name.split("::");
|
|
28
28
|
if (parts.length > 2) {
|
|
29
|
-
return (0, anki_utils_1.createErrorResponse)(new Error(
|
|
29
|
+
return (0, anki_utils_1.createErrorResponse)(new Error("Deck name can have maximum 2 levels (parent::child)"), {
|
|
30
30
|
deckName: deck_name,
|
|
31
31
|
levels: parts.length,
|
|
32
|
-
maxLevels: 2
|
|
32
|
+
maxLevels: 2,
|
|
33
33
|
});
|
|
34
34
|
}
|
|
35
|
-
if (parts.some(part => part.trim() ===
|
|
36
|
-
return (0, anki_utils_1.createErrorResponse)(new Error(
|
|
35
|
+
if (parts.some((part) => part.trim() === "")) {
|
|
36
|
+
return (0, anki_utils_1.createErrorResponse)(new Error("Deck name parts cannot be empty"), { deckName: deck_name });
|
|
37
37
|
}
|
|
38
38
|
this.logger.log(`Creating deck: ${deck_name}`);
|
|
39
39
|
await context.reportProgress({ progress: 25, total: 100 });
|
|
40
|
-
const deckId = await this.ankiClient.invoke(
|
|
41
|
-
deck: deck_name
|
|
40
|
+
const deckId = await this.ankiClient.invoke("createDeck", {
|
|
41
|
+
deck: deck_name,
|
|
42
42
|
});
|
|
43
43
|
await context.reportProgress({ progress: 75, total: 100 });
|
|
44
44
|
if (!deckId) {
|
|
45
45
|
this.logger.warn(`Deck may already exist: ${deck_name}`);
|
|
46
|
-
const existingDecks = await this.ankiClient.invoke(
|
|
46
|
+
const existingDecks = await this.ankiClient.invoke("deckNames");
|
|
47
47
|
const deckExists = existingDecks.includes(deck_name);
|
|
48
48
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
49
49
|
if (deckExists) {
|
|
@@ -55,7 +55,7 @@ let CreateDeckTool = CreateDeckTool_1 = class CreateDeckTool {
|
|
|
55
55
|
exists: true,
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
|
-
return (0, anki_utils_1.createErrorResponse)(new Error(
|
|
58
|
+
return (0, anki_utils_1.createErrorResponse)(new Error("Failed to create deck - unknown error"), { deckName: deck_name });
|
|
59
59
|
}
|
|
60
60
|
await context.reportProgress({ progress: 100, total: 100 });
|
|
61
61
|
this.logger.log(`Successfully created deck: ${deck_name} with ID: ${deckId}`);
|
|
@@ -75,7 +75,7 @@ let CreateDeckTool = CreateDeckTool_1 = class CreateDeckTool {
|
|
|
75
75
|
}
|
|
76
76
|
catch (error) {
|
|
77
77
|
this.logger.error(`Failed to create deck ${deck_name}`, error);
|
|
78
|
-
if (error instanceof Error && error.message.includes(
|
|
78
|
+
if (error instanceof Error && error.message.includes("already exists")) {
|
|
79
79
|
return (0, anki_utils_1.createSuccessResponse)({
|
|
80
80
|
success: true,
|
|
81
81
|
message: `Deck "${deck_name}" already exists`,
|
|
@@ -86,7 +86,7 @@ let CreateDeckTool = CreateDeckTool_1 = class CreateDeckTool {
|
|
|
86
86
|
}
|
|
87
87
|
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
88
88
|
deckName: deck_name,
|
|
89
|
-
hint:
|
|
89
|
+
hint: "Make sure Anki is running and the deck name is valid",
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
}
|
|
@@ -94,19 +94,19 @@ let CreateDeckTool = CreateDeckTool_1 = class CreateDeckTool {
|
|
|
94
94
|
exports.CreateDeckTool = CreateDeckTool;
|
|
95
95
|
__decorate([
|
|
96
96
|
(0, mcp_nest_1.Tool)({
|
|
97
|
-
name:
|
|
97
|
+
name: "create_deck",
|
|
98
98
|
description: 'Create a new empty Anki deck. Supports parent::child structure (e.g., "Japanese::Tokyo" creates parent deck "Japanese" and child deck "Tokyo"). Maximum 2 levels of nesting allowed. Will not overwrite existing decks. ' +
|
|
99
|
-
|
|
99
|
+
"IMPORTANT: This tool ONLY creates an empty deck. DO NOT add cards or notes after creating a deck unless the user EXPLICITLY asks to add them. Wait for user instructions before adding any content.",
|
|
100
100
|
parameters: zod_1.z.object({
|
|
101
101
|
deck_name: zod_1.z
|
|
102
102
|
.string()
|
|
103
103
|
.min(1)
|
|
104
104
|
.describe('The name of the deck to create. Use "::" for parent::child structure (max 2 levels)')
|
|
105
105
|
.refine((name) => {
|
|
106
|
-
const parts = name.split(
|
|
106
|
+
const parts = name.split("::");
|
|
107
107
|
return parts.length <= 2;
|
|
108
108
|
}, {
|
|
109
|
-
message:
|
|
109
|
+
message: "Deck name can have maximum 2 levels (parent::child). More than 2 levels not permitted.",
|
|
110
110
|
}),
|
|
111
111
|
}),
|
|
112
112
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-deck.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/create-deck.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8CAAuC;AAEvC,6BAAwB;AACxB,8EAAsE;AACtE,
|
|
1
|
+
{"version":3,"file":"create-deck.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/create-deck.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Context } from
|
|
2
|
-
import { AnkiConnectClient } from
|
|
3
|
-
import type { CardTemplate } from
|
|
1
|
+
import type { Context } from "@rekog/mcp-nest";
|
|
2
|
+
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
3
|
+
import type { CardTemplate } from "@/mcp/types/anki.types";
|
|
4
4
|
export declare class CreateModelTool {
|
|
5
5
|
private readonly ankiClient;
|
|
6
6
|
private readonly logger;
|