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,93 @@
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 ModelStylingTool_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.ModelStylingTool = 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 ModelStylingTool = ModelStylingTool_1 = class ModelStylingTool {
20
+ ankiClient;
21
+ logger = new common_1.Logger(ModelStylingTool_1.name);
22
+ constructor(ankiClient) {
23
+ this.ankiClient = ankiClient;
24
+ }
25
+ async modelStyling({ modelName }, context) {
26
+ try {
27
+ this.logger.log(`Retrieving CSS styling for model: ${modelName}`);
28
+ await context.reportProgress({ progress: 25, total: 100 });
29
+ const styling = await this.ankiClient.invoke('modelStyling', {
30
+ modelName: modelName,
31
+ });
32
+ await context.reportProgress({ progress: 75, total: 100 });
33
+ if (!styling || !styling.css) {
34
+ this.logger.warn(`No styling found for model: ${modelName}`);
35
+ await context.reportProgress({ progress: 100, total: 100 });
36
+ return (0, anki_utils_1.createErrorResponse)(new Error(`Model "${modelName}" not found or has no styling`), {
37
+ modelName: modelName,
38
+ hint: 'Use modelNames tool to see available models',
39
+ });
40
+ }
41
+ await context.reportProgress({ progress: 100, total: 100 });
42
+ const css = styling.css;
43
+ const cssLength = css.length;
44
+ const hasCardClass = css.includes('.card');
45
+ const hasFrontClass = css.includes('.front');
46
+ const hasBackClass = css.includes('.back');
47
+ const hasClozeClass = css.includes('.cloze');
48
+ this.logger.log(`Retrieved CSS styling for model ${modelName} (${cssLength} chars)`);
49
+ return (0, anki_utils_1.createSuccessResponse)({
50
+ success: true,
51
+ modelName: modelName,
52
+ css: css,
53
+ cssInfo: {
54
+ length: cssLength,
55
+ hasCardStyling: hasCardClass,
56
+ hasFrontStyling: hasFrontClass,
57
+ hasBackStyling: hasBackClass,
58
+ hasClozeStyling: hasClozeClass,
59
+ },
60
+ message: `Retrieved CSS styling for model "${modelName}"`,
61
+ hint: 'This CSS is automatically applied when cards of this type are rendered in Anki',
62
+ });
63
+ }
64
+ catch (error) {
65
+ this.logger.error(`Failed to retrieve styling for model ${modelName}`, error);
66
+ return (0, anki_utils_1.createErrorResponse)(error, {
67
+ modelName: modelName,
68
+ hint: 'Make sure the model name is correct and Anki is running',
69
+ });
70
+ }
71
+ }
72
+ };
73
+ exports.ModelStylingTool = ModelStylingTool;
74
+ __decorate([
75
+ (0, mcp_nest_1.Tool)({
76
+ name: 'modelStyling',
77
+ description: 'Get the CSS styling for a specific note type (model). This CSS is used when rendering cards of this type.',
78
+ parameters: zod_1.z.object({
79
+ modelName: zod_1.z
80
+ .string()
81
+ .min(1)
82
+ .describe('The name of the model/note type to get styling for'),
83
+ }),
84
+ }),
85
+ __metadata("design:type", Function),
86
+ __metadata("design:paramtypes", [Object, Object]),
87
+ __metadata("design:returntype", Promise)
88
+ ], ModelStylingTool.prototype, "modelStyling", null);
89
+ exports.ModelStylingTool = ModelStylingTool = ModelStylingTool_1 = __decorate([
90
+ (0, common_1.Injectable)(),
91
+ __metadata("design:paramtypes", [anki_connect_client_1.AnkiConnectClient])
92
+ ], ModelStylingTool);
93
+ //# sourceMappingURL=model-styling.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-styling.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/model-styling.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import type { Context } from '@rekog/mcp-nest';
2
+ import { AnkiConnectClient } from '../../../clients/anki-connect.client';
3
+ export declare class NotesInfoTool {
4
+ private readonly ankiClient;
5
+ private readonly logger;
6
+ constructor(ankiClient: AnkiConnectClient);
7
+ notesInfo({ notes }: {
8
+ notes: number[];
9
+ }, context: Context): Promise<{
10
+ [x: string]: unknown;
11
+ content: ({
12
+ [x: string]: unknown;
13
+ type: "text";
14
+ text: string;
15
+ _meta?: {
16
+ [x: string]: unknown;
17
+ } | undefined;
18
+ } | {
19
+ [x: string]: unknown;
20
+ type: "image";
21
+ data: string;
22
+ mimeType: string;
23
+ _meta?: {
24
+ [x: string]: unknown;
25
+ } | undefined;
26
+ } | {
27
+ [x: string]: unknown;
28
+ type: "audio";
29
+ data: string;
30
+ mimeType: string;
31
+ _meta?: {
32
+ [x: string]: unknown;
33
+ } | undefined;
34
+ } | {
35
+ [x: string]: unknown;
36
+ type: "resource_link";
37
+ name: string;
38
+ uri: string;
39
+ _meta?: {
40
+ [x: string]: unknown;
41
+ } | undefined;
42
+ mimeType?: string | undefined;
43
+ title?: string | undefined;
44
+ description?: string | undefined;
45
+ icons?: {
46
+ [x: string]: unknown;
47
+ src: string;
48
+ mimeType?: string | undefined;
49
+ sizes?: string | undefined;
50
+ }[] | undefined;
51
+ } | {
52
+ [x: string]: unknown;
53
+ type: "resource";
54
+ resource: {
55
+ [x: string]: unknown;
56
+ text: string;
57
+ uri: string;
58
+ _meta?: {
59
+ [x: string]: unknown;
60
+ } | undefined;
61
+ mimeType?: string | undefined;
62
+ } | {
63
+ [x: string]: unknown;
64
+ uri: string;
65
+ blob: string;
66
+ _meta?: {
67
+ [x: string]: unknown;
68
+ } | undefined;
69
+ mimeType?: string | undefined;
70
+ };
71
+ _meta?: {
72
+ [x: string]: unknown;
73
+ } | undefined;
74
+ })[];
75
+ _meta?: {
76
+ [x: string]: unknown;
77
+ } | undefined;
78
+ structuredContent?: {
79
+ [x: string]: unknown;
80
+ } | undefined;
81
+ isError?: boolean | undefined;
82
+ }>;
83
+ }
@@ -0,0 +1,111 @@
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 NotesInfoTool_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.NotesInfoTool = 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 NotesInfoTool = NotesInfoTool_1 = class NotesInfoTool {
20
+ ankiClient;
21
+ logger = new common_1.Logger(NotesInfoTool_1.name);
22
+ constructor(ankiClient) {
23
+ this.ankiClient = ankiClient;
24
+ }
25
+ async notesInfo({ notes }, context) {
26
+ try {
27
+ this.logger.log(`Getting information for ${notes.length} note(s)`);
28
+ await context.reportProgress({ progress: 25, total: 100 });
29
+ const notesData = await this.ankiClient.invoke('notesInfo', {
30
+ notes: notes,
31
+ });
32
+ await context.reportProgress({ progress: 75, total: 100 });
33
+ if (!notesData || notesData.length === 0) {
34
+ this.logger.warn('No note information returned');
35
+ await context.reportProgress({ progress: 100, total: 100 });
36
+ return (0, anki_utils_1.createErrorResponse)(new Error('No note information found'), {
37
+ requestedNotes: notes,
38
+ hint: 'The note IDs may be invalid or the notes may have been deleted',
39
+ });
40
+ }
41
+ const transformedNotes = notesData.map(note => ({
42
+ noteId: note.noteId,
43
+ modelName: note.modelName,
44
+ tags: note.tags || [],
45
+ fields: note.fields || {},
46
+ cards: note.cards || [],
47
+ mod: note.mod,
48
+ }));
49
+ const validNotes = transformedNotes.filter(note => note.noteId);
50
+ const deletedCount = notes.length - validNotes.length;
51
+ await context.reportProgress({ progress: 100, total: 100 });
52
+ const message = deletedCount > 0
53
+ ? `Retrieved ${validNotes.length} note(s). ${deletedCount} note(s) not found (possibly deleted).`
54
+ : `Successfully retrieved information for ${validNotes.length} note(s)`;
55
+ this.logger.log(message);
56
+ const uniqueModels = [...new Set(validNotes.map(n => n.modelName))];
57
+ return (0, anki_utils_1.createSuccessResponse)({
58
+ success: true,
59
+ notes: validNotes,
60
+ count: validNotes.length,
61
+ notFound: deletedCount,
62
+ requestedIds: notes,
63
+ message: message,
64
+ models: uniqueModels,
65
+ cssNote: 'Each note model has its own CSS styling. Use modelStyling tool to get CSS for specific models.',
66
+ hint: validNotes.length > 0
67
+ ? 'Fields may contain HTML. Use updateNoteFields to modify content. Do not view notes in Anki browser while updating.'
68
+ : 'No valid notes found. They may have been deleted.',
69
+ });
70
+ }
71
+ catch (error) {
72
+ this.logger.error('Failed to get notes information', error);
73
+ if (error instanceof Error) {
74
+ if (error.message.includes('not found')) {
75
+ return (0, anki_utils_1.createErrorResponse)(error, {
76
+ requestedNotes: notes,
77
+ hint: 'One or more note IDs are invalid. Use findNotes to get valid note IDs.',
78
+ });
79
+ }
80
+ }
81
+ return (0, anki_utils_1.createErrorResponse)(error, {
82
+ requestedNotes: notes,
83
+ hint: 'Make sure Anki is running and the note IDs are valid',
84
+ });
85
+ }
86
+ }
87
+ };
88
+ exports.NotesInfoTool = NotesInfoTool;
89
+ __decorate([
90
+ (0, mcp_nest_1.Tool)({
91
+ name: 'notesInfo',
92
+ description: 'Get detailed information about specific notes including all fields, tags, model info, and CSS styling. ' +
93
+ 'Use this after findNotes to get complete note data. Includes CSS for proper rendering awareness.',
94
+ parameters: zod_1.z.object({
95
+ notes: zod_1.z
96
+ .array(zod_1.z.number())
97
+ .min(1)
98
+ .max(100)
99
+ .describe('Array of note IDs to get information for (max 100 at once for performance). ' +
100
+ 'Get these IDs from findNotes tool.'),
101
+ }),
102
+ }),
103
+ __metadata("design:type", Function),
104
+ __metadata("design:paramtypes", [Object, Object]),
105
+ __metadata("design:returntype", Promise)
106
+ ], NotesInfoTool.prototype, "notesInfo", null);
107
+ exports.NotesInfoTool = NotesInfoTool = NotesInfoTool_1 = __decorate([
108
+ (0, common_1.Injectable)(),
109
+ __metadata("design:paramtypes", [anki_connect_client_1.AnkiConnectClient])
110
+ ], NotesInfoTool);
111
+ //# sourceMappingURL=notes-info.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes-info.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/notes-info.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import type { Context } from '@rekog/mcp-nest';
2
+ import { AnkiConnectClient } from '../../../clients/anki-connect.client';
3
+ export declare class PresentCardTool {
4
+ private readonly ankiClient;
5
+ private readonly logger;
6
+ constructor(ankiClient: AnkiConnectClient);
7
+ presentCard({ card_id, show_answer }: {
8
+ card_id: number;
9
+ show_answer?: boolean;
10
+ }, context: Context): Promise<{
11
+ [x: string]: unknown;
12
+ content: ({
13
+ [x: string]: unknown;
14
+ type: "text";
15
+ text: string;
16
+ _meta?: {
17
+ [x: string]: unknown;
18
+ } | undefined;
19
+ } | {
20
+ [x: string]: unknown;
21
+ type: "image";
22
+ data: string;
23
+ mimeType: string;
24
+ _meta?: {
25
+ [x: string]: unknown;
26
+ } | undefined;
27
+ } | {
28
+ [x: string]: unknown;
29
+ type: "audio";
30
+ data: string;
31
+ mimeType: string;
32
+ _meta?: {
33
+ [x: string]: unknown;
34
+ } | undefined;
35
+ } | {
36
+ [x: string]: unknown;
37
+ type: "resource_link";
38
+ name: string;
39
+ uri: string;
40
+ _meta?: {
41
+ [x: string]: unknown;
42
+ } | undefined;
43
+ mimeType?: string | undefined;
44
+ title?: string | undefined;
45
+ description?: string | undefined;
46
+ icons?: {
47
+ [x: string]: unknown;
48
+ src: string;
49
+ mimeType?: string | undefined;
50
+ sizes?: string | undefined;
51
+ }[] | undefined;
52
+ } | {
53
+ [x: string]: unknown;
54
+ type: "resource";
55
+ resource: {
56
+ [x: string]: unknown;
57
+ text: string;
58
+ uri: string;
59
+ _meta?: {
60
+ [x: string]: unknown;
61
+ } | undefined;
62
+ mimeType?: string | undefined;
63
+ } | {
64
+ [x: string]: unknown;
65
+ uri: string;
66
+ blob: string;
67
+ _meta?: {
68
+ [x: string]: unknown;
69
+ } | undefined;
70
+ mimeType?: string | undefined;
71
+ };
72
+ _meta?: {
73
+ [x: string]: unknown;
74
+ } | undefined;
75
+ })[];
76
+ _meta?: {
77
+ [x: string]: unknown;
78
+ } | undefined;
79
+ structuredContent?: {
80
+ [x: string]: unknown;
81
+ } | undefined;
82
+ isError?: boolean | undefined;
83
+ }>;
84
+ }
@@ -0,0 +1,100 @@
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 PresentCardTool_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.PresentCardTool = 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 PresentCardTool = PresentCardTool_1 = class PresentCardTool {
20
+ ankiClient;
21
+ logger = new common_1.Logger(PresentCardTool_1.name);
22
+ constructor(ankiClient) {
23
+ this.ankiClient = ankiClient;
24
+ }
25
+ async presentCard({ card_id, show_answer }, context) {
26
+ try {
27
+ const showAnswer = show_answer || false;
28
+ this.logger.log(`Retrieving card ${card_id} for presentation (show_answer: ${showAnswer})`);
29
+ await context.reportProgress({ progress: 25, total: 100 });
30
+ const cardsInfo = await this.ankiClient.invoke('cardsInfo', {
31
+ cards: [card_id]
32
+ });
33
+ if (!cardsInfo || cardsInfo.length === 0) {
34
+ this.logger.warn(`Card not found: ${card_id}`);
35
+ return (0, anki_utils_1.createErrorResponse)(new Error(`Card with ID ${card_id} not found`), { cardId: card_id });
36
+ }
37
+ await context.reportProgress({ progress: 75, total: 100 });
38
+ const card = cardsInfo[0];
39
+ const { front, back } = (0, anki_utils_1.extractCardContent)(card.fields);
40
+ const cardType = (0, anki_utils_1.getCardType)(card.type);
41
+ const presentation = {
42
+ cardId: card.cardId,
43
+ front: front || card.question || '',
44
+ deckName: card.deckName,
45
+ modelName: card.modelName,
46
+ tags: card.tags || [],
47
+ currentInterval: card.interval || 0,
48
+ easeFactor: card.factor || 2500,
49
+ reviews: card.reps || 0,
50
+ lapses: card.lapses || 0,
51
+ cardType,
52
+ noteId: card.note,
53
+ };
54
+ if (showAnswer) {
55
+ presentation.back = back || card.answer || '';
56
+ }
57
+ await context.reportProgress({ progress: 100, total: 100 });
58
+ this.logger.log(`Retrieved card ${card_id} for presentation`);
59
+ const response = {
60
+ success: true,
61
+ card: presentation,
62
+ };
63
+ if (!showAnswer) {
64
+ response.instruction = 'Question shown. Wait for user\'s answer, then use show_answer=true';
65
+ }
66
+ else {
67
+ response.instruction = 'Answer revealed. Evaluate response and suggest rating, then wait for user confirmation';
68
+ }
69
+ return (0, anki_utils_1.createSuccessResponse)(response);
70
+ }
71
+ catch (error) {
72
+ this.logger.error(`Failed to retrieve card ${card_id}`, error);
73
+ return (0, anki_utils_1.createErrorResponse)(error, { cardId: card_id });
74
+ }
75
+ }
76
+ };
77
+ exports.PresentCardTool = PresentCardTool;
78
+ __decorate([
79
+ (0, mcp_nest_1.Tool)({
80
+ name: 'present_card',
81
+ description: 'Retrieve a card\'s content for review. WORKFLOW: 1) Show question, 2) Wait for user answer, 3) Show answer with show_answer=true, 4) Evaluate and suggest rating (1-4), 5) Wait for user confirmation ("ok"/"next" = accept, or they provide different rating), 6) Only then use rate_card',
82
+ parameters: zod_1.z.object({
83
+ card_id: zod_1.z
84
+ .number()
85
+ .describe('The ID of the card to retrieve'),
86
+ show_answer: zod_1.z
87
+ .boolean()
88
+ .default(false)
89
+ .describe('Whether to include the answer/back content in the response'),
90
+ }),
91
+ }),
92
+ __metadata("design:type", Function),
93
+ __metadata("design:paramtypes", [Object, Object]),
94
+ __metadata("design:returntype", Promise)
95
+ ], PresentCardTool.prototype, "presentCard", null);
96
+ exports.PresentCardTool = PresentCardTool = PresentCardTool_1 = __decorate([
97
+ (0, common_1.Injectable)(),
98
+ __metadata("design:paramtypes", [anki_connect_client_1.AnkiConnectClient])
99
+ ], PresentCardTool);
100
+ //# sourceMappingURL=present-card.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"present-card.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/essential/tools/present-card.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import type { Context } from '@rekog/mcp-nest';
2
+ import { AnkiConnectClient } from '../../../clients/anki-connect.client';
3
+ export declare class RateCardTool {
4
+ private readonly ankiClient;
5
+ private readonly logger;
6
+ constructor(ankiClient: AnkiConnectClient);
7
+ rateCard({ card_id, rating }: {
8
+ card_id: number;
9
+ rating: number;
10
+ }, context: Context): Promise<{
11
+ [x: string]: unknown;
12
+ content: ({
13
+ [x: string]: unknown;
14
+ type: "text";
15
+ text: string;
16
+ _meta?: {
17
+ [x: string]: unknown;
18
+ } | undefined;
19
+ } | {
20
+ [x: string]: unknown;
21
+ type: "image";
22
+ data: string;
23
+ mimeType: string;
24
+ _meta?: {
25
+ [x: string]: unknown;
26
+ } | undefined;
27
+ } | {
28
+ [x: string]: unknown;
29
+ type: "audio";
30
+ data: string;
31
+ mimeType: string;
32
+ _meta?: {
33
+ [x: string]: unknown;
34
+ } | undefined;
35
+ } | {
36
+ [x: string]: unknown;
37
+ type: "resource_link";
38
+ name: string;
39
+ uri: string;
40
+ _meta?: {
41
+ [x: string]: unknown;
42
+ } | undefined;
43
+ mimeType?: string | undefined;
44
+ title?: string | undefined;
45
+ description?: string | undefined;
46
+ icons?: {
47
+ [x: string]: unknown;
48
+ src: string;
49
+ mimeType?: string | undefined;
50
+ sizes?: string | undefined;
51
+ }[] | undefined;
52
+ } | {
53
+ [x: string]: unknown;
54
+ type: "resource";
55
+ resource: {
56
+ [x: string]: unknown;
57
+ text: string;
58
+ uri: string;
59
+ _meta?: {
60
+ [x: string]: unknown;
61
+ } | undefined;
62
+ mimeType?: string | undefined;
63
+ } | {
64
+ [x: string]: unknown;
65
+ uri: string;
66
+ blob: string;
67
+ _meta?: {
68
+ [x: string]: unknown;
69
+ } | undefined;
70
+ mimeType?: string | undefined;
71
+ };
72
+ _meta?: {
73
+ [x: string]: unknown;
74
+ } | undefined;
75
+ })[];
76
+ _meta?: {
77
+ [x: string]: unknown;
78
+ } | undefined;
79
+ structuredContent?: {
80
+ [x: string]: unknown;
81
+ } | undefined;
82
+ isError?: boolean | undefined;
83
+ }>;
84
+ }