anki-mcp-http 0.12.1 → 0.13.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.
- package/README.md +53 -5
- package/bin/ankimcp.js +16 -0
- package/dist/anki-config.service.d.ts +1 -0
- package/dist/anki-config.service.js +4 -0
- package/dist/anki-config.service.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +12 -3
- package/dist/cli.js.map +1 -1
- package/dist/main-http.js +1 -0
- package/dist/main-http.js.map +1 -1
- package/dist/main-stdio.js +28 -1
- package/dist/main-stdio.js.map +1 -1
- package/dist/mcp/clients/anki-connect.client.d.ts +5 -0
- package/dist/mcp/clients/anki-connect.client.js +35 -1
- package/dist/mcp/clients/anki-connect.client.js.map +1 -1
- package/dist/mcp/config/anki-config.interface.d.ts +1 -0
- package/dist/mcp/config/anki-config.interface.js.map +1 -1
- package/dist/mcp/primitives/essential/index.d.ts +4 -8
- package/dist/mcp/primitives/essential/index.js +6 -13
- package/dist/mcp/primitives/essential/index.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/add-note.tool.js +22 -9
- package/dist/mcp/primitives/essential/tools/add-note.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/deckActions/actions/changeDeck.action.d.ts +12 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/changeDeck.action.js +24 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/changeDeck.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/createDeck.action.d.ts +15 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/createDeck.action.js +44 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/createDeck.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/{deck-stats/deck-stats.types.d.ts → deckActions/actions/deckStats.action.d.ts} +5 -2
- package/dist/mcp/primitives/essential/tools/deckActions/actions/deckStats.action.js +78 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/deckStats.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/listDecks.action.d.ts +18 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/listDecks.action.js +63 -0
- package/dist/mcp/primitives/essential/tools/deckActions/actions/listDecks.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/{deck-stats/deck-stats.tool.d.ts → deckActions/deckActions.tool.d.ts} +8 -4
- package/dist/mcp/primitives/essential/tools/deckActions/deckActions.tool.js +138 -0
- package/dist/mcp/primitives/essential/tools/deckActions/deckActions.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/deckActions/index.d.ts +5 -0
- package/dist/mcp/primitives/essential/tools/deckActions/index.js +6 -0
- package/dist/mcp/primitives/essential/tools/deckActions/index.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +23 -23
- package/dist/mcp/primitives/essential/tools/create-deck.tool.d.ts +0 -105
- package/dist/mcp/primitives/essential/tools/create-deck.tool.js +0 -121
- package/dist/mcp/primitives/essential/tools/create-deck.tool.js.map +0 -1
- package/dist/mcp/primitives/essential/tools/deck-stats/deck-stats.tool.js +0 -165
- package/dist/mcp/primitives/essential/tools/deck-stats/deck-stats.tool.js.map +0 -1
- package/dist/mcp/primitives/essential/tools/deck-stats/deck-stats.types.js +0 -3
- package/dist/mcp/primitives/essential/tools/deck-stats/deck-stats.types.js.map +0 -1
- package/dist/mcp/primitives/essential/tools/deck-stats/index.d.ts +0 -2
- package/dist/mcp/primitives/essential/tools/deck-stats/index.js +0 -6
- package/dist/mcp/primitives/essential/tools/deck-stats/index.js.map +0 -1
- package/dist/mcp/primitives/essential/tools/list-decks.tool.d.ts +0 -105
- package/dist/mcp/primitives/essential/tools/list-decks.tool.js +0 -117
- package/dist/mcp/primitives/essential/tools/list-decks.tool.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "anki-mcp-http",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Model Context Protocol server for Anki - enables AI assistants to interact with your Anki flashcards",
|
|
5
5
|
"author": "Anatoly Tarnavsky",
|
|
6
6
|
"private": false,
|
|
@@ -50,60 +50,60 @@
|
|
|
50
50
|
"prepare": "husky"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@modelcontextprotocol/sdk": "^1.25.
|
|
54
|
-
"@nestjs/common": "^11.1.
|
|
53
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
54
|
+
"@nestjs/common": "^11.1.12",
|
|
55
55
|
"@nestjs/config": "^4.0.2",
|
|
56
|
-
"@nestjs/core": "^11.1.
|
|
56
|
+
"@nestjs/core": "^11.1.12",
|
|
57
57
|
"@nestjs/jwt": "^11.0.2",
|
|
58
58
|
"@nestjs/passport": "^11.0.5",
|
|
59
|
-
"@nestjs/platform-express": "^11.1.
|
|
60
|
-
"@rekog/mcp-nest": "^1.9.
|
|
61
|
-
"commander": "^14.0.
|
|
59
|
+
"@nestjs/platform-express": "^11.1.12",
|
|
60
|
+
"@rekog/mcp-nest": "^1.9.3",
|
|
61
|
+
"commander": "^14.0.3",
|
|
62
62
|
"jsonwebtoken": "^9.0.3",
|
|
63
|
-
"ky": "^1.14.
|
|
63
|
+
"ky": "^1.14.3",
|
|
64
64
|
"passport": "^0.7.0",
|
|
65
65
|
"passport-jwt": "^4.0.1",
|
|
66
|
-
"pino": "^10.
|
|
66
|
+
"pino": "^10.3.0",
|
|
67
67
|
"pino-pretty": "^13.1.3",
|
|
68
68
|
"reflect-metadata": "^0.2.2",
|
|
69
69
|
"remark-parse": "^11.0.0",
|
|
70
70
|
"rxjs": "^7.8.2",
|
|
71
71
|
"unified": "^11.0.5",
|
|
72
|
-
"unist-util-visit": "^5.
|
|
72
|
+
"unist-util-visit": "^5.1.0",
|
|
73
73
|
"update-notifier": "^7.3.1",
|
|
74
|
-
"zod": "^4.3.
|
|
74
|
+
"zod": "^4.3.6",
|
|
75
75
|
"zod-to-json-schema": "^3.25.1"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"@anthropic-ai/mcpb": "^2.1.2",
|
|
79
79
|
"@eslint/eslintrc": "^3.3.3",
|
|
80
80
|
"@eslint/js": "^9.39.2",
|
|
81
|
-
"@modelcontextprotocol/inspector": "^0.
|
|
82
|
-
"@nestjs/cli": "^11.0.
|
|
83
|
-
"@nestjs/schematics": "^11.0.
|
|
84
|
-
"@nestjs/testing": "^11.1.
|
|
81
|
+
"@modelcontextprotocol/inspector": "^0.19.0",
|
|
82
|
+
"@nestjs/cli": "^11.0.16",
|
|
83
|
+
"@nestjs/schematics": "^11.0.9",
|
|
84
|
+
"@nestjs/testing": "^11.1.12",
|
|
85
85
|
"@types/express": "^5.0.6",
|
|
86
86
|
"@types/jest": "^30.0.0",
|
|
87
87
|
"@types/jsonwebtoken": "^9.0.10",
|
|
88
88
|
"@types/mdast": "^4.0.4",
|
|
89
|
-
"@types/node": "^25.0
|
|
89
|
+
"@types/node": "^25.2.0",
|
|
90
90
|
"@types/supertest": "^6.0.3",
|
|
91
91
|
"@types/update-notifier": "^6.0.8",
|
|
92
92
|
"eslint": "^9.39.2",
|
|
93
93
|
"eslint-config-prettier": "^10.1.8",
|
|
94
|
-
"eslint-plugin-prettier": "^5.5.
|
|
95
|
-
"globals": "^17.
|
|
94
|
+
"eslint-plugin-prettier": "^5.5.5",
|
|
95
|
+
"globals": "^17.3.0",
|
|
96
96
|
"husky": "^9.1.7",
|
|
97
|
-
"jest": "^30.
|
|
98
|
-
"prettier": "^3.
|
|
97
|
+
"jest": "^30.2.0",
|
|
98
|
+
"prettier": "^3.8.1",
|
|
99
99
|
"source-map-support": "^0.5.21",
|
|
100
100
|
"supertest": "^7.2.2",
|
|
101
101
|
"ts-jest": "^29.4.6",
|
|
102
102
|
"ts-loader": "^9.5.4",
|
|
103
103
|
"ts-node": "^10.9.2",
|
|
104
104
|
"tsconfig-paths": "^4.2.0",
|
|
105
|
-
"typescript": "^5.9.
|
|
106
|
-
"typescript-eslint": "^8.
|
|
105
|
+
"typescript": "^5.9.3",
|
|
106
|
+
"typescript-eslint": "^8.54.0"
|
|
107
107
|
},
|
|
108
108
|
"jest": {
|
|
109
109
|
"moduleFileExtensions": [
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
"forceExit": true
|
|
153
153
|
},
|
|
154
154
|
"engines": {
|
|
155
|
-
"node": ">=20.19.0"
|
|
155
|
+
"node": ">=20.19.0 <21.0.0 || >=22.12.0"
|
|
156
156
|
},
|
|
157
157
|
"repository": {
|
|
158
158
|
"type": "git",
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import type { Context } from "@rekog/mcp-nest";
|
|
2
|
-
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
3
|
-
export declare class CreateDeckTool {
|
|
4
|
-
private readonly ankiClient;
|
|
5
|
-
private readonly logger;
|
|
6
|
-
constructor(ankiClient: AnkiConnectClient);
|
|
7
|
-
createDeck({ deck_name }: {
|
|
8
|
-
deck_name: string;
|
|
9
|
-
}, context: Context): Promise<{
|
|
10
|
-
[x: string]: unknown;
|
|
11
|
-
content: ({
|
|
12
|
-
type: "text";
|
|
13
|
-
text: string;
|
|
14
|
-
annotations?: {
|
|
15
|
-
audience?: ("user" | "assistant")[] | undefined;
|
|
16
|
-
priority?: number | undefined;
|
|
17
|
-
lastModified?: string | undefined;
|
|
18
|
-
} | undefined;
|
|
19
|
-
_meta?: {
|
|
20
|
-
[x: string]: unknown;
|
|
21
|
-
} | undefined;
|
|
22
|
-
} | {
|
|
23
|
-
type: "image";
|
|
24
|
-
data: string;
|
|
25
|
-
mimeType: string;
|
|
26
|
-
annotations?: {
|
|
27
|
-
audience?: ("user" | "assistant")[] | undefined;
|
|
28
|
-
priority?: number | undefined;
|
|
29
|
-
lastModified?: string | undefined;
|
|
30
|
-
} | undefined;
|
|
31
|
-
_meta?: {
|
|
32
|
-
[x: string]: unknown;
|
|
33
|
-
} | undefined;
|
|
34
|
-
} | {
|
|
35
|
-
type: "audio";
|
|
36
|
-
data: string;
|
|
37
|
-
mimeType: string;
|
|
38
|
-
annotations?: {
|
|
39
|
-
audience?: ("user" | "assistant")[] | undefined;
|
|
40
|
-
priority?: number | undefined;
|
|
41
|
-
lastModified?: string | undefined;
|
|
42
|
-
} | undefined;
|
|
43
|
-
_meta?: {
|
|
44
|
-
[x: string]: unknown;
|
|
45
|
-
} | undefined;
|
|
46
|
-
} | {
|
|
47
|
-
uri: string;
|
|
48
|
-
name: string;
|
|
49
|
-
type: "resource_link";
|
|
50
|
-
description?: string | undefined;
|
|
51
|
-
mimeType?: string | undefined;
|
|
52
|
-
annotations?: {
|
|
53
|
-
audience?: ("user" | "assistant")[] | undefined;
|
|
54
|
-
priority?: number | undefined;
|
|
55
|
-
lastModified?: string | undefined;
|
|
56
|
-
} | undefined;
|
|
57
|
-
_meta?: {
|
|
58
|
-
[x: string]: unknown;
|
|
59
|
-
} | undefined;
|
|
60
|
-
icons?: {
|
|
61
|
-
src: string;
|
|
62
|
-
mimeType?: string | undefined;
|
|
63
|
-
sizes?: string[] | undefined;
|
|
64
|
-
theme?: "light" | "dark" | undefined;
|
|
65
|
-
}[] | undefined;
|
|
66
|
-
title?: string | undefined;
|
|
67
|
-
} | {
|
|
68
|
-
type: "resource";
|
|
69
|
-
resource: {
|
|
70
|
-
uri: string;
|
|
71
|
-
text: string;
|
|
72
|
-
mimeType?: string | undefined;
|
|
73
|
-
_meta?: {
|
|
74
|
-
[x: string]: unknown;
|
|
75
|
-
} | undefined;
|
|
76
|
-
} | {
|
|
77
|
-
uri: string;
|
|
78
|
-
blob: string;
|
|
79
|
-
mimeType?: string | undefined;
|
|
80
|
-
_meta?: {
|
|
81
|
-
[x: string]: unknown;
|
|
82
|
-
} | undefined;
|
|
83
|
-
};
|
|
84
|
-
annotations?: {
|
|
85
|
-
audience?: ("user" | "assistant")[] | undefined;
|
|
86
|
-
priority?: number | undefined;
|
|
87
|
-
lastModified?: string | undefined;
|
|
88
|
-
} | undefined;
|
|
89
|
-
_meta?: {
|
|
90
|
-
[x: string]: unknown;
|
|
91
|
-
} | undefined;
|
|
92
|
-
})[];
|
|
93
|
-
_meta?: {
|
|
94
|
-
[x: string]: unknown;
|
|
95
|
-
progressToken?: string | number | undefined;
|
|
96
|
-
"io.modelcontextprotocol/related-task"?: {
|
|
97
|
-
taskId: string;
|
|
98
|
-
} | undefined;
|
|
99
|
-
} | undefined;
|
|
100
|
-
structuredContent?: {
|
|
101
|
-
[x: string]: unknown;
|
|
102
|
-
} | undefined;
|
|
103
|
-
isError?: boolean | undefined;
|
|
104
|
-
}>;
|
|
105
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
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 CreateDeckTool_1;
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.CreateDeckTool = 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 CreateDeckTool = CreateDeckTool_1 = class CreateDeckTool {
|
|
20
|
-
ankiClient;
|
|
21
|
-
logger = new common_1.Logger(CreateDeckTool_1.name);
|
|
22
|
-
constructor(ankiClient) {
|
|
23
|
-
this.ankiClient = ankiClient;
|
|
24
|
-
}
|
|
25
|
-
async createDeck({ deck_name }, context) {
|
|
26
|
-
try {
|
|
27
|
-
const parts = deck_name.split("::");
|
|
28
|
-
if (parts.length > 2) {
|
|
29
|
-
return (0, anki_utils_1.createErrorResponse)(new Error("Deck name can have maximum 2 levels (parent::child)"), {
|
|
30
|
-
deckName: deck_name,
|
|
31
|
-
levels: parts.length,
|
|
32
|
-
maxLevels: 2,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
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
|
-
}
|
|
38
|
-
this.logger.log(`Creating deck: ${deck_name}`);
|
|
39
|
-
await context.reportProgress({ progress: 25, total: 100 });
|
|
40
|
-
const deckId = await this.ankiClient.invoke("createDeck", {
|
|
41
|
-
deck: deck_name,
|
|
42
|
-
});
|
|
43
|
-
await context.reportProgress({ progress: 75, total: 100 });
|
|
44
|
-
if (!deckId) {
|
|
45
|
-
this.logger.warn(`Deck may already exist: ${deck_name}`);
|
|
46
|
-
const existingDecks = await this.ankiClient.invoke("deckNames");
|
|
47
|
-
const deckExists = existingDecks.includes(deck_name);
|
|
48
|
-
await context.reportProgress({ progress: 100, total: 100 });
|
|
49
|
-
if (deckExists) {
|
|
50
|
-
return (0, anki_utils_1.createSuccessResponse)({
|
|
51
|
-
success: true,
|
|
52
|
-
message: `Deck "${deck_name}" already exists`,
|
|
53
|
-
deckName: deck_name,
|
|
54
|
-
created: false,
|
|
55
|
-
exists: true,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
return (0, anki_utils_1.createErrorResponse)(new Error("Failed to create deck - unknown error"), { deckName: deck_name });
|
|
59
|
-
}
|
|
60
|
-
await context.reportProgress({ progress: 100, total: 100 });
|
|
61
|
-
this.logger.log(`Successfully created deck: ${deck_name} with ID: ${deckId}`);
|
|
62
|
-
const response = {
|
|
63
|
-
success: true,
|
|
64
|
-
deckId: deckId,
|
|
65
|
-
deckName: deck_name,
|
|
66
|
-
message: `Successfully created deck "${deck_name}"`,
|
|
67
|
-
created: true,
|
|
68
|
-
};
|
|
69
|
-
if (parts.length === 2) {
|
|
70
|
-
response.parentDeck = parts[0];
|
|
71
|
-
response.childDeck = parts[1];
|
|
72
|
-
response.message = `Successfully created parent deck "${parts[0]}" and child deck "${parts[1]}"`;
|
|
73
|
-
}
|
|
74
|
-
return (0, anki_utils_1.createSuccessResponse)(response);
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
this.logger.error(`Failed to create deck ${deck_name}`, error);
|
|
78
|
-
if (error instanceof Error && error.message.includes("already exists")) {
|
|
79
|
-
return (0, anki_utils_1.createSuccessResponse)({
|
|
80
|
-
success: true,
|
|
81
|
-
message: `Deck "${deck_name}" already exists`,
|
|
82
|
-
deckName: deck_name,
|
|
83
|
-
created: false,
|
|
84
|
-
exists: true,
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
88
|
-
deckName: deck_name,
|
|
89
|
-
hint: "Make sure Anki is running and the deck name is valid",
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
exports.CreateDeckTool = CreateDeckTool;
|
|
95
|
-
__decorate([
|
|
96
|
-
(0, mcp_nest_1.Tool)({
|
|
97
|
-
name: "create_deck",
|
|
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
|
-
"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
|
-
parameters: zod_1.z.object({
|
|
101
|
-
deck_name: zod_1.z
|
|
102
|
-
.string()
|
|
103
|
-
.min(1)
|
|
104
|
-
.describe('The name of the deck to create. Use "::" for parent::child structure (max 2 levels)')
|
|
105
|
-
.refine((name) => {
|
|
106
|
-
const parts = name.split("::");
|
|
107
|
-
return parts.length <= 2;
|
|
108
|
-
}, {
|
|
109
|
-
message: "Deck name can have maximum 2 levels (parent::child). More than 2 levels not permitted.",
|
|
110
|
-
}),
|
|
111
|
-
}),
|
|
112
|
-
}),
|
|
113
|
-
__metadata("design:type", Function),
|
|
114
|
-
__metadata("design:paramtypes", [Object, Object]),
|
|
115
|
-
__metadata("design:returntype", Promise)
|
|
116
|
-
], CreateDeckTool.prototype, "createDeck", null);
|
|
117
|
-
exports.CreateDeckTool = CreateDeckTool = CreateDeckTool_1 = __decorate([
|
|
118
|
-
(0, common_1.Injectable)(),
|
|
119
|
-
__metadata("design:paramtypes", [anki_connect_client_1.AnkiConnectClient])
|
|
120
|
-
], CreateDeckTool);
|
|
121
|
-
//# sourceMappingURL=create-deck.tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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,165 +0,0 @@
|
|
|
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 DeckStatsTool_1;
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.DeckStatsTool = 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
|
-
const stats_utils_1 = require("../../../../utils/stats.utils");
|
|
20
|
-
let DeckStatsTool = DeckStatsTool_1 = class DeckStatsTool {
|
|
21
|
-
ankiClient;
|
|
22
|
-
logger = new common_1.Logger(DeckStatsTool_1.name);
|
|
23
|
-
constructor(ankiClient) {
|
|
24
|
-
this.ankiClient = ankiClient;
|
|
25
|
-
}
|
|
26
|
-
async execute(params, context) {
|
|
27
|
-
try {
|
|
28
|
-
const { deck, ease_buckets = [2.0, 2.5, 3.0], interval_buckets = [7, 21, 90], } = params;
|
|
29
|
-
this.logger.log(`Getting statistics for deck: ${deck}`);
|
|
30
|
-
await context.reportProgress({ progress: 10, total: 100 });
|
|
31
|
-
this.logger.log("Fetching deck statistics...");
|
|
32
|
-
const deckStatsResponse = await this.ankiClient.invoke("getDeckStats", {
|
|
33
|
-
decks: [deck],
|
|
34
|
-
});
|
|
35
|
-
if (!deckStatsResponse || Object.keys(deckStatsResponse).length === 0) {
|
|
36
|
-
throw new Error(`Deck "${deck}" not found`);
|
|
37
|
-
}
|
|
38
|
-
const deckStatsArray = Object.values(deckStatsResponse);
|
|
39
|
-
const deckStats = deckStatsArray.find((s) => s.name === deck);
|
|
40
|
-
if (!deckStats) {
|
|
41
|
-
throw new Error(`Deck "${deck}" not found in statistics response`);
|
|
42
|
-
}
|
|
43
|
-
const counts = {
|
|
44
|
-
total: deckStats.total_in_deck || 0,
|
|
45
|
-
new: deckStats.new_count || 0,
|
|
46
|
-
learning: deckStats.learn_count || 0,
|
|
47
|
-
review: deckStats.review_count || 0,
|
|
48
|
-
};
|
|
49
|
-
await context.reportProgress({ progress: 30, total: 100 });
|
|
50
|
-
if (counts.total === 0) {
|
|
51
|
-
this.logger.log(`Deck "${deck}" is empty`);
|
|
52
|
-
const result = {
|
|
53
|
-
deck,
|
|
54
|
-
counts,
|
|
55
|
-
ease: (0, stats_utils_1.computeDistribution)([], { boundaries: ease_buckets }),
|
|
56
|
-
intervals: (0, stats_utils_1.computeDistribution)([], {
|
|
57
|
-
boundaries: interval_buckets,
|
|
58
|
-
unitSuffix: "d",
|
|
59
|
-
}),
|
|
60
|
-
};
|
|
61
|
-
await context.reportProgress({ progress: 100, total: 100 });
|
|
62
|
-
return (0, anki_utils_1.createSuccessResponse)(result);
|
|
63
|
-
}
|
|
64
|
-
this.logger.log("Finding cards in deck...");
|
|
65
|
-
const escapedDeckName = deck.replace(/"/g, '\\"');
|
|
66
|
-
const cardIds = await this.ankiClient.invoke("findCards", {
|
|
67
|
-
query: `"deck:${escapedDeckName}"`,
|
|
68
|
-
});
|
|
69
|
-
if (!cardIds || cardIds.length === 0) {
|
|
70
|
-
this.logger.warn(`No cards found via findCards for deck "${deck}", using counts from getDeckStats`);
|
|
71
|
-
const result = {
|
|
72
|
-
deck,
|
|
73
|
-
counts,
|
|
74
|
-
ease: (0, stats_utils_1.computeDistribution)([], { boundaries: ease_buckets }),
|
|
75
|
-
intervals: (0, stats_utils_1.computeDistribution)([], {
|
|
76
|
-
boundaries: interval_buckets,
|
|
77
|
-
unitSuffix: "d",
|
|
78
|
-
}),
|
|
79
|
-
};
|
|
80
|
-
await context.reportProgress({ progress: 100, total: 100 });
|
|
81
|
-
return (0, anki_utils_1.createSuccessResponse)(result);
|
|
82
|
-
}
|
|
83
|
-
await context.reportProgress({ progress: 50, total: 100 });
|
|
84
|
-
this.logger.log(`Fetching ease factors for ${cardIds.length} cards...`);
|
|
85
|
-
const easeFactorsRaw = await this.ankiClient.invoke("getEaseFactors", {
|
|
86
|
-
cards: cardIds,
|
|
87
|
-
});
|
|
88
|
-
const easeValues = easeFactorsRaw
|
|
89
|
-
.map((e) => e / 1000)
|
|
90
|
-
.filter((e) => e > 0);
|
|
91
|
-
await context.reportProgress({ progress: 70, total: 100 });
|
|
92
|
-
this.logger.log(`Fetching intervals for ${cardIds.length} cards...`);
|
|
93
|
-
const intervalsRaw = await this.ankiClient.invoke("getIntervals", {
|
|
94
|
-
cards: cardIds,
|
|
95
|
-
});
|
|
96
|
-
const intervalValues = intervalsRaw.filter((i) => i > 0);
|
|
97
|
-
await context.reportProgress({ progress: 90, total: 100 });
|
|
98
|
-
this.logger.log("Computing distributions...");
|
|
99
|
-
const ease = (0, stats_utils_1.computeDistribution)(easeValues, {
|
|
100
|
-
boundaries: ease_buckets,
|
|
101
|
-
});
|
|
102
|
-
const intervals = (0, stats_utils_1.computeDistribution)(intervalValues, {
|
|
103
|
-
boundaries: interval_buckets,
|
|
104
|
-
unitSuffix: "d",
|
|
105
|
-
});
|
|
106
|
-
const result = {
|
|
107
|
-
deck,
|
|
108
|
-
counts,
|
|
109
|
-
ease,
|
|
110
|
-
intervals,
|
|
111
|
-
};
|
|
112
|
-
await context.reportProgress({ progress: 100, total: 100 });
|
|
113
|
-
this.logger.log(`Successfully retrieved statistics for deck "${deck}": ${counts.total} total cards, ` +
|
|
114
|
-
`${ease.count} cards with ease values, ${intervals.count} review cards`);
|
|
115
|
-
return (0, anki_utils_1.createSuccessResponse)(result);
|
|
116
|
-
}
|
|
117
|
-
catch (error) {
|
|
118
|
-
this.logger.error(`Failed to get deck statistics`, error);
|
|
119
|
-
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
120
|
-
hint: "Make sure Anki is running and the deck name is correct. Use list_decks to see available decks.",
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
exports.DeckStatsTool = DeckStatsTool;
|
|
126
|
-
__decorate([
|
|
127
|
-
(0, mcp_nest_1.Tool)({
|
|
128
|
-
name: "deck_stats",
|
|
129
|
-
description: "Get comprehensive statistics for a single deck including card counts, ease factor distribution, and interval distribution. " +
|
|
130
|
-
"Use this to analyze deck health, identify struggling cards (low ease), or understand review scheduling patterns. " +
|
|
131
|
-
"Ease buckets and interval buckets can be customized to focus on specific ranges.",
|
|
132
|
-
parameters: zod_1.z.object({
|
|
133
|
-
deck: zod_1.z
|
|
134
|
-
.string()
|
|
135
|
-
.min(1)
|
|
136
|
-
.describe("Deck name to get statistics for (e.g., 'Japanese::JLPT N5')"),
|
|
137
|
-
ease_buckets: zod_1.z
|
|
138
|
-
.array(zod_1.z.number().positive())
|
|
139
|
-
.optional()
|
|
140
|
-
.default([2.0, 2.5, 3.0])
|
|
141
|
-
.refine((arr) => arr.length === 0 || arr.every((v, i, a) => i === 0 || v > a[i - 1]), {
|
|
142
|
-
message: "Bucket boundaries must be in ascending order",
|
|
143
|
-
})
|
|
144
|
-
.describe("Bucket boundaries for ease factor distribution. Default: [2.0, 2.5, 3.0]. " +
|
|
145
|
-
"Example: [2.0, 2.5, 3.0] creates buckets: <2.0, 2.0-2.5, 2.5-3.0, >3.0"),
|
|
146
|
-
interval_buckets: zod_1.z
|
|
147
|
-
.array(zod_1.z.number().positive())
|
|
148
|
-
.optional()
|
|
149
|
-
.default([7, 21, 90])
|
|
150
|
-
.refine((arr) => arr.length === 0 || arr.every((v, i, a) => i === 0 || v > a[i - 1]), {
|
|
151
|
-
message: "Bucket boundaries must be in ascending order",
|
|
152
|
-
})
|
|
153
|
-
.describe("Bucket boundaries for interval distribution in days. Default: [7, 21, 90]. " +
|
|
154
|
-
"Example: [7, 21, 90] creates buckets: <7d, 7-21d, 21-90d, >90d"),
|
|
155
|
-
}),
|
|
156
|
-
}),
|
|
157
|
-
__metadata("design:type", Function),
|
|
158
|
-
__metadata("design:paramtypes", [Object, Object]),
|
|
159
|
-
__metadata("design:returntype", Promise)
|
|
160
|
-
], DeckStatsTool.prototype, "execute", null);
|
|
161
|
-
exports.DeckStatsTool = DeckStatsTool = DeckStatsTool_1 = __decorate([
|
|
162
|
-
(0, common_1.Injectable)(),
|
|
163
|
-
__metadata("design:paramtypes", [anki_connect_client_1.AnkiConnectClient])
|
|
164
|
-
], DeckStatsTool);
|
|
165
|
-
//# sourceMappingURL=deck-stats.tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deck-stats.tool.js","sourceRoot":"","sources":["../../../../../../src/mcp/primitives/essential/tools/deck-stats/deck-stats.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deck-stats.types.js","sourceRoot":"","sources":["../../../../../../src/mcp/primitives/essential/tools/deck-stats/deck-stats.types.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DeckStatsTool = void 0;
|
|
4
|
-
var deck_stats_tool_1 = require("./deck-stats.tool");
|
|
5
|
-
Object.defineProperty(exports, "DeckStatsTool", { enumerable: true, get: function () { return deck_stats_tool_1.DeckStatsTool; } });
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/mcp/primitives/essential/tools/deck-stats/index.ts"],"names":[],"mappings":";;;AAAA,qDAAkD;AAAzC,gHAAA,aAAa,OAAA"}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import type { Context } from "@rekog/mcp-nest";
|
|
2
|
-
import { AnkiConnectClient } from "@/mcp/clients/anki-connect.client";
|
|
3
|
-
export declare class ListDecksTool {
|
|
4
|
-
private readonly ankiClient;
|
|
5
|
-
private readonly logger;
|
|
6
|
-
constructor(ankiClient: AnkiConnectClient);
|
|
7
|
-
listDecks({ include_stats }: {
|
|
8
|
-
include_stats?: boolean;
|
|
9
|
-
}, context: Context): Promise<{
|
|
10
|
-
[x: string]: unknown;
|
|
11
|
-
content: ({
|
|
12
|
-
type: "text";
|
|
13
|
-
text: string;
|
|
14
|
-
annotations?: {
|
|
15
|
-
audience?: ("user" | "assistant")[] | undefined;
|
|
16
|
-
priority?: number | undefined;
|
|
17
|
-
lastModified?: string | undefined;
|
|
18
|
-
} | undefined;
|
|
19
|
-
_meta?: {
|
|
20
|
-
[x: string]: unknown;
|
|
21
|
-
} | undefined;
|
|
22
|
-
} | {
|
|
23
|
-
type: "image";
|
|
24
|
-
data: string;
|
|
25
|
-
mimeType: string;
|
|
26
|
-
annotations?: {
|
|
27
|
-
audience?: ("user" | "assistant")[] | undefined;
|
|
28
|
-
priority?: number | undefined;
|
|
29
|
-
lastModified?: string | undefined;
|
|
30
|
-
} | undefined;
|
|
31
|
-
_meta?: {
|
|
32
|
-
[x: string]: unknown;
|
|
33
|
-
} | undefined;
|
|
34
|
-
} | {
|
|
35
|
-
type: "audio";
|
|
36
|
-
data: string;
|
|
37
|
-
mimeType: string;
|
|
38
|
-
annotations?: {
|
|
39
|
-
audience?: ("user" | "assistant")[] | undefined;
|
|
40
|
-
priority?: number | undefined;
|
|
41
|
-
lastModified?: string | undefined;
|
|
42
|
-
} | undefined;
|
|
43
|
-
_meta?: {
|
|
44
|
-
[x: string]: unknown;
|
|
45
|
-
} | undefined;
|
|
46
|
-
} | {
|
|
47
|
-
uri: string;
|
|
48
|
-
name: string;
|
|
49
|
-
type: "resource_link";
|
|
50
|
-
description?: string | undefined;
|
|
51
|
-
mimeType?: string | undefined;
|
|
52
|
-
annotations?: {
|
|
53
|
-
audience?: ("user" | "assistant")[] | undefined;
|
|
54
|
-
priority?: number | undefined;
|
|
55
|
-
lastModified?: string | undefined;
|
|
56
|
-
} | undefined;
|
|
57
|
-
_meta?: {
|
|
58
|
-
[x: string]: unknown;
|
|
59
|
-
} | undefined;
|
|
60
|
-
icons?: {
|
|
61
|
-
src: string;
|
|
62
|
-
mimeType?: string | undefined;
|
|
63
|
-
sizes?: string[] | undefined;
|
|
64
|
-
theme?: "light" | "dark" | undefined;
|
|
65
|
-
}[] | undefined;
|
|
66
|
-
title?: string | undefined;
|
|
67
|
-
} | {
|
|
68
|
-
type: "resource";
|
|
69
|
-
resource: {
|
|
70
|
-
uri: string;
|
|
71
|
-
text: string;
|
|
72
|
-
mimeType?: string | undefined;
|
|
73
|
-
_meta?: {
|
|
74
|
-
[x: string]: unknown;
|
|
75
|
-
} | undefined;
|
|
76
|
-
} | {
|
|
77
|
-
uri: string;
|
|
78
|
-
blob: string;
|
|
79
|
-
mimeType?: string | undefined;
|
|
80
|
-
_meta?: {
|
|
81
|
-
[x: string]: unknown;
|
|
82
|
-
} | undefined;
|
|
83
|
-
};
|
|
84
|
-
annotations?: {
|
|
85
|
-
audience?: ("user" | "assistant")[] | undefined;
|
|
86
|
-
priority?: number | undefined;
|
|
87
|
-
lastModified?: string | undefined;
|
|
88
|
-
} | undefined;
|
|
89
|
-
_meta?: {
|
|
90
|
-
[x: string]: unknown;
|
|
91
|
-
} | undefined;
|
|
92
|
-
})[];
|
|
93
|
-
_meta?: {
|
|
94
|
-
[x: string]: unknown;
|
|
95
|
-
progressToken?: string | number | undefined;
|
|
96
|
-
"io.modelcontextprotocol/related-task"?: {
|
|
97
|
-
taskId: string;
|
|
98
|
-
} | undefined;
|
|
99
|
-
} | undefined;
|
|
100
|
-
structuredContent?: {
|
|
101
|
-
[x: string]: unknown;
|
|
102
|
-
} | undefined;
|
|
103
|
-
isError?: boolean | undefined;
|
|
104
|
-
}>;
|
|
105
|
-
}
|