@ankimcp/anki-mcp-server 0.18.4-tunnel → 0.18.5
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/bin/ankimcp.js +1 -10
- package/dist/anki-config.service.d.ts +11 -0
- package/dist/anki-config.service.js +46 -0
- package/dist/anki-config.service.js.map +1 -0
- package/dist/app.module.d.ts +2 -4
- package/dist/app.module.js +11 -99
- package/dist/app.module.js.map +1 -1
- package/dist/bootstrap.d.ts +1 -6
- package/dist/bootstrap.js +2 -7
- package/dist/bootstrap.js.map +1 -1
- package/dist/cli.d.ts +0 -4
- package/dist/cli.js +6 -20
- package/dist/cli.js.map +1 -1
- package/dist/http/guards/origin-validation.guard.d.ts +0 -1
- package/dist/http/guards/origin-validation.guard.js +3 -5
- package/dist/http/guards/origin-validation.guard.js.map +1 -1
- package/dist/main-http.js +10 -20
- package/dist/main-http.js.map +1 -1
- package/dist/main-stdio.js +9 -9
- package/dist/main-stdio.js.map +1 -1
- package/dist/mcp/primitives/essential/index.d.ts +0 -1
- package/dist/mcp/primitives/essential/index.js +1 -8
- package/dist/mcp/primitives/essential/index.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/add-note.tool.d.ts +1 -1
- package/dist/mcp/primitives/gui/index.d.ts +0 -1
- package/dist/mcp/primitives/gui/index.js +1 -8
- package/dist/mcp/primitives/gui/index.js.map +1 -1
- package/dist/services/ngrok.service.d.ts +0 -1
- package/dist/services/ngrok.service.js +3 -5
- package/dist/services/ngrok.service.js.map +1 -1
- package/dist/test-fixtures/mock-data.d.ts +0 -8
- package/dist/test-fixtures/mock-data.js +0 -8
- package/dist/test-fixtures/mock-data.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -6
- package/dist/app-config.service.d.ts +0 -22
- package/dist/app-config.service.js +0 -79
- package/dist/app-config.service.js.map +0 -1
- package/dist/cli/__tests__/cli-output.manual.d.ts +0 -2
- package/dist/cli/__tests__/cli-output.manual.js +0 -13
- package/dist/cli/__tests__/cli-output.manual.js.map +0 -1
- package/dist/cli/cli-output.d.ts +0 -20
- package/dist/cli/cli-output.js +0 -69
- package/dist/cli/cli-output.js.map +0 -1
- package/dist/cli/index.d.ts +0 -1
- package/dist/cli/index.js +0 -18
- package/dist/cli/index.js.map +0 -1
- package/dist/config/config.factory.d.ts +0 -13
- package/dist/config/config.factory.js +0 -32
- package/dist/config/config.factory.js.map +0 -1
- package/dist/config/config.schema.d.ts +0 -33
- package/dist/config/config.schema.js +0 -58
- package/dist/config/config.schema.js.map +0 -1
- package/dist/config/index.d.ts +0 -3
- package/dist/config/index.js +0 -11
- package/dist/config/index.js.map +0 -1
- package/dist/main-tunnel.d.ts +0 -1
- package/dist/main-tunnel.js +0 -26
- package/dist/main-tunnel.js.map +0 -1
- package/dist/tunnel/commands/index.d.ts +0 -3
- package/dist/tunnel/commands/index.js +0 -10
- package/dist/tunnel/commands/index.js.map +0 -1
- package/dist/tunnel/commands/login.command.d.ts +0 -1
- package/dist/tunnel/commands/login.command.js +0 -108
- package/dist/tunnel/commands/login.command.js.map +0 -1
- package/dist/tunnel/commands/logout.command.d.ts +0 -1
- package/dist/tunnel/commands/logout.command.js +0 -26
- package/dist/tunnel/commands/logout.command.js.map +0 -1
- package/dist/tunnel/commands/tunnel.command.d.ts +0 -1
- package/dist/tunnel/commands/tunnel.command.js +0 -185
- package/dist/tunnel/commands/tunnel.command.js.map +0 -1
- package/dist/tunnel/credentials.service.d.ts +0 -23
- package/dist/tunnel/credentials.service.js +0 -152
- package/dist/tunnel/credentials.service.js.map +0 -1
- package/dist/tunnel/device-flow.service.d.ts +0 -46
- package/dist/tunnel/device-flow.service.js +0 -237
- package/dist/tunnel/device-flow.service.js.map +0 -1
- package/dist/tunnel/in-memory.transport.d.ts +0 -14
- package/dist/tunnel/in-memory.transport.js +0 -63
- package/dist/tunnel/in-memory.transport.js.map +0 -1
- package/dist/tunnel/index.d.ts +0 -6
- package/dist/tunnel/index.js +0 -31
- package/dist/tunnel/index.js.map +0 -1
- package/dist/tunnel/tunnel-mcp.service.d.ts +0 -15
- package/dist/tunnel/tunnel-mcp.service.js +0 -100
- package/dist/tunnel/tunnel-mcp.service.js.map +0 -1
- package/dist/tunnel/tunnel.client.d.ts +0 -60
- package/dist/tunnel/tunnel.client.js +0 -386
- package/dist/tunnel/tunnel.client.js.map +0 -1
- package/dist/tunnel/tunnel.protocol.d.ts +0 -68
- package/dist/tunnel/tunnel.protocol.js +0 -26
- package/dist/tunnel/tunnel.protocol.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.js +0 -21
- package/dist/version.js.map +0 -1
package/bin/ankimcp.js
CHANGED
|
@@ -16,21 +16,12 @@ if (
|
|
|
16
16
|
process.exit(1);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
//
|
|
19
|
+
// Check if --stdio flag is present
|
|
20
20
|
const isStdioMode = process.argv.includes('--stdio');
|
|
21
|
-
const isTunnelMode = process.argv.some(arg =>
|
|
22
|
-
arg === '--tunnel' ||
|
|
23
|
-
arg.startsWith('--tunnel=') ||
|
|
24
|
-
arg === '--login' ||
|
|
25
|
-
arg === '--logout'
|
|
26
|
-
);
|
|
27
21
|
|
|
28
22
|
if (isStdioMode) {
|
|
29
23
|
// STDIO mode - for MCP clients like Cursor, Cline, Zed, etc.
|
|
30
24
|
require('../dist/main-stdio.js');
|
|
31
|
-
} else if (isTunnelMode) {
|
|
32
|
-
// Tunnel mode - for remote MCP access via tunnel service
|
|
33
|
-
require('../dist/main-tunnel.js');
|
|
34
25
|
} else {
|
|
35
26
|
// HTTP mode (default) - for web-based AI assistants
|
|
36
27
|
require('../dist/main-http.js');
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ConfigService } from "@nestjs/config";
|
|
2
|
+
import { IAnkiConfig } from "./mcp/config/anki-config.interface";
|
|
3
|
+
export declare class AnkiConfigService implements IAnkiConfig {
|
|
4
|
+
private configService;
|
|
5
|
+
constructor(configService: ConfigService);
|
|
6
|
+
get ankiConnectUrl(): string;
|
|
7
|
+
get ankiConnectApiVersion(): number;
|
|
8
|
+
get ankiConnectApiKey(): string | undefined;
|
|
9
|
+
get ankiConnectTimeout(): number;
|
|
10
|
+
get readOnly(): boolean;
|
|
11
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AnkiConfigService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const config_1 = require("@nestjs/config");
|
|
15
|
+
const mcpb_workarounds_1 = require("./mcp/utils/mcpb-workarounds");
|
|
16
|
+
let AnkiConfigService = class AnkiConfigService {
|
|
17
|
+
configService;
|
|
18
|
+
constructor(configService) {
|
|
19
|
+
this.configService = configService;
|
|
20
|
+
}
|
|
21
|
+
get ankiConnectUrl() {
|
|
22
|
+
return this.configService.get("ANKI_CONNECT_URL", "http://localhost:8765");
|
|
23
|
+
}
|
|
24
|
+
get ankiConnectApiVersion() {
|
|
25
|
+
const version = this.configService.get("ANKI_CONNECT_API_VERSION", "6");
|
|
26
|
+
return parseInt(version, 10);
|
|
27
|
+
}
|
|
28
|
+
get ankiConnectApiKey() {
|
|
29
|
+
const apiKey = this.configService.get("ANKI_CONNECT_API_KEY");
|
|
30
|
+
return (0, mcpb_workarounds_1.sanitizeMcpbConfigValue)(apiKey);
|
|
31
|
+
}
|
|
32
|
+
get ankiConnectTimeout() {
|
|
33
|
+
const timeout = this.configService.get("ANKI_CONNECT_TIMEOUT", "5000");
|
|
34
|
+
return parseInt(timeout, 10);
|
|
35
|
+
}
|
|
36
|
+
get readOnly() {
|
|
37
|
+
const readOnly = this.configService.get("READ_ONLY", "false");
|
|
38
|
+
return readOnly === "true" || readOnly === "1";
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.AnkiConfigService = AnkiConfigService;
|
|
42
|
+
exports.AnkiConfigService = AnkiConfigService = __decorate([
|
|
43
|
+
(0, common_1.Injectable)(),
|
|
44
|
+
__metadata("design:paramtypes", [config_1.ConfigService])
|
|
45
|
+
], AnkiConfigService);
|
|
46
|
+
//# sourceMappingURL=anki-config.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anki-config.service.js","sourceRoot":"","sources":["../src/anki-config.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,2CAA+C;AAE/C,mEAAuE;AAMhE,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IACR;IAApB,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAEpD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAC3B,kBAAkB,EAClB,uBAAuB,CACxB,CAAC;IACJ,CAAC;IAED,IAAI,qBAAqB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CACpC,0BAA0B,EAC1B,GAAG,CACJ,CAAC;QACF,OAAO,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,iBAAiB;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,sBAAsB,CAAC,CAAC;QACtE,OAAO,IAAA,0CAAuB,EAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,kBAAkB;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CACpC,sBAAsB,EACtB,MAAM,CACP,CAAC;QACF,OAAO,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,QAAQ;QACV,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,WAAW,EAAE,OAAO,CAAC,CAAC;QACtE,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,GAAG,CAAC;IACjD,CAAC;CACF,CAAA;AAnCY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;qCAEwB,sBAAa;GADrC,iBAAiB,CAmC7B"}
|
package/dist/app.module.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { DynamicModule } from "@nestjs/common";
|
|
2
|
-
import { ConfigInput, CliOverrides } from "./config";
|
|
3
2
|
export declare class AppModule {
|
|
4
|
-
static forStdio(
|
|
5
|
-
static forHttp(
|
|
6
|
-
static forTunnel(cliOverrides?: CliOverrides): DynamicModule;
|
|
3
|
+
static forStdio(): DynamicModule;
|
|
4
|
+
static forHttp(): DynamicModule;
|
|
7
5
|
}
|
package/dist/app.module.js
CHANGED
|
@@ -13,20 +13,17 @@ const config_1 = require("@nestjs/config");
|
|
|
13
13
|
const mcp_nest_1 = require("@rekog/mcp-nest");
|
|
14
14
|
const essential_1 = require("./mcp/primitives/essential");
|
|
15
15
|
const gui_1 = require("./mcp/primitives/gui");
|
|
16
|
-
const
|
|
17
|
-
const config_2 = require("./config");
|
|
16
|
+
const anki_config_service_1 = require("./anki-config.service");
|
|
18
17
|
const mcp_icons_1 = require("./mcp/mcp-icons");
|
|
19
|
-
const tunnel_mcp_service_1 = require("./tunnel/tunnel-mcp.service");
|
|
20
18
|
let AppModule = AppModule_1 = class AppModule {
|
|
21
|
-
static forStdio(
|
|
22
|
-
const validatedConfig = config_2.configSchema.parse((0, config_2.transformEnvToConfig)(configInput));
|
|
19
|
+
static forStdio() {
|
|
23
20
|
return {
|
|
24
21
|
module: AppModule_1,
|
|
25
22
|
imports: [
|
|
26
23
|
config_1.ConfigModule.forRoot({
|
|
27
24
|
isGlobal: true,
|
|
28
25
|
cache: true,
|
|
29
|
-
|
|
26
|
+
envFilePath: [".env.local", ".env"],
|
|
30
27
|
}),
|
|
31
28
|
mcp_nest_1.McpModule.forRoot({
|
|
32
29
|
name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
|
|
@@ -37,45 +34,27 @@ let AppModule = AppModule_1 = class AppModule {
|
|
|
37
34
|
essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
|
|
38
35
|
ankiConfigProvider: {
|
|
39
36
|
provide: essential_1.ANKI_CONFIG,
|
|
40
|
-
useClass:
|
|
41
|
-
},
|
|
42
|
-
appConfigProvider: {
|
|
43
|
-
provide: config_2.APP_CONFIG,
|
|
44
|
-
useValue: validatedConfig,
|
|
37
|
+
useClass: anki_config_service_1.AnkiConfigService,
|
|
45
38
|
},
|
|
46
39
|
}),
|
|
47
40
|
gui_1.McpPrimitivesAnkiGuiModule.forRoot({
|
|
48
41
|
ankiConfigProvider: {
|
|
49
42
|
provide: essential_1.ANKI_CONFIG,
|
|
50
|
-
useClass:
|
|
51
|
-
},
|
|
52
|
-
appConfigProvider: {
|
|
53
|
-
provide: config_2.APP_CONFIG,
|
|
54
|
-
useValue: validatedConfig,
|
|
43
|
+
useClass: anki_config_service_1.AnkiConfigService,
|
|
55
44
|
},
|
|
56
45
|
}),
|
|
57
46
|
],
|
|
58
|
-
providers: [
|
|
59
|
-
{
|
|
60
|
-
provide: config_2.APP_CONFIG,
|
|
61
|
-
useValue: validatedConfig,
|
|
62
|
-
},
|
|
63
|
-
app_config_service_1.AppConfigService,
|
|
64
|
-
...essential_1.ESSENTIAL_MCP_TOOLS,
|
|
65
|
-
...gui_1.GUI_MCP_TOOLS,
|
|
66
|
-
],
|
|
67
|
-
exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService],
|
|
47
|
+
providers: [anki_config_service_1.AnkiConfigService, ...essential_1.ESSENTIAL_MCP_TOOLS, ...gui_1.GUI_MCP_TOOLS],
|
|
68
48
|
};
|
|
69
49
|
}
|
|
70
|
-
static forHttp(
|
|
71
|
-
const validatedConfig = config_2.configSchema.parse((0, config_2.transformEnvToConfig)(configInput));
|
|
50
|
+
static forHttp() {
|
|
72
51
|
return {
|
|
73
52
|
module: AppModule_1,
|
|
74
53
|
imports: [
|
|
75
54
|
config_1.ConfigModule.forRoot({
|
|
76
55
|
isGlobal: true,
|
|
77
56
|
cache: true,
|
|
78
|
-
|
|
57
|
+
envFilePath: [".env.local", ".env"],
|
|
79
58
|
}),
|
|
80
59
|
mcp_nest_1.McpModule.forRoot({
|
|
81
60
|
name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
|
|
@@ -87,84 +66,17 @@ let AppModule = AppModule_1 = class AppModule {
|
|
|
87
66
|
essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
|
|
88
67
|
ankiConfigProvider: {
|
|
89
68
|
provide: essential_1.ANKI_CONFIG,
|
|
90
|
-
useClass:
|
|
91
|
-
},
|
|
92
|
-
appConfigProvider: {
|
|
93
|
-
provide: config_2.APP_CONFIG,
|
|
94
|
-
useValue: validatedConfig,
|
|
95
|
-
},
|
|
96
|
-
}),
|
|
97
|
-
gui_1.McpPrimitivesAnkiGuiModule.forRoot({
|
|
98
|
-
ankiConfigProvider: {
|
|
99
|
-
provide: essential_1.ANKI_CONFIG,
|
|
100
|
-
useClass: app_config_service_1.AppConfigService,
|
|
101
|
-
},
|
|
102
|
-
appConfigProvider: {
|
|
103
|
-
provide: config_2.APP_CONFIG,
|
|
104
|
-
useValue: validatedConfig,
|
|
105
|
-
},
|
|
106
|
-
}),
|
|
107
|
-
],
|
|
108
|
-
providers: [
|
|
109
|
-
{
|
|
110
|
-
provide: config_2.APP_CONFIG,
|
|
111
|
-
useValue: validatedConfig,
|
|
112
|
-
},
|
|
113
|
-
app_config_service_1.AppConfigService,
|
|
114
|
-
...essential_1.ESSENTIAL_MCP_TOOLS,
|
|
115
|
-
...gui_1.GUI_MCP_TOOLS,
|
|
116
|
-
],
|
|
117
|
-
exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService],
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
static forTunnel(cliOverrides) {
|
|
121
|
-
const validatedConfig = (0, config_2.loadValidatedConfig)(cliOverrides);
|
|
122
|
-
return {
|
|
123
|
-
module: AppModule_1,
|
|
124
|
-
imports: [
|
|
125
|
-
config_1.ConfigModule.forRoot({
|
|
126
|
-
isGlobal: true,
|
|
127
|
-
cache: true,
|
|
128
|
-
load: [() => validatedConfig],
|
|
129
|
-
}),
|
|
130
|
-
mcp_nest_1.McpModule.forRoot({
|
|
131
|
-
name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
|
|
132
|
-
version: process.env.MCP_SERVER_VERSION || "1.0.0",
|
|
133
|
-
transport: [],
|
|
134
|
-
icons: mcp_icons_1.MCP_ICONS,
|
|
135
|
-
}),
|
|
136
|
-
essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
|
|
137
|
-
ankiConfigProvider: {
|
|
138
|
-
provide: essential_1.ANKI_CONFIG,
|
|
139
|
-
useClass: app_config_service_1.AppConfigService,
|
|
140
|
-
},
|
|
141
|
-
appConfigProvider: {
|
|
142
|
-
provide: config_2.APP_CONFIG,
|
|
143
|
-
useValue: validatedConfig,
|
|
69
|
+
useClass: anki_config_service_1.AnkiConfigService,
|
|
144
70
|
},
|
|
145
71
|
}),
|
|
146
72
|
gui_1.McpPrimitivesAnkiGuiModule.forRoot({
|
|
147
73
|
ankiConfigProvider: {
|
|
148
74
|
provide: essential_1.ANKI_CONFIG,
|
|
149
|
-
useClass:
|
|
150
|
-
},
|
|
151
|
-
appConfigProvider: {
|
|
152
|
-
provide: config_2.APP_CONFIG,
|
|
153
|
-
useValue: validatedConfig,
|
|
75
|
+
useClass: anki_config_service_1.AnkiConfigService,
|
|
154
76
|
},
|
|
155
77
|
}),
|
|
156
78
|
],
|
|
157
|
-
providers: [
|
|
158
|
-
{
|
|
159
|
-
provide: config_2.APP_CONFIG,
|
|
160
|
-
useValue: validatedConfig,
|
|
161
|
-
},
|
|
162
|
-
app_config_service_1.AppConfigService,
|
|
163
|
-
tunnel_mcp_service_1.TunnelMcpService,
|
|
164
|
-
...essential_1.ESSENTIAL_MCP_TOOLS,
|
|
165
|
-
...gui_1.GUI_MCP_TOOLS,
|
|
166
|
-
],
|
|
167
|
-
exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService, tunnel_mcp_service_1.TunnelMcpService],
|
|
79
|
+
providers: [anki_config_service_1.AnkiConfigService, ...essential_1.ESSENTIAL_MCP_TOOLS, ...gui_1.GUI_MCP_TOOLS],
|
|
168
80
|
};
|
|
169
81
|
}
|
|
170
82
|
};
|
package/dist/app.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,2CAA8C;AAC9C,8CAA8D;AAC9D,0DAIoC;AACpC,8CAG8B;AAC9B
|
|
1
|
+
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,2CAA8C;AAC9C,8CAA8D;AAC9D,0DAIoC;AACpC,8CAG8B;AAC9B,+DAA0D;AAC1D,+CAA4C;AAGrC,IAAM,SAAS,iBAAf,MAAM,SAAS;IAIpB,MAAM,CAAC,QAAQ;QACb,OAAO;YACL,MAAM,EAAE,WAAS;YACjB,OAAO,EAAE;gBAEP,qBAAY,CAAC,OAAO,CAAC;oBACnB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,IAAI;oBACX,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC;iBACpC,CAAC;gBAGF,oBAAS,CAAC,OAAO,CAAC;oBAChB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,iBAAiB;oBACtD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO;oBAClD,SAAS,EAAE,2BAAgB,CAAC,KAAK;oBACjC,KAAK,EAAE,qBAAS;iBACjB,CAAC;gBAGF,4CAAgC,CAAC,OAAO,CAAC;oBACvC,kBAAkB,EAAE;wBAClB,OAAO,EAAE,uBAAW;wBACpB,QAAQ,EAAE,uCAAiB;qBAC5B;iBACF,CAAC;gBAGF,gCAA0B,CAAC,OAAO,CAAC;oBACjC,kBAAkB,EAAE;wBAClB,OAAO,EAAE,uBAAW;wBACpB,QAAQ,EAAE,uCAAiB;qBAC5B;iBACF,CAAC;aACH;YAED,SAAS,EAAE,CAAC,uCAAiB,EAAE,GAAG,+BAAmB,EAAE,GAAG,mBAAa,CAAC;SACzE,CAAC;IACJ,CAAC;IAKD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,MAAM,EAAE,WAAS;YACjB,OAAO,EAAE;gBAEP,qBAAY,CAAC,OAAO,CAAC;oBACnB,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,IAAI;oBACX,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC;iBACpC,CAAC;gBAGF,oBAAS,CAAC,OAAO,CAAC;oBAChB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,iBAAiB;oBACtD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO;oBAClD,SAAS,EAAE,2BAAgB,CAAC,eAAe;oBAC3C,WAAW,EAAE,GAAG;oBAChB,KAAK,EAAE,qBAAS;iBACjB,CAAC;gBAGF,4CAAgC,CAAC,OAAO,CAAC;oBACvC,kBAAkB,EAAE;wBAClB,OAAO,EAAE,uBAAW;wBACpB,QAAQ,EAAE,uCAAiB;qBAC5B;iBACF,CAAC;gBAGF,gCAA0B,CAAC,OAAO,CAAC;oBACjC,kBAAkB,EAAE;wBAClB,OAAO,EAAE,uBAAW;wBACpB,QAAQ,EAAE,uCAAiB;qBAC5B;iBACF,CAAC;aACH;YAED,SAAS,EAAE,CAAC,uCAAiB,EAAE,GAAG,+BAAmB,EAAE,GAAG,mBAAa,CAAC;SACzE,CAAC;IACJ,CAAC;CACF,CAAA;AAvFY,8BAAS;oBAAT,SAAS;IADrB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,SAAS,CAuFrB"}
|
package/dist/bootstrap.d.ts
CHANGED
|
@@ -1,8 +1,3 @@
|
|
|
1
1
|
import { LoggerService } from "@nestjs/common";
|
|
2
|
-
export declare
|
|
3
|
-
readonly STDOUT: 1;
|
|
4
|
-
readonly STDERR: 2;
|
|
5
|
-
};
|
|
6
|
-
export type LogDestination = (typeof LOG_DESTINATION)[keyof typeof LOG_DESTINATION];
|
|
7
|
-
export declare function createPinoLogger(destination: LogDestination, logLevel?: string): import("pino").Logger<never, boolean>;
|
|
2
|
+
export declare function createPinoLogger(destination: 1 | 2): import("pino").Logger<never, boolean>;
|
|
8
3
|
export declare function createLoggerService(pinoLogger: any): LoggerService;
|
package/dist/bootstrap.js
CHANGED
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.LOG_DESTINATION = void 0;
|
|
4
3
|
exports.createPinoLogger = createPinoLogger;
|
|
5
4
|
exports.createLoggerService = createLoggerService;
|
|
6
5
|
const pino_1 = require("pino");
|
|
7
|
-
|
|
8
|
-
STDOUT: 1,
|
|
9
|
-
STDERR: 2,
|
|
10
|
-
};
|
|
11
|
-
function createPinoLogger(destination, logLevel = "info") {
|
|
6
|
+
function createPinoLogger(destination) {
|
|
12
7
|
return (0, pino_1.pino)({
|
|
13
|
-
level:
|
|
8
|
+
level: process.env.LOG_LEVEL || "info",
|
|
14
9
|
transport: {
|
|
15
10
|
target: "pino-pretty",
|
|
16
11
|
options: {
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":";;AASA,4CAaC;AAQD,kDAkBC;AA/CD,+BAA4B;AAQ5B,SAAgB,gBAAgB,CAAC,WAAkB;IACjD,OAAO,IAAA,WAAI,EAAC;QACV,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;QACtC,SAAS,EAAE;YACT,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,WAAW;gBACX,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,YAAY;gBAC3B,MAAM,EAAE,cAAc;aACvB;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAQD,SAAgB,mBAAmB,CAAC,UAAe;IACjD,OAAO;QACL,GAAG,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YACtC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,EAAE,CAAC,OAAY,EAAE,KAAc,EAAE,OAAgB,EAAE,EAAE;YACxD,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YACvC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YACxC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,CAAC,OAAY,EAAE,OAAgB,EAAE,EAAE;YAC1C,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -4,10 +4,6 @@ export interface CliOptions {
|
|
|
4
4
|
ankiConnect: string;
|
|
5
5
|
ngrok: boolean;
|
|
6
6
|
readOnly: boolean;
|
|
7
|
-
login: string | boolean;
|
|
8
|
-
logout: boolean;
|
|
9
|
-
tunnel: string | boolean;
|
|
10
|
-
debug: boolean;
|
|
11
7
|
}
|
|
12
8
|
export declare function checkForUpdates(): void;
|
|
13
9
|
export declare function parseCliArgs(): CliOptions;
|
package/dist/cli.js
CHANGED
|
@@ -10,8 +10,6 @@ const commander_1 = require("commander");
|
|
|
10
10
|
const fs_1 = require("fs");
|
|
11
11
|
const path_1 = require("path");
|
|
12
12
|
const update_notifier_1 = __importDefault(require("update-notifier"));
|
|
13
|
-
const cli_output_1 = require("./cli/cli-output");
|
|
14
|
-
const version_1 = require("./version");
|
|
15
13
|
function getPackageJson() {
|
|
16
14
|
try {
|
|
17
15
|
return JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, "../package.json"), "utf-8"));
|
|
@@ -20,6 +18,9 @@ function getPackageJson() {
|
|
|
20
18
|
return { version: "0.0.0", name: "ankimcp" };
|
|
21
19
|
}
|
|
22
20
|
}
|
|
21
|
+
function getVersion() {
|
|
22
|
+
return getPackageJson().version;
|
|
23
|
+
}
|
|
23
24
|
function checkForUpdates() {
|
|
24
25
|
(0, update_notifier_1.default)({ pkg: getPackageJson() }).notify();
|
|
25
26
|
}
|
|
@@ -28,17 +29,13 @@ function parseCliArgs() {
|
|
|
28
29
|
program
|
|
29
30
|
.name("ankimcp")
|
|
30
31
|
.description("AnkiMCP Server - Model Context Protocol server for Anki")
|
|
31
|
-
.version(
|
|
32
|
+
.version(getVersion())
|
|
32
33
|
.option("--stdio", "Run in STDIO mode (for MCP clients like Cursor, Cline, Zed)")
|
|
33
34
|
.option("-p, --port <number>", "Port to listen on (HTTP mode)", "3000")
|
|
34
35
|
.option("-h, --host <address>", "Host to bind to (HTTP mode)", "127.0.0.1")
|
|
35
36
|
.option("-a, --anki-connect <url>", "AnkiConnect URL", "http://localhost:8765")
|
|
36
37
|
.option("--ngrok", "Start ngrok tunnel (requires global ngrok installation)")
|
|
37
38
|
.option("--read-only", "Run in read-only mode (blocks all write operations)")
|
|
38
|
-
.option("--login [url]", "Authenticate with tunnel service")
|
|
39
|
-
.option("--logout", "Clear tunnel credentials")
|
|
40
|
-
.option("--tunnel [url]", "Connect to tunnel server (default: ws://localhost:3004/tunnel)")
|
|
41
|
-
.option("-d, --debug", "Enable debug logging (shows stack traces)")
|
|
42
39
|
.addHelpText("after", `
|
|
43
40
|
Transport Modes:
|
|
44
41
|
HTTP Mode (default): For web-based AI assistants (ChatGPT, Claude.ai)
|
|
@@ -77,13 +74,6 @@ Ngrok Setup (one-time):
|
|
|
77
74
|
2. Get auth token from: https://dashboard.ngrok.com/get-started/your-authtoken
|
|
78
75
|
3. Setup: ngrok config add-authtoken <your-token>
|
|
79
76
|
4. Run: ankimcp --ngrok
|
|
80
|
-
|
|
81
|
-
Tunnel Mode:
|
|
82
|
-
$ ankimcp --login # Login to default tunnel service
|
|
83
|
-
$ ankimcp --login wss://custom.server.com/tunnel # Login to custom server
|
|
84
|
-
$ ankimcp --logout # Clear saved credentials
|
|
85
|
-
$ ankimcp --tunnel # Connect to localhost:3004
|
|
86
|
-
$ ankimcp --tunnel wss://tunnel.ankimcp.ai/tunnel # Production tunnel
|
|
87
77
|
`);
|
|
88
78
|
program.parse();
|
|
89
79
|
const options = program.opts();
|
|
@@ -93,21 +83,17 @@ Tunnel Mode:
|
|
|
93
83
|
ankiConnect: options.ankiConnect,
|
|
94
84
|
ngrok: options.ngrok || false,
|
|
95
85
|
readOnly: options.readOnly || false,
|
|
96
|
-
login: options.login ?? false,
|
|
97
|
-
logout: options.logout || false,
|
|
98
|
-
tunnel: options.tunnel ?? false,
|
|
99
|
-
debug: options.debug || false,
|
|
100
86
|
};
|
|
101
87
|
}
|
|
102
88
|
function displayStartupBanner(options, ngrokUrl) {
|
|
103
|
-
const version =
|
|
89
|
+
const version = getVersion();
|
|
104
90
|
const title = `AnkiMCP HTTP Server v${version}`;
|
|
105
91
|
const padding = Math.floor((64 - title.length) / 2);
|
|
106
92
|
const paddedTitle = " ".repeat(padding) + title + " ".repeat(64 - padding - title.length);
|
|
107
93
|
const readOnlyWarning = options.readOnly
|
|
108
94
|
? "\n\n** READ-ONLY MODE ENABLED **\nContent modifications (addNote, deleteNotes, createDeck, etc.) are blocked.\nReview operations (sync, answerCards, suspend) remain available."
|
|
109
95
|
: "";
|
|
110
|
-
|
|
96
|
+
console.log(`
|
|
111
97
|
╔════════════════════════════════════════════════════════════════╗
|
|
112
98
|
║${paddedTitle}║
|
|
113
99
|
╚════════════════════════════════════════════════════════════════╝${readOnlyWarning}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,12 +8,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
|
-
var OriginValidationGuard_1;
|
|
12
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
12
|
exports.OriginValidationGuard = void 0;
|
|
14
13
|
const common_1 = require("@nestjs/common");
|
|
15
|
-
let OriginValidationGuard =
|
|
16
|
-
logger = new common_1.Logger(OriginValidationGuard_1.name);
|
|
14
|
+
let OriginValidationGuard = class OriginValidationGuard {
|
|
17
15
|
allowedOrigins;
|
|
18
16
|
constructor() {
|
|
19
17
|
const defaultOrigins = "http://localhost:*,http://127.0.0.1:*,https://localhost:*,https://127.0.0.1:*";
|
|
@@ -28,7 +26,7 @@ let OriginValidationGuard = OriginValidationGuard_1 = class OriginValidationGuar
|
|
|
28
26
|
}
|
|
29
27
|
const isAllowed = this.allowedOrigins.some((allowedOrigin) => this.matchesPattern(origin, allowedOrigin));
|
|
30
28
|
if (!isAllowed) {
|
|
31
|
-
|
|
29
|
+
console.warn(`[OriginValidationGuard] Rejected request from unauthorized origin: ${origin}`);
|
|
32
30
|
}
|
|
33
31
|
return isAllowed;
|
|
34
32
|
}
|
|
@@ -47,7 +45,7 @@ let OriginValidationGuard = OriginValidationGuard_1 = class OriginValidationGuar
|
|
|
47
45
|
}
|
|
48
46
|
};
|
|
49
47
|
exports.OriginValidationGuard = OriginValidationGuard;
|
|
50
|
-
exports.OriginValidationGuard = OriginValidationGuard =
|
|
48
|
+
exports.OriginValidationGuard = OriginValidationGuard = __decorate([
|
|
51
49
|
(0, common_1.Injectable)(),
|
|
52
50
|
__metadata("design:paramtypes", [])
|
|
53
51
|
], OriginValidationGuard);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"origin-validation.guard.js","sourceRoot":"","sources":["../../../src/http/guards/origin-validation.guard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"origin-validation.guard.js","sourceRoot":"","sources":["../../../src/http/guards/origin-validation.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA2E;AAiBpE,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACf,cAAc,CAAW;IAE1C;QACE,MAAM,cAAc,GAClB,+EAA+E,CAAC;QAClF,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,cAAc,CAAC;QACjE,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,WAAW,CAAC,OAAyB;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAGjE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAC3D,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,CAC3C,CAAC;QAEF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,sEAAsE,MAAM,EAAE,CAC/E,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IASO,cAAc,CAAC,MAAc,EAAE,OAAe;QAEpD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,YAAY,GAAG,OAAO;iBACzB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;iBACrB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AAzDY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;;GACA,qBAAqB,CAyDjC"}
|
package/dist/main-http.js
CHANGED
|
@@ -5,25 +5,17 @@ const app_module_1 = require("./app.module");
|
|
|
5
5
|
const bootstrap_1 = require("./bootstrap");
|
|
6
6
|
const origin_validation_guard_1 = require("./http/guards/origin-validation.guard");
|
|
7
7
|
const cli_1 = require("./cli");
|
|
8
|
-
const cli_output_1 = require("./cli/cli-output");
|
|
9
8
|
const ngrok_service_1 = require("./services/ngrok.service");
|
|
10
|
-
const config_1 = require("./config");
|
|
11
9
|
async function bootstrap() {
|
|
12
10
|
(0, cli_1.checkForUpdates)();
|
|
13
11
|
const options = (0, cli_1.parseCliArgs)();
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
readOnly: options.readOnly,
|
|
20
|
-
tunnel: options.tunnel,
|
|
21
|
-
ngrok: options.ngrok,
|
|
22
|
-
debug: options.debug,
|
|
23
|
-
});
|
|
24
|
-
const pinoLogger = (0, bootstrap_1.createPinoLogger)(bootstrap_1.LOG_DESTINATION.STDOUT, configInput.LOG_LEVEL || "info");
|
|
12
|
+
process.env.PORT = options.port.toString();
|
|
13
|
+
process.env.HOST = options.host;
|
|
14
|
+
process.env.ANKI_CONNECT_URL = options.ankiConnect;
|
|
15
|
+
process.env.READ_ONLY = options.readOnly ? "true" : "false";
|
|
16
|
+
const pinoLogger = (0, bootstrap_1.createPinoLogger)(1);
|
|
25
17
|
const loggerService = (0, bootstrap_1.createLoggerService)(pinoLogger);
|
|
26
|
-
const app = await core_1.NestFactory.create(app_module_1.AppModule.forHttp(
|
|
18
|
+
const app = await core_1.NestFactory.create(app_module_1.AppModule.forHttp(), {
|
|
27
19
|
logger: loggerService,
|
|
28
20
|
bufferLogs: true,
|
|
29
21
|
});
|
|
@@ -37,17 +29,15 @@ async function bootstrap() {
|
|
|
37
29
|
ngrokUrl = tunnelInfo.publicUrl;
|
|
38
30
|
}
|
|
39
31
|
catch (err) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
cli_output_1.cli.info("Server is still running locally without tunnel.");
|
|
44
|
-
cli_output_1.cli.blank();
|
|
32
|
+
console.error("\n❌ Failed to start ngrok:");
|
|
33
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
34
|
+
console.error("\nServer is still running locally without tunnel.\n");
|
|
45
35
|
}
|
|
46
36
|
}
|
|
47
37
|
(0, cli_1.displayStartupBanner)(options, ngrokUrl);
|
|
48
38
|
}
|
|
49
39
|
bootstrap().catch((err) => {
|
|
50
|
-
|
|
40
|
+
console.error("Failed to start MCP HTTP server:", err);
|
|
51
41
|
process.exit(1);
|
|
52
42
|
});
|
|
53
43
|
//# sourceMappingURL=main-http.js.map
|
package/dist/main-http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main-http.js","sourceRoot":"","sources":["../src/main-http.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;AACzC,
|
|
1
|
+
{"version":3,"file":"main-http.js","sourceRoot":"","sources":["../src/main-http.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;AACzC,2CAAoE;AACpE,mFAA8E;AAC9E,+BAA4E;AAC5E,4DAAwD;AAExD,KAAK,UAAU,SAAS;IAEtB,IAAA,qBAAe,GAAE,CAAC;IAElB,MAAM,OAAO,GAAG,IAAA,kBAAY,GAAE,CAAC;IAG/B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAG5D,MAAM,UAAU,GAAG,IAAA,4BAAgB,EAAC,CAAC,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,IAAA,+BAAmB,EAAC,UAAU,CAAC,CAAC;IAGtD,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,OAAO,EAAE,EAAE;QACxD,MAAM,EAAE,aAAa;QACrB,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAGH,GAAG,CAAC,eAAe,CAAC,IAAI,+CAAqB,EAAE,CAAC,CAAC;IAEjD,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAG7C,IAAI,QAA4B,CAAC;IACjC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,4BAAY,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1D,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAGD,IAAA,0BAAoB,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/main-stdio.js
CHANGED
|
@@ -3,8 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const core_1 = require("@nestjs/core");
|
|
4
4
|
const app_module_1 = require("./app.module");
|
|
5
5
|
const bootstrap_1 = require("./bootstrap");
|
|
6
|
-
const cli_output_1 = require("./cli/cli-output");
|
|
7
|
-
const config_1 = require("./config");
|
|
8
6
|
function parseStdioArgs() {
|
|
9
7
|
const args = process.argv.slice(2);
|
|
10
8
|
let readOnly = false;
|
|
@@ -22,13 +20,15 @@ function parseStdioArgs() {
|
|
|
22
20
|
}
|
|
23
21
|
async function bootstrap() {
|
|
24
22
|
const cliOptions = parseStdioArgs();
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
if (cliOptions.readOnly) {
|
|
24
|
+
process.env.READ_ONLY = "true";
|
|
25
|
+
}
|
|
26
|
+
if (cliOptions.ankiConnect) {
|
|
27
|
+
process.env.ANKI_CONNECT_URL = cliOptions.ankiConnect;
|
|
28
|
+
}
|
|
29
|
+
const pinoLogger = (0, bootstrap_1.createPinoLogger)(2);
|
|
30
30
|
const loggerService = (0, bootstrap_1.createLoggerService)(pinoLogger);
|
|
31
|
-
await core_1.NestFactory.createApplicationContext(app_module_1.AppModule.forStdio(
|
|
31
|
+
await core_1.NestFactory.createApplicationContext(app_module_1.AppModule.forStdio(), {
|
|
32
32
|
logger: loggerService,
|
|
33
33
|
bufferLogs: true,
|
|
34
34
|
});
|
|
@@ -41,7 +41,7 @@ async function bootstrap() {
|
|
|
41
41
|
await new Promise(() => { });
|
|
42
42
|
}
|
|
43
43
|
bootstrap().catch((err) => {
|
|
44
|
-
|
|
44
|
+
console.error("Failed to start MCP STDIO server:", err);
|
|
45
45
|
process.exit(1);
|
|
46
46
|
});
|
|
47
47
|
//# sourceMappingURL=main-stdio.js.map
|
package/dist/main-stdio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main-stdio.js","sourceRoot":"","sources":["../src/main-stdio.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;AACzC,
|
|
1
|
+
{"version":3,"file":"main-stdio.js","sourceRoot":"","sources":["../src/main-stdio.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;AACzC,2CAAoE;AAMpE,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,WAA+B,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC;YAC9B,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,WAAW,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,SAAS;IAEtB,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAGpC,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;IACjC,CAAC;IACD,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,UAAU,CAAC,WAAW,CAAC;IACxD,CAAC;IAGD,MAAM,UAAU,GAAG,IAAA,4BAAgB,EAAC,CAAC,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,IAAA,+BAAmB,EAAC,UAAU,CAAC,CAAC;IAGtD,MAAM,kBAAW,CAAC,wBAAwB,CAAC,sBAAS,CAAC,QAAQ,EAAE,EAAE;QAC/D,MAAM,EAAE,aAAa;QACrB,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,UAAU,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAGD,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -75,7 +75,6 @@ import { SystemInfoResource } from "./resources/system-info.resource";
|
|
|
75
75
|
export declare const ESSENTIAL_MCP_TOOLS: (typeof SyncTool | typeof GetDueCardsTool | typeof GetCardsTool | typeof PresentCardTool | typeof RateCardTool | typeof ModelNamesTool | typeof ModelFieldNamesTool | typeof ModelStylingTool | typeof CreateModelTool | typeof UpdateModelStylingTool | typeof AddNoteTool | typeof AddNotesTool | typeof FindNotesTool | typeof NotesInfoTool | typeof UpdateNoteFieldsTool | typeof DeleteNotesTool | typeof GetTagsTool | typeof ListDecksTool | typeof DeckStatsTool | typeof CreateDeckTool | typeof ChangeDeckTool | typeof RetrieveMediaFileTool | typeof GetMediaFilesNamesTool | typeof StoreMediaFileTool | typeof DeleteMediaFileTool | typeof AddTagsTool | typeof RemoveTagsTool | typeof ReplaceTagsTool | typeof ClearUnusedTagsTool | typeof CollectionStatsTool | typeof ReviewStatsTool | typeof ReviewSessionPrompt | typeof TwentyRulesPrompt | typeof SystemInfoResource)[];
|
|
76
76
|
export interface McpPrimitivesAnkiEssentialModuleOptions {
|
|
77
77
|
ankiConfigProvider: Provider;
|
|
78
|
-
appConfigProvider?: Provider;
|
|
79
78
|
}
|
|
80
79
|
export declare class McpPrimitivesAnkiEssentialModule {
|
|
81
80
|
static forRoot(options: McpPrimitivesAnkiEssentialModuleOptions): DynamicModule;
|
|
@@ -173,16 +173,9 @@ exports.ESSENTIAL_MCP_TOOLS = [
|
|
|
173
173
|
const ESSENTIAL_MCP_PRIMITIVES = [anki_connect_client_2.AnkiConnectClient, ...exports.ESSENTIAL_MCP_TOOLS];
|
|
174
174
|
let McpPrimitivesAnkiEssentialModule = McpPrimitivesAnkiEssentialModule_1 = class McpPrimitivesAnkiEssentialModule {
|
|
175
175
|
static forRoot(options) {
|
|
176
|
-
const providers = [
|
|
177
|
-
options.ankiConfigProvider,
|
|
178
|
-
...ESSENTIAL_MCP_PRIMITIVES,
|
|
179
|
-
];
|
|
180
|
-
if (options.appConfigProvider) {
|
|
181
|
-
providers.push(options.appConfigProvider);
|
|
182
|
-
}
|
|
183
176
|
return {
|
|
184
177
|
module: McpPrimitivesAnkiEssentialModule_1,
|
|
185
|
-
providers,
|
|
178
|
+
providers: [options.ankiConfigProvider, ...ESSENTIAL_MCP_PRIMITIVES],
|
|
186
179
|
exports: ESSENTIAL_MCP_PRIMITIVES,
|
|
187
180
|
};
|
|
188
181
|
}
|