anki-mcp-http 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +591 -0
  3. package/bin/ankimcp.js +2 -0
  4. package/dist/anki-config.service.d.ts +10 -0
  5. package/dist/anki-config.service.js +42 -0
  6. package/dist/anki-config.service.js.map +1 -0
  7. package/dist/app.module.d.ts +5 -0
  8. package/dist/app.module.js +74 -0
  9. package/dist/app.module.js.map +1 -0
  10. package/dist/bootstrap.d.ts +3 -0
  11. package/dist/bootstrap.js +39 -0
  12. package/dist/bootstrap.js.map +1 -0
  13. package/dist/cli.d.ts +7 -0
  14. package/dist/cli.js +68 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/http/guards/origin-validation.guard.d.ts +7 -0
  17. package/dist/http/guards/origin-validation.guard.js +52 -0
  18. package/dist/http/guards/origin-validation.guard.js.map +1 -0
  19. package/dist/main-http.d.ts +1 -0
  20. package/dist/main-http.js +27 -0
  21. package/dist/main-http.js.map +1 -0
  22. package/dist/main-stdio.d.ts +1 -0
  23. package/dist/main-stdio.js +20 -0
  24. package/dist/main-stdio.js.map +1 -0
  25. package/dist/mcp/clients/__mocks__/anki-connect.client.d.ts +6 -0
  26. package/dist/mcp/clients/__mocks__/anki-connect.client.js +18 -0
  27. package/dist/mcp/clients/__mocks__/anki-connect.client.js.map +1 -0
  28. package/dist/mcp/clients/anki-connect.client.d.ts +15 -0
  29. package/dist/mcp/clients/anki-connect.client.js +145 -0
  30. package/dist/mcp/clients/anki-connect.client.js.map +1 -0
  31. package/dist/mcp/config/anki-config.interface.d.ts +7 -0
  32. package/dist/mcp/config/anki-config.interface.js +5 -0
  33. package/dist/mcp/config/anki-config.interface.js.map +1 -0
  34. package/dist/mcp/primitives/essential/index.d.ts +30 -0
  35. package/dist/mcp/primitives/essential/index.js +125 -0
  36. package/dist/mcp/primitives/essential/index.js.map +1 -0
  37. package/dist/mcp/primitives/essential/prompts/review-session.prompt.d.ts +12 -0
  38. package/dist/mcp/primitives/essential/prompts/review-session.prompt.js +113 -0
  39. package/dist/mcp/primitives/essential/prompts/review-session.prompt.js.map +1 -0
  40. package/dist/mcp/primitives/essential/resources/system-info.resource.d.ts +21 -0
  41. package/dist/mcp/primitives/essential/resources/system-info.resource.js +115 -0
  42. package/dist/mcp/primitives/essential/resources/system-info.resource.js.map +1 -0
  43. package/dist/mcp/primitives/essential/tools/add-note.tool.d.ts +93 -0
  44. package/dist/mcp/primitives/essential/tools/add-note.tool.js +188 -0
  45. package/dist/mcp/primitives/essential/tools/add-note.tool.js.map +1 -0
  46. package/dist/mcp/primitives/essential/tools/create-deck.tool.d.ts +83 -0
  47. package/dist/mcp/primitives/essential/tools/create-deck.tool.js +120 -0
  48. package/dist/mcp/primitives/essential/tools/create-deck.tool.js.map +1 -0
  49. package/dist/mcp/primitives/essential/tools/create-model.tool.d.ts +88 -0
  50. package/dist/mcp/primitives/essential/tools/create-model.tool.js +142 -0
  51. package/dist/mcp/primitives/essential/tools/create-model.tool.js.map +1 -0
  52. package/dist/mcp/primitives/essential/tools/delete-notes.tool.d.ts +84 -0
  53. package/dist/mcp/primitives/essential/tools/delete-notes.tool.js +120 -0
  54. package/dist/mcp/primitives/essential/tools/delete-notes.tool.js.map +1 -0
  55. package/dist/mcp/primitives/essential/tools/find-notes.tool.d.ts +83 -0
  56. package/dist/mcp/primitives/essential/tools/find-notes.tool.js +106 -0
  57. package/dist/mcp/primitives/essential/tools/find-notes.tool.js.map +1 -0
  58. package/dist/mcp/primitives/essential/tools/get-due-cards.tool.d.ts +84 -0
  59. package/dist/mcp/primitives/essential/tools/get-due-cards.tool.js +106 -0
  60. package/dist/mcp/primitives/essential/tools/get-due-cards.tool.js.map +1 -0
  61. package/dist/mcp/primitives/essential/tools/list-decks.tool.d.ts +83 -0
  62. package/dist/mcp/primitives/essential/tools/list-decks.tool.js +117 -0
  63. package/dist/mcp/primitives/essential/tools/list-decks.tool.js.map +1 -0
  64. package/dist/mcp/primitives/essential/tools/model-field-names.tool.d.ts +83 -0
  65. package/dist/mcp/primitives/essential/tools/model-field-names.tool.js +116 -0
  66. package/dist/mcp/primitives/essential/tools/model-field-names.tool.js.map +1 -0
  67. package/dist/mcp/primitives/essential/tools/model-names.tool.d.ts +81 -0
  68. package/dist/mcp/primitives/essential/tools/model-names.tool.js +78 -0
  69. package/dist/mcp/primitives/essential/tools/model-names.tool.js.map +1 -0
  70. package/dist/mcp/primitives/essential/tools/model-styling.tool.d.ts +83 -0
  71. package/dist/mcp/primitives/essential/tools/model-styling.tool.js +93 -0
  72. package/dist/mcp/primitives/essential/tools/model-styling.tool.js.map +1 -0
  73. package/dist/mcp/primitives/essential/tools/notes-info.tool.d.ts +83 -0
  74. package/dist/mcp/primitives/essential/tools/notes-info.tool.js +111 -0
  75. package/dist/mcp/primitives/essential/tools/notes-info.tool.js.map +1 -0
  76. package/dist/mcp/primitives/essential/tools/present-card.tool.d.ts +84 -0
  77. package/dist/mcp/primitives/essential/tools/present-card.tool.js +100 -0
  78. package/dist/mcp/primitives/essential/tools/present-card.tool.js.map +1 -0
  79. package/dist/mcp/primitives/essential/tools/rate-card.tool.d.ts +84 -0
  80. package/dist/mcp/primitives/essential/tools/rate-card.tool.js +96 -0
  81. package/dist/mcp/primitives/essential/tools/rate-card.tool.js.map +1 -0
  82. package/dist/mcp/primitives/essential/tools/sync.tool.d.ts +81 -0
  83. package/dist/mcp/primitives/essential/tools/sync.tool.js +61 -0
  84. package/dist/mcp/primitives/essential/tools/sync.tool.js.map +1 -0
  85. package/dist/mcp/primitives/essential/tools/update-model-styling.tool.d.ts +84 -0
  86. package/dist/mcp/primitives/essential/tools/update-model-styling.tool.js +119 -0
  87. package/dist/mcp/primitives/essential/tools/update-model-styling.tool.js.map +1 -0
  88. package/dist/mcp/primitives/essential/tools/update-note-fields.tool.d.ts +96 -0
  89. package/dist/mcp/primitives/essential/tools/update-note-fields.tool.js +154 -0
  90. package/dist/mcp/primitives/essential/tools/update-note-fields.tool.js.map +1 -0
  91. package/dist/mcp/primitives/gui/index.d.ts +4 -0
  92. package/dist/mcp/primitives/gui/index.js +26 -0
  93. package/dist/mcp/primitives/gui/index.js.map +1 -0
  94. package/dist/mcp/types/anki.types.d.ts +152 -0
  95. package/dist/mcp/types/anki.types.js +18 -0
  96. package/dist/mcp/types/anki.types.js.map +1 -0
  97. package/dist/mcp/utils/anki.utils.d.ts +19 -0
  98. package/dist/mcp/utils/anki.utils.js +153 -0
  99. package/dist/mcp/utils/anki.utils.js.map +1 -0
  100. package/dist/mcp/utils/mcpb-workarounds.d.ts +1 -0
  101. package/dist/mcp/utils/mcpb-workarounds.js +13 -0
  102. package/dist/mcp/utils/mcpb-workarounds.js.map +1 -0
  103. package/dist/test-fixtures/mock-data.d.ts +126 -0
  104. package/dist/test-fixtures/mock-data.js +112 -0
  105. package/dist/test-fixtures/mock-data.js.map +1 -0
  106. package/dist/test-fixtures/test-helpers.d.ts +12 -0
  107. package/dist/test-fixtures/test-helpers.js +24 -0
  108. package/dist/test-fixtures/test-helpers.js.map +1 -0
  109. package/dist/tsconfig.build.tsbuildinfo +1 -0
  110. package/package.json +153 -0
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var UpdateNoteFieldsTool_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.UpdateNoteFieldsTool = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const mcp_nest_1 = require("@rekog/mcp-nest");
16
+ const zod_1 = require("zod");
17
+ const anki_connect_client_1 = require("../../../clients/anki-connect.client");
18
+ const anki_utils_1 = require("../../../utils/anki.utils");
19
+ let UpdateNoteFieldsTool = UpdateNoteFieldsTool_1 = class UpdateNoteFieldsTool {
20
+ ankiClient;
21
+ logger = new common_1.Logger(UpdateNoteFieldsTool_1.name);
22
+ constructor(ankiClient) {
23
+ this.ankiClient = ankiClient;
24
+ }
25
+ async updateNoteFields({ note }, context) {
26
+ try {
27
+ const fieldCount = Object.keys(note.fields).length;
28
+ this.logger.log(`Updating ${fieldCount} field(s) for note ID: ${note.id}`);
29
+ if (fieldCount === 0) {
30
+ return (0, anki_utils_1.createErrorResponse)(new Error('No fields provided for update'), {
31
+ noteId: note.id,
32
+ hint: 'Provide at least one field to update',
33
+ });
34
+ }
35
+ await context.reportProgress({ progress: 25, total: 100 });
36
+ const notesInfo = await this.ankiClient.invoke('notesInfo', {
37
+ notes: [note.id],
38
+ });
39
+ if (!notesInfo || notesInfo.length === 0 || !notesInfo[0]) {
40
+ return (0, anki_utils_1.createErrorResponse)(new Error('Note not found'), {
41
+ noteId: note.id,
42
+ hint: 'The note ID is invalid or the note has been deleted. Use findNotes to get valid note IDs.',
43
+ });
44
+ }
45
+ const currentNote = notesInfo[0];
46
+ const modelName = currentNote.modelName;
47
+ const existingFields = Object.keys(currentNote.fields);
48
+ const invalidFields = Object.keys(note.fields).filter(field => !existingFields.includes(field));
49
+ if (invalidFields.length > 0) {
50
+ return (0, anki_utils_1.createErrorResponse)(new Error(`Invalid fields for model "${modelName}"`), {
51
+ noteId: note.id,
52
+ modelName,
53
+ invalidFields,
54
+ validFields: existingFields,
55
+ hint: `These fields don't exist in the "${modelName}" model. Use modelFieldNames to see valid fields.`,
56
+ });
57
+ }
58
+ await context.reportProgress({ progress: 50, total: 100 });
59
+ const updateParams = {
60
+ note: {
61
+ id: note.id,
62
+ fields: note.fields,
63
+ },
64
+ };
65
+ if (note.audio) {
66
+ updateParams.note.audio = note.audio;
67
+ }
68
+ if (note.picture) {
69
+ updateParams.note.picture = note.picture;
70
+ }
71
+ const result = await this.ankiClient.invoke('updateNoteFields', updateParams);
72
+ await context.reportProgress({ progress: 100, total: 100 });
73
+ this.logger.log(`Successfully updated note ID: ${note.id}`);
74
+ const updatedFields = Object.keys(note.fields);
75
+ return (0, anki_utils_1.createSuccessResponse)({
76
+ success: true,
77
+ noteId: note.id,
78
+ updatedFields,
79
+ fieldCount,
80
+ modelName,
81
+ message: `Successfully updated ${fieldCount} field${fieldCount === 1 ? '' : 's'} in note`,
82
+ cssNote: 'HTML content is preserved. Model CSS styling remains unchanged.',
83
+ warning: 'If changes don\'t appear, ensure the note wasn\'t open in Anki browser during update.',
84
+ hint: 'Use notesInfo to verify the changes or findNotes to locate other notes to update.',
85
+ });
86
+ }
87
+ catch (error) {
88
+ this.logger.error('Failed to update note fields', error);
89
+ if (error instanceof Error) {
90
+ if (error.message.includes('not found')) {
91
+ return (0, anki_utils_1.createErrorResponse)(error, {
92
+ noteId: note.id,
93
+ hint: 'Note not found. It may have been deleted.',
94
+ });
95
+ }
96
+ if (error.message.includes('field')) {
97
+ return (0, anki_utils_1.createErrorResponse)(error, {
98
+ noteId: note.id,
99
+ providedFields: Object.keys(note.fields),
100
+ hint: 'Check field names match exactly (case-sensitive). Use notesInfo to see current fields.',
101
+ });
102
+ }
103
+ }
104
+ return (0, anki_utils_1.createErrorResponse)(error, {
105
+ noteId: note.id,
106
+ hint: 'Make sure Anki is running and the note is not open in the browser',
107
+ });
108
+ }
109
+ }
110
+ };
111
+ exports.UpdateNoteFieldsTool = UpdateNoteFieldsTool;
112
+ __decorate([
113
+ (0, mcp_nest_1.Tool)({
114
+ name: 'updateNoteFields',
115
+ description: 'Update the fields of an existing note. Supports HTML content in fields and preserves CSS styling. ' +
116
+ 'WARNING: Do not view the note in Anki browser while updating, or the fields will not update properly. ' +
117
+ 'Close the browser or switch to a different note before updating. IMPORTANT: Only update notes that the user explicitly asked to modify.',
118
+ parameters: zod_1.z.object({
119
+ note: zod_1.z.object({
120
+ id: zod_1.z
121
+ .number()
122
+ .describe('The ID of the note to update. Get this from findNotes or notesInfo.'),
123
+ fields: zod_1.z
124
+ .record(zod_1.z.string())
125
+ .describe('Fields to update with new content. Only include fields you want to change. ' +
126
+ 'HTML content is supported. Example: {"Front": "<b>New question</b>", "Back": "New answer"}'),
127
+ audio: zod_1.z
128
+ .array(zod_1.z.object({
129
+ url: zod_1.z.string().describe('URL of the audio file'),
130
+ filename: zod_1.z.string().describe('Filename to save as'),
131
+ fields: zod_1.z.array(zod_1.z.string()).describe('Fields to add audio to'),
132
+ }))
133
+ .optional()
134
+ .describe('Optional audio files to add to the note'),
135
+ picture: zod_1.z
136
+ .array(zod_1.z.object({
137
+ url: zod_1.z.string().describe('URL of the image'),
138
+ filename: zod_1.z.string().describe('Filename to save as'),
139
+ fields: zod_1.z.array(zod_1.z.string()).describe('Fields to add image to'),
140
+ }))
141
+ .optional()
142
+ .describe('Optional images to add to the note'),
143
+ }),
144
+ }),
145
+ }),
146
+ __metadata("design:type", Function),
147
+ __metadata("design:paramtypes", [Object, Object]),
148
+ __metadata("design:returntype", Promise)
149
+ ], UpdateNoteFieldsTool.prototype, "updateNoteFields", null);
150
+ exports.UpdateNoteFieldsTool = UpdateNoteFieldsTool = UpdateNoteFieldsTool_1 = __decorate([
151
+ (0, common_1.Injectable)(),
152
+ __metadata("design:paramtypes", [anki_connect_client_1.AnkiConnectClient])
153
+ ], UpdateNoteFieldsTool);
154
+ //# sourceMappingURL=update-note-fields.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-note-fields.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/update-note-fields.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ export declare class McpPrimitivesAnkiGuiModule {
3
+ static forRoot(): DynamicModule;
4
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var McpPrimitivesAnkiGuiModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.McpPrimitivesAnkiGuiModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const MCP_GUI_PRIMITIVES = [];
13
+ let McpPrimitivesAnkiGuiModule = McpPrimitivesAnkiGuiModule_1 = class McpPrimitivesAnkiGuiModule {
14
+ static forRoot() {
15
+ return {
16
+ module: McpPrimitivesAnkiGuiModule_1,
17
+ providers: MCP_GUI_PRIMITIVES,
18
+ exports: MCP_GUI_PRIMITIVES,
19
+ };
20
+ }
21
+ };
22
+ exports.McpPrimitivesAnkiGuiModule = McpPrimitivesAnkiGuiModule;
23
+ exports.McpPrimitivesAnkiGuiModule = McpPrimitivesAnkiGuiModule = McpPrimitivesAnkiGuiModule_1 = __decorate([
24
+ (0, common_1.Module)({})
25
+ ], McpPrimitivesAnkiGuiModule);
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp/primitives/gui/index.ts"],"names":[],"mappings":";;;;;;;;;;AACA,2CAAuD;AAEvD,MAAM,kBAAkB,GAAU,EAEjC,CAAC;AAGK,IAAM,0BAA0B,kCAAhC,MAAM,0BAA0B;IACrC,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,MAAM,EAAE,4BAA0B;YAClC,SAAS,EAAE,kBAAkB;YAC7B,OAAO,EAAE,kBAAkB;SAC5B,CAAC;IACJ,CAAC;CACF,CAAA;AARY,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,0BAA0B,CAQtC"}
@@ -0,0 +1,152 @@
1
+ export declare enum CardType {
2
+ New = 0,
3
+ Learning = 1,
4
+ Review = 2,
5
+ Relearning = 3
6
+ }
7
+ export interface AnkiCard {
8
+ cardId: number;
9
+ fields: Record<string, {
10
+ value: string;
11
+ order: number;
12
+ }>;
13
+ fieldOrder: number;
14
+ question: string;
15
+ answer: string;
16
+ modelName: string;
17
+ ord: number;
18
+ deckName: string;
19
+ css: string;
20
+ factor?: number;
21
+ interval?: number;
22
+ note: number;
23
+ type: number;
24
+ queue: number;
25
+ due?: number;
26
+ reps?: number;
27
+ lapses?: number;
28
+ left?: number;
29
+ mod?: number;
30
+ flags?: number;
31
+ tags?: string[];
32
+ }
33
+ export interface SimplifiedCard {
34
+ cardId: number;
35
+ front: string;
36
+ back: string;
37
+ deckName: string;
38
+ modelName: string;
39
+ due: number;
40
+ interval: number;
41
+ factor: number;
42
+ }
43
+ export interface CardPresentation {
44
+ cardId: number;
45
+ front: string;
46
+ back?: string;
47
+ deckName: string;
48
+ modelName: string;
49
+ tags: string[];
50
+ currentInterval: number;
51
+ easeFactor: number;
52
+ reviews: number;
53
+ lapses: number;
54
+ cardType: string;
55
+ noteId: number;
56
+ }
57
+ export interface DeckInfo {
58
+ name: string;
59
+ stats?: DeckStats;
60
+ }
61
+ export interface DeckStats {
62
+ deck_id: number;
63
+ name: string;
64
+ new_count: number;
65
+ learn_count: number;
66
+ review_count: number;
67
+ total_new: number;
68
+ total_cards: number;
69
+ }
70
+ export declare enum CardRating {
71
+ Again = 1,
72
+ Hard = 2,
73
+ Good = 3,
74
+ Easy = 4
75
+ }
76
+ export interface AnkiConnectRequest {
77
+ action: string;
78
+ version: number;
79
+ params?: Record<string, any>;
80
+ key?: string;
81
+ }
82
+ export interface AnkiConnectResponse<T = any> {
83
+ result: T;
84
+ error: string | null;
85
+ }
86
+ export interface NoteOptions {
87
+ allowDuplicate?: boolean;
88
+ duplicateScope?: 'deck' | 'collection';
89
+ duplicateScopeOptions?: {
90
+ deckName?: string;
91
+ checkChildren?: boolean;
92
+ checkAllModels?: boolean;
93
+ };
94
+ }
95
+ export interface AddNoteParams {
96
+ deckName: string;
97
+ modelName: string;
98
+ fields: Record<string, string>;
99
+ tags?: string[];
100
+ options?: NoteOptions;
101
+ }
102
+ export interface Model {
103
+ name: string;
104
+ id: number;
105
+ css: string;
106
+ fields: string[];
107
+ }
108
+ export interface NoteInfo {
109
+ noteId: number;
110
+ modelName: string;
111
+ tags: string[];
112
+ fields: Record<string, {
113
+ value: string;
114
+ order: number;
115
+ }>;
116
+ cards: number[];
117
+ mod: number;
118
+ }
119
+ export interface UpdateNoteFieldsParams {
120
+ note: {
121
+ id: number;
122
+ fields: Record<string, string>;
123
+ audio?: Array<{
124
+ url: string;
125
+ filename: string;
126
+ fields: string[];
127
+ }>;
128
+ picture?: Array<{
129
+ url: string;
130
+ filename: string;
131
+ fields: string[];
132
+ }>;
133
+ };
134
+ }
135
+ export interface CardTemplate {
136
+ Name: string;
137
+ Front: string;
138
+ Back: string;
139
+ }
140
+ export interface CreateModelParams {
141
+ modelName: string;
142
+ inOrderFields: string[];
143
+ cardTemplates: CardTemplate[];
144
+ css?: string;
145
+ isCloze?: boolean;
146
+ }
147
+ export interface UpdateModelStylingParams {
148
+ model: {
149
+ name: string;
150
+ css: string;
151
+ };
152
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CardRating = exports.CardType = void 0;
4
+ var CardType;
5
+ (function (CardType) {
6
+ CardType[CardType["New"] = 0] = "New";
7
+ CardType[CardType["Learning"] = 1] = "Learning";
8
+ CardType[CardType["Review"] = 2] = "Review";
9
+ CardType[CardType["Relearning"] = 3] = "Relearning";
10
+ })(CardType || (exports.CardType = CardType = {}));
11
+ var CardRating;
12
+ (function (CardRating) {
13
+ CardRating[CardRating["Again"] = 1] = "Again";
14
+ CardRating[CardRating["Hard"] = 2] = "Hard";
15
+ CardRating[CardRating["Good"] = 3] = "Good";
16
+ CardRating[CardRating["Easy"] = 4] = "Easy";
17
+ })(CardRating || (exports.CardRating = CardRating = {}));
18
+ //# sourceMappingURL=anki.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anki.types.js","sourceRoot":"","sources":["../../../src/mcp/types/anki.types.ts"],"names":[],"mappings":";;;AAOA,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,qCAAO,CAAA;IACP,+CAAY,CAAA;IACZ,2CAAU,CAAA;IACV,mDAAc,CAAA;AAChB,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;AAqFD,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,6CAAS,CAAA;IACT,2CAAQ,CAAA;IACR,2CAAQ,CAAA;IACR,2CAAQ,CAAA;AACV,CAAC,EALW,UAAU,0BAAV,UAAU,QAKrB"}
@@ -0,0 +1,19 @@
1
+ import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import { AnkiCard } from '../types/anki.types';
3
+ export declare function cleanHtml(html: string): string;
4
+ export declare function extractCardContent(fields: AnkiCard['fields']): {
5
+ front: string;
6
+ back: string;
7
+ };
8
+ export declare function getCardType(type: number): string;
9
+ export declare function getNoteType(modelName: string): string;
10
+ export declare function getRatingDescription(rating: number): string;
11
+ export declare function createSuccessResponse(data: any): CallToolResult;
12
+ export declare function createErrorResponse(error: unknown, context?: Record<string, any>): CallToolResult;
13
+ export declare function formatInterval(days: number): string;
14
+ export declare function parseDeckStats(stats: any): {
15
+ new_count: number;
16
+ learn_count: number;
17
+ review_count: number;
18
+ total_cards: number;
19
+ };
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cleanHtml = cleanHtml;
4
+ exports.extractCardContent = extractCardContent;
5
+ exports.getCardType = getCardType;
6
+ exports.getNoteType = getNoteType;
7
+ exports.getRatingDescription = getRatingDescription;
8
+ exports.createSuccessResponse = createSuccessResponse;
9
+ exports.createErrorResponse = createErrorResponse;
10
+ exports.formatInterval = formatInterval;
11
+ exports.parseDeckStats = parseDeckStats;
12
+ const anki_types_1 = require("../types/anki.types");
13
+ const anki_connect_client_1 = require("../clients/anki-connect.client");
14
+ function cleanHtml(html) {
15
+ return html
16
+ .replace(/<[^>]*>/g, '')
17
+ .replace(/&nbsp;/g, ' ')
18
+ .replace(/&amp;/g, '&')
19
+ .replace(/&lt;/g, '<')
20
+ .replace(/&gt;/g, '>')
21
+ .replace(/&quot;/g, '"')
22
+ .replace(/&#39;/g, "'")
23
+ .replace(/\n\s*\n/g, '\n')
24
+ .trim();
25
+ }
26
+ function extractCardContent(fields) {
27
+ let front = '';
28
+ let back = '';
29
+ if (!fields) {
30
+ return { front, back };
31
+ }
32
+ const frontFieldNames = ['Front', '正面', 'Question', 'Text'];
33
+ const backFieldNames = ['Back', '背面', 'Answer', 'Extra', 'Back Extra'];
34
+ for (const fieldName of frontFieldNames) {
35
+ if (fields[fieldName]) {
36
+ front = fields[fieldName].value;
37
+ break;
38
+ }
39
+ }
40
+ for (const fieldName of backFieldNames) {
41
+ if (fields[fieldName]) {
42
+ back = fields[fieldName].value;
43
+ break;
44
+ }
45
+ }
46
+ if (!front && !back) {
47
+ const fieldEntries = Object.entries(fields)
48
+ .sort((a, b) => a[1].order - b[1].order);
49
+ if (fieldEntries.length > 0) {
50
+ front = fieldEntries[0][1].value;
51
+ }
52
+ if (fieldEntries.length > 1) {
53
+ back = fieldEntries[1][1].value;
54
+ }
55
+ }
56
+ return {
57
+ front: cleanHtml(front),
58
+ back: cleanHtml(back)
59
+ };
60
+ }
61
+ function getCardType(type) {
62
+ switch (type) {
63
+ case anki_types_1.CardType.New: return 'new';
64
+ case anki_types_1.CardType.Learning: return 'learning';
65
+ case anki_types_1.CardType.Review: return 'review';
66
+ case anki_types_1.CardType.Relearning: return 'relearning';
67
+ default: return 'unknown';
68
+ }
69
+ }
70
+ function getNoteType(modelName) {
71
+ const lowerName = modelName.toLowerCase();
72
+ if (lowerName.includes('basic')) {
73
+ if (lowerName.includes('reverse')) {
74
+ return 'Basic (and reversed card)';
75
+ }
76
+ return 'Basic';
77
+ }
78
+ if (lowerName.includes('cloze')) {
79
+ return 'Cloze';
80
+ }
81
+ return 'Custom';
82
+ }
83
+ function getRatingDescription(rating) {
84
+ switch (rating) {
85
+ case anki_types_1.CardRating.Again:
86
+ return 'Again (failed to recall)';
87
+ case anki_types_1.CardRating.Hard:
88
+ return 'Hard (recalled with difficulty)';
89
+ case anki_types_1.CardRating.Good:
90
+ return 'Good (recalled with some effort)';
91
+ case anki_types_1.CardRating.Easy:
92
+ return 'Easy (recalled instantly)';
93
+ default:
94
+ return 'Unknown';
95
+ }
96
+ }
97
+ function createSuccessResponse(data) {
98
+ return {
99
+ content: [
100
+ {
101
+ type: 'text',
102
+ text: JSON.stringify(data, null, 2),
103
+ },
104
+ ],
105
+ };
106
+ }
107
+ function createErrorResponse(error, context) {
108
+ const errorData = {
109
+ success: false,
110
+ error: error instanceof Error ? error.message : 'Unknown error occurred',
111
+ };
112
+ if (error instanceof anki_connect_client_1.AnkiConnectError) {
113
+ if (error.action) {
114
+ errorData.action = error.action;
115
+ }
116
+ }
117
+ if (context) {
118
+ Object.assign(errorData, context);
119
+ }
120
+ return {
121
+ content: [
122
+ {
123
+ type: 'text',
124
+ text: JSON.stringify(errorData, null, 2),
125
+ },
126
+ ],
127
+ isError: true,
128
+ };
129
+ }
130
+ function formatInterval(days) {
131
+ if (days < 1) {
132
+ const hours = Math.round(days * 24);
133
+ return `${hours} hour${hours !== 1 ? 's' : ''}`;
134
+ }
135
+ if (days < 30) {
136
+ return `${Math.round(days)} day${days !== 1 ? 's' : ''}`;
137
+ }
138
+ if (days < 365) {
139
+ const months = Math.round(days / 30);
140
+ return `${months} month${months !== 1 ? 's' : ''}`;
141
+ }
142
+ const years = Math.round(days / 365 * 10) / 10;
143
+ return `${years} year${years !== 1 ? 's' : ''}`;
144
+ }
145
+ function parseDeckStats(stats) {
146
+ return {
147
+ new_count: stats.new_count || 0,
148
+ learn_count: stats.lrn_count || 0,
149
+ review_count: stats.rev_count || 0,
150
+ total_cards: stats.total || 0,
151
+ };
152
+ }
153
+ //# sourceMappingURL=anki.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anki.utils.js","sourceRoot":"","sources":["../../../src/mcp/utils/anki.utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function sanitizeMcpbConfigValue(value: string | undefined): string | undefined;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sanitizeMcpbConfigValue = sanitizeMcpbConfigValue;
4
+ function sanitizeMcpbConfigValue(value) {
5
+ if (!value || value.trim() === '') {
6
+ return undefined;
7
+ }
8
+ if (value.startsWith('${') && value.endsWith('}')) {
9
+ return undefined;
10
+ }
11
+ return value;
12
+ }
13
+ //# sourceMappingURL=mcpb-workarounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpb-workarounds.js","sourceRoot":"","sources":["../../../src/mcp/utils/mcpb-workarounds.ts"],"names":[],"mappings":";;AA0BA,0DAWC;AAXD,SAAgB,uBAAuB,CAAC,KAAyB;IAC/D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAGD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}