@ankimcp/anki-mcp-server 0.18.3 → 0.18.4-tunnel
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 +10 -1
- package/dist/app-config.service.d.ts +22 -0
- package/dist/app-config.service.js +79 -0
- package/dist/app-config.service.js.map +1 -0
- package/dist/app.module.d.ts +4 -2
- package/dist/app.module.js +99 -11
- package/dist/app.module.js.map +1 -1
- package/dist/bootstrap.d.ts +6 -1
- package/dist/bootstrap.js +7 -2
- package/dist/bootstrap.js.map +1 -1
- package/dist/cli/__tests__/cli-output.manual.d.ts +2 -0
- package/dist/cli/__tests__/cli-output.manual.js +13 -0
- package/dist/cli/__tests__/cli-output.manual.js.map +1 -0
- package/dist/cli/cli-output.d.ts +20 -0
- package/dist/cli/cli-output.js +69 -0
- package/dist/cli/cli-output.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +18 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +20 -6
- package/dist/cli.js.map +1 -1
- package/dist/config/config.factory.d.ts +13 -0
- package/dist/config/config.factory.js +32 -0
- package/dist/config/config.factory.js.map +1 -0
- package/dist/config/config.schema.d.ts +33 -0
- package/dist/config/config.schema.js +58 -0
- package/dist/config/config.schema.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.js +11 -0
- package/dist/config/index.js.map +1 -0
- package/dist/http/guards/origin-validation.guard.d.ts +1 -0
- package/dist/http/guards/origin-validation.guard.js +5 -3
- package/dist/http/guards/origin-validation.guard.js.map +1 -1
- package/dist/main-http.js +20 -10
- 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/main-tunnel.d.ts +1 -0
- package/dist/main-tunnel.js +26 -0
- package/dist/main-tunnel.js.map +1 -0
- package/dist/mcp/primitives/essential/index.d.ts +1 -0
- package/dist/mcp/primitives/essential/index.js +8 -1
- 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 +1 -0
- package/dist/mcp/primitives/gui/index.js +8 -1
- package/dist/mcp/primitives/gui/index.js.map +1 -1
- package/dist/services/ngrok.service.d.ts +1 -0
- package/dist/services/ngrok.service.js +5 -3
- package/dist/services/ngrok.service.js.map +1 -1
- package/dist/test-fixtures/mock-data.d.ts +8 -0
- package/dist/test-fixtures/mock-data.js +8 -0
- package/dist/test-fixtures/mock-data.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/tunnel/commands/index.d.ts +3 -0
- package/dist/tunnel/commands/index.js +10 -0
- package/dist/tunnel/commands/index.js.map +1 -0
- package/dist/tunnel/commands/login.command.d.ts +1 -0
- package/dist/tunnel/commands/login.command.js +108 -0
- package/dist/tunnel/commands/login.command.js.map +1 -0
- package/dist/tunnel/commands/logout.command.d.ts +1 -0
- package/dist/tunnel/commands/logout.command.js +26 -0
- package/dist/tunnel/commands/logout.command.js.map +1 -0
- package/dist/tunnel/commands/tunnel.command.d.ts +1 -0
- package/dist/tunnel/commands/tunnel.command.js +185 -0
- package/dist/tunnel/commands/tunnel.command.js.map +1 -0
- package/dist/tunnel/credentials.service.d.ts +23 -0
- package/dist/tunnel/credentials.service.js +152 -0
- package/dist/tunnel/credentials.service.js.map +1 -0
- package/dist/tunnel/device-flow.service.d.ts +46 -0
- package/dist/tunnel/device-flow.service.js +237 -0
- package/dist/tunnel/device-flow.service.js.map +1 -0
- package/dist/tunnel/in-memory.transport.d.ts +14 -0
- package/dist/tunnel/in-memory.transport.js +63 -0
- package/dist/tunnel/in-memory.transport.js.map +1 -0
- package/dist/tunnel/index.d.ts +6 -0
- package/dist/tunnel/index.js +31 -0
- package/dist/tunnel/index.js.map +1 -0
- package/dist/tunnel/tunnel-mcp.service.d.ts +15 -0
- package/dist/tunnel/tunnel-mcp.service.js +100 -0
- package/dist/tunnel/tunnel-mcp.service.js.map +1 -0
- package/dist/tunnel/tunnel.client.d.ts +60 -0
- package/dist/tunnel/tunnel.client.js +386 -0
- package/dist/tunnel/tunnel.client.js.map +1 -0
- package/dist/tunnel/tunnel.protocol.d.ts +68 -0
- package/dist/tunnel/tunnel.protocol.js +26 -0
- package/dist/tunnel/tunnel.protocol.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +21 -0
- package/dist/version.js.map +1 -0
- package/package.json +7 -2
- package/dist/anki-config.service.d.ts +0 -11
- package/dist/anki-config.service.js +0 -46
- package/dist/anki-config.service.js.map +0 -1
package/bin/ankimcp.js
CHANGED
|
@@ -16,12 +16,21 @@ if (
|
|
|
16
16
|
process.exit(1);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
//
|
|
19
|
+
// Determine mode based on CLI flags
|
|
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
|
+
);
|
|
21
27
|
|
|
22
28
|
if (isStdioMode) {
|
|
23
29
|
// STDIO mode - for MCP clients like Cursor, Cline, Zed, etc.
|
|
24
30
|
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');
|
|
25
34
|
} else {
|
|
26
35
|
// HTTP mode (default) - for web-based AI assistants
|
|
27
36
|
require('../dist/main-http.js');
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { IAnkiConfig } from "./mcp/config/anki-config.interface";
|
|
2
|
+
import type { AppConfig } from "./config";
|
|
3
|
+
export declare class AppConfigService implements IAnkiConfig {
|
|
4
|
+
private readonly config;
|
|
5
|
+
constructor(config: AppConfig);
|
|
6
|
+
get port(): number;
|
|
7
|
+
get host(): string;
|
|
8
|
+
get nodeEnv(): "development" | "production" | "test";
|
|
9
|
+
get isDevelopment(): boolean;
|
|
10
|
+
get isProduction(): boolean;
|
|
11
|
+
get isTest(): boolean;
|
|
12
|
+
get ankiConnectUrl(): string;
|
|
13
|
+
get ankiConnectApiVersion(): number;
|
|
14
|
+
get ankiConnectApiKey(): string | undefined;
|
|
15
|
+
get ankiConnectTimeout(): number;
|
|
16
|
+
get readOnly(): boolean;
|
|
17
|
+
get authUrl(): string;
|
|
18
|
+
get authRealm(): string;
|
|
19
|
+
get authClientId(): string;
|
|
20
|
+
get tunnelServerUrl(): string;
|
|
21
|
+
get logLevel(): "debug" | "info" | "warn" | "error";
|
|
22
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
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 __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.AppConfigService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const config_1 = require("./config");
|
|
18
|
+
const mcpb_workarounds_1 = require("./mcp/utils/mcpb-workarounds");
|
|
19
|
+
let AppConfigService = class AppConfigService {
|
|
20
|
+
config;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.config = config;
|
|
23
|
+
}
|
|
24
|
+
get port() {
|
|
25
|
+
return this.config.port;
|
|
26
|
+
}
|
|
27
|
+
get host() {
|
|
28
|
+
return this.config.host;
|
|
29
|
+
}
|
|
30
|
+
get nodeEnv() {
|
|
31
|
+
return this.config.nodeEnv;
|
|
32
|
+
}
|
|
33
|
+
get isDevelopment() {
|
|
34
|
+
return this.nodeEnv === "development";
|
|
35
|
+
}
|
|
36
|
+
get isProduction() {
|
|
37
|
+
return this.nodeEnv === "production";
|
|
38
|
+
}
|
|
39
|
+
get isTest() {
|
|
40
|
+
return this.nodeEnv === "test";
|
|
41
|
+
}
|
|
42
|
+
get ankiConnectUrl() {
|
|
43
|
+
return this.config.ankiConnect.url;
|
|
44
|
+
}
|
|
45
|
+
get ankiConnectApiVersion() {
|
|
46
|
+
return this.config.ankiConnect.apiVersion;
|
|
47
|
+
}
|
|
48
|
+
get ankiConnectApiKey() {
|
|
49
|
+
return (0, mcpb_workarounds_1.sanitizeMcpbConfigValue)(this.config.ankiConnect.apiKey);
|
|
50
|
+
}
|
|
51
|
+
get ankiConnectTimeout() {
|
|
52
|
+
return this.config.ankiConnect.timeout;
|
|
53
|
+
}
|
|
54
|
+
get readOnly() {
|
|
55
|
+
return this.config.readOnly;
|
|
56
|
+
}
|
|
57
|
+
get authUrl() {
|
|
58
|
+
return this.config.auth.url;
|
|
59
|
+
}
|
|
60
|
+
get authRealm() {
|
|
61
|
+
return this.config.auth.realm;
|
|
62
|
+
}
|
|
63
|
+
get authClientId() {
|
|
64
|
+
return this.config.auth.clientId;
|
|
65
|
+
}
|
|
66
|
+
get tunnelServerUrl() {
|
|
67
|
+
return this.config.tunnel.serverUrl;
|
|
68
|
+
}
|
|
69
|
+
get logLevel() {
|
|
70
|
+
return this.config.logLevel;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
exports.AppConfigService = AppConfigService;
|
|
74
|
+
exports.AppConfigService = AppConfigService = __decorate([
|
|
75
|
+
(0, common_1.Injectable)(),
|
|
76
|
+
__param(0, (0, common_1.Inject)(config_1.APP_CONFIG)),
|
|
77
|
+
__metadata("design:paramtypes", [Object])
|
|
78
|
+
], AppConfigService);
|
|
79
|
+
//# sourceMappingURL=app-config.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-config.service.js","sourceRoot":"","sources":["../src/app-config.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AAEpD,qCAAsC;AAEtC,mEAAuE;AAOhE,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACsB;IAAjD,YAAiD,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;IAAG,CAAC;IAItE,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,OAAO,KAAK,aAAa,CAAC;IACxC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,OAAO,KAAK,YAAY,CAAC;IACvC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC;IACjC,CAAC;IAID,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;IACrC,CAAC;IAED,IAAI,qBAAqB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC;IAC5C,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAA,0CAAuB,EAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;IACzC,CAAC;IAID,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAID,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IAChC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;IACnC,CAAC;IAID,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;IACtC,CAAC;IAID,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC9B,CAAC;CACF,CAAA;AA9EY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAEE,WAAA,IAAA,eAAM,EAAC,mBAAU,CAAC,CAAA;;GADpB,gBAAgB,CA8E5B"}
|
package/dist/app.module.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { DynamicModule } from "@nestjs/common";
|
|
2
|
+
import { ConfigInput, CliOverrides } from "./config";
|
|
2
3
|
export declare class AppModule {
|
|
3
|
-
static forStdio(): DynamicModule;
|
|
4
|
-
static forHttp(): DynamicModule;
|
|
4
|
+
static forStdio(configInput: ConfigInput): DynamicModule;
|
|
5
|
+
static forHttp(configInput: ConfigInput): DynamicModule;
|
|
6
|
+
static forTunnel(cliOverrides?: CliOverrides): DynamicModule;
|
|
5
7
|
}
|
package/dist/app.module.js
CHANGED
|
@@ -13,17 +13,20 @@ 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
|
|
16
|
+
const app_config_service_1 = require("./app-config.service");
|
|
17
|
+
const config_2 = require("./config");
|
|
17
18
|
const mcp_icons_1 = require("./mcp/mcp-icons");
|
|
19
|
+
const tunnel_mcp_service_1 = require("./tunnel/tunnel-mcp.service");
|
|
18
20
|
let AppModule = AppModule_1 = class AppModule {
|
|
19
|
-
static forStdio() {
|
|
21
|
+
static forStdio(configInput) {
|
|
22
|
+
const validatedConfig = config_2.configSchema.parse((0, config_2.transformEnvToConfig)(configInput));
|
|
20
23
|
return {
|
|
21
24
|
module: AppModule_1,
|
|
22
25
|
imports: [
|
|
23
26
|
config_1.ConfigModule.forRoot({
|
|
24
27
|
isGlobal: true,
|
|
25
28
|
cache: true,
|
|
26
|
-
|
|
29
|
+
load: [() => validatedConfig],
|
|
27
30
|
}),
|
|
28
31
|
mcp_nest_1.McpModule.forRoot({
|
|
29
32
|
name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
|
|
@@ -34,27 +37,45 @@ let AppModule = AppModule_1 = class AppModule {
|
|
|
34
37
|
essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
|
|
35
38
|
ankiConfigProvider: {
|
|
36
39
|
provide: essential_1.ANKI_CONFIG,
|
|
37
|
-
useClass:
|
|
40
|
+
useClass: app_config_service_1.AppConfigService,
|
|
41
|
+
},
|
|
42
|
+
appConfigProvider: {
|
|
43
|
+
provide: config_2.APP_CONFIG,
|
|
44
|
+
useValue: validatedConfig,
|
|
38
45
|
},
|
|
39
46
|
}),
|
|
40
47
|
gui_1.McpPrimitivesAnkiGuiModule.forRoot({
|
|
41
48
|
ankiConfigProvider: {
|
|
42
49
|
provide: essential_1.ANKI_CONFIG,
|
|
43
|
-
useClass:
|
|
50
|
+
useClass: app_config_service_1.AppConfigService,
|
|
51
|
+
},
|
|
52
|
+
appConfigProvider: {
|
|
53
|
+
provide: config_2.APP_CONFIG,
|
|
54
|
+
useValue: validatedConfig,
|
|
44
55
|
},
|
|
45
56
|
}),
|
|
46
57
|
],
|
|
47
|
-
providers: [
|
|
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],
|
|
48
68
|
};
|
|
49
69
|
}
|
|
50
|
-
static forHttp() {
|
|
70
|
+
static forHttp(configInput) {
|
|
71
|
+
const validatedConfig = config_2.configSchema.parse((0, config_2.transformEnvToConfig)(configInput));
|
|
51
72
|
return {
|
|
52
73
|
module: AppModule_1,
|
|
53
74
|
imports: [
|
|
54
75
|
config_1.ConfigModule.forRoot({
|
|
55
76
|
isGlobal: true,
|
|
56
77
|
cache: true,
|
|
57
|
-
|
|
78
|
+
load: [() => validatedConfig],
|
|
58
79
|
}),
|
|
59
80
|
mcp_nest_1.McpModule.forRoot({
|
|
60
81
|
name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
|
|
@@ -66,17 +87,84 @@ let AppModule = AppModule_1 = class AppModule {
|
|
|
66
87
|
essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
|
|
67
88
|
ankiConfigProvider: {
|
|
68
89
|
provide: essential_1.ANKI_CONFIG,
|
|
69
|
-
useClass:
|
|
90
|
+
useClass: app_config_service_1.AppConfigService,
|
|
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,
|
|
70
144
|
},
|
|
71
145
|
}),
|
|
72
146
|
gui_1.McpPrimitivesAnkiGuiModule.forRoot({
|
|
73
147
|
ankiConfigProvider: {
|
|
74
148
|
provide: essential_1.ANKI_CONFIG,
|
|
75
|
-
useClass:
|
|
149
|
+
useClass: app_config_service_1.AppConfigService,
|
|
150
|
+
},
|
|
151
|
+
appConfigProvider: {
|
|
152
|
+
provide: config_2.APP_CONFIG,
|
|
153
|
+
useValue: validatedConfig,
|
|
76
154
|
},
|
|
77
155
|
}),
|
|
78
156
|
],
|
|
79
|
-
providers: [
|
|
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],
|
|
80
168
|
};
|
|
81
169
|
}
|
|
82
170
|
};
|
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":"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"}
|
package/dist/bootstrap.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import { LoggerService } from "@nestjs/common";
|
|
2
|
-
export declare
|
|
2
|
+
export declare const LOG_DESTINATION: {
|
|
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>;
|
|
3
8
|
export declare function createLoggerService(pinoLogger: any): LoggerService;
|
package/dist/bootstrap.js
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LOG_DESTINATION = void 0;
|
|
3
4
|
exports.createPinoLogger = createPinoLogger;
|
|
4
5
|
exports.createLoggerService = createLoggerService;
|
|
5
6
|
const pino_1 = require("pino");
|
|
6
|
-
|
|
7
|
+
exports.LOG_DESTINATION = {
|
|
8
|
+
STDOUT: 1,
|
|
9
|
+
STDERR: 2,
|
|
10
|
+
};
|
|
11
|
+
function createPinoLogger(destination, logLevel = "info") {
|
|
7
12
|
return (0, pino_1.pino)({
|
|
8
|
-
level:
|
|
13
|
+
level: logLevel,
|
|
9
14
|
transport: {
|
|
10
15
|
target: "pino-pretty",
|
|
11
16
|
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":";;;AAuBA,4CAgBC;AAQD,kDAkBC;AAhED,+BAA4B;AAKf,QAAA,eAAe,GAAG;IAE7B,MAAM,EAAE,CAAC;IAET,MAAM,EAAE,CAAC;CACD,CAAC;AAYX,SAAgB,gBAAgB,CAC9B,WAA2B,EAC3B,WAAmB,MAAM;IAEzB,OAAO,IAAA,WAAI,EAAC;QACV,KAAK,EAAE,QAAQ;QACf,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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const cli_output_1 = require("../cli-output");
|
|
5
|
+
cli_output_1.cli.success("Successfully connected to Anki");
|
|
6
|
+
cli_output_1.cli.error("Failed to connect to AnkiConnect");
|
|
7
|
+
cli_output_1.cli.warn("AnkiConnect is not running");
|
|
8
|
+
cli_output_1.cli.info("Server listening on http://localhost:3000");
|
|
9
|
+
cli_output_1.cli.blank();
|
|
10
|
+
cli_output_1.cli.dim("(Use Ctrl+C to stop)");
|
|
11
|
+
cli_output_1.cli.blank();
|
|
12
|
+
cli_output_1.cli.box("Ngrok Tunnel Active", "https://abc123.ngrok.io");
|
|
13
|
+
//# sourceMappingURL=cli-output.manual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-output.manual.js","sourceRoot":"","sources":["../../../src/cli/__tests__/cli-output.manual.ts"],"names":[],"mappings":";;;AAOA,8CAAoC;AAGpC,gBAAG,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;AAC9C,gBAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;AAC9C,gBAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;AACvC,gBAAG,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;AACtD,gBAAG,CAAC,KAAK,EAAE,CAAC;AACZ,gBAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAChC,gBAAG,CAAC,KAAK,EAAE,CAAC;AACZ,gBAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare function setDebugMode(enabled: boolean): void;
|
|
2
|
+
export declare function isDebugMode(): boolean;
|
|
3
|
+
export declare function success(message: string): void;
|
|
4
|
+
export declare function error(message: string, err?: Error): void;
|
|
5
|
+
export declare function warn(message: string): void;
|
|
6
|
+
export declare function info(message: string): void;
|
|
7
|
+
export declare function blank(): void;
|
|
8
|
+
export declare function box(title: string, content: string): void;
|
|
9
|
+
export declare function dim(message: string): void;
|
|
10
|
+
export declare const cli: {
|
|
11
|
+
success: typeof success;
|
|
12
|
+
error: typeof error;
|
|
13
|
+
warn: typeof warn;
|
|
14
|
+
info: typeof info;
|
|
15
|
+
blank: typeof blank;
|
|
16
|
+
box: typeof box;
|
|
17
|
+
dim: typeof dim;
|
|
18
|
+
setDebugMode: typeof setDebugMode;
|
|
19
|
+
isDebugMode: typeof isDebugMode;
|
|
20
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cli = void 0;
|
|
4
|
+
exports.setDebugMode = setDebugMode;
|
|
5
|
+
exports.isDebugMode = isDebugMode;
|
|
6
|
+
exports.success = success;
|
|
7
|
+
exports.error = error;
|
|
8
|
+
exports.warn = warn;
|
|
9
|
+
exports.info = info;
|
|
10
|
+
exports.blank = blank;
|
|
11
|
+
exports.box = box;
|
|
12
|
+
exports.dim = dim;
|
|
13
|
+
let debugMode = false;
|
|
14
|
+
function setDebugMode(enabled) {
|
|
15
|
+
debugMode = enabled;
|
|
16
|
+
}
|
|
17
|
+
function isDebugMode() {
|
|
18
|
+
return debugMode;
|
|
19
|
+
}
|
|
20
|
+
const colors = {
|
|
21
|
+
reset: "\x1b[0m",
|
|
22
|
+
green: "\x1b[32m",
|
|
23
|
+
red: "\x1b[31m",
|
|
24
|
+
yellow: "\x1b[33m",
|
|
25
|
+
cyan: "\x1b[36m",
|
|
26
|
+
dim: "\x1b[2m",
|
|
27
|
+
};
|
|
28
|
+
function success(message) {
|
|
29
|
+
console.log(`${colors.green}✓${colors.reset} ${message}`);
|
|
30
|
+
}
|
|
31
|
+
function error(message, err) {
|
|
32
|
+
console.error(`${colors.red}✗${colors.reset} ${message}`);
|
|
33
|
+
if (err && debugMode && err.stack) {
|
|
34
|
+
console.error(`${colors.dim}${err.stack}${colors.reset}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function warn(message) {
|
|
38
|
+
console.warn(`${colors.yellow}!${colors.reset} ${message}`);
|
|
39
|
+
}
|
|
40
|
+
function info(message) {
|
|
41
|
+
console.log(message);
|
|
42
|
+
}
|
|
43
|
+
function blank() {
|
|
44
|
+
console.log();
|
|
45
|
+
}
|
|
46
|
+
function box(title, content) {
|
|
47
|
+
const width = Math.max(title.length, content.length) + 4;
|
|
48
|
+
const border = "─".repeat(width);
|
|
49
|
+
console.log(`┌${border}┐`);
|
|
50
|
+
console.log(`│ ${title.padEnd(width - 2)} │`);
|
|
51
|
+
console.log(`├${border}┤`);
|
|
52
|
+
console.log(`│ ${content.padEnd(width - 2)} │`);
|
|
53
|
+
console.log(`└${border}┘`);
|
|
54
|
+
}
|
|
55
|
+
function dim(message) {
|
|
56
|
+
console.log(`${colors.dim}${message}${colors.reset}`);
|
|
57
|
+
}
|
|
58
|
+
exports.cli = {
|
|
59
|
+
success,
|
|
60
|
+
error,
|
|
61
|
+
warn,
|
|
62
|
+
info,
|
|
63
|
+
blank,
|
|
64
|
+
box,
|
|
65
|
+
dim,
|
|
66
|
+
setDebugMode,
|
|
67
|
+
isDebugMode,
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=cli-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../../src/cli/cli-output.ts"],"names":[],"mappings":";;;AAcA,oCAEC;AAKD,kCAEC;AAeD,0BAEC;AAMD,sBAKC;AAKD,oBAEC;AAKD,oBAEC;AAKD,sBAEC;AAKD,kBASC;AAKD,kBAEC;AArFD,IAAI,SAAS,GAAG,KAAK,CAAC;AAMtB,SAAgB,YAAY,CAAC,OAAgB;IAC3C,SAAS,GAAG,OAAO,CAAC;AACtB,CAAC;AAKD,SAAgB,WAAW;IACzB,OAAO,SAAS,CAAC;AACnB,CAAC;AAGD,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,SAAS;CACf,CAAC;AAKF,SAAgB,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;AAC5D,CAAC;AAMD,SAAgB,KAAK,CAAC,OAAe,EAAE,GAAW;IAChD,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;IAC1D,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAKD,SAAgB,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;AAC9D,CAAC;AAKD,SAAgB,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC;AAKD,SAAgB,KAAK;IACnB,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAKD,SAAgB,GAAG,CAAC,KAAa,EAAE,OAAe;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;AAC7B,CAAC;AAKD,SAAgB,GAAG,CAAC,OAAe;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACxD,CAAC;AAGY,QAAA,GAAG,GAAG;IACjB,OAAO;IACP,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,GAAG;IACH,GAAG;IACH,YAAY;IACZ,WAAW;CACZ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./cli-output";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./cli-output"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -4,6 +4,10 @@ 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;
|
|
7
11
|
}
|
|
8
12
|
export declare function checkForUpdates(): void;
|
|
9
13
|
export declare function parseCliArgs(): CliOptions;
|
package/dist/cli.js
CHANGED
|
@@ -10,6 +10,8 @@ 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");
|
|
13
15
|
function getPackageJson() {
|
|
14
16
|
try {
|
|
15
17
|
return JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, "../package.json"), "utf-8"));
|
|
@@ -18,9 +20,6 @@ function getPackageJson() {
|
|
|
18
20
|
return { version: "0.0.0", name: "ankimcp" };
|
|
19
21
|
}
|
|
20
22
|
}
|
|
21
|
-
function getVersion() {
|
|
22
|
-
return getPackageJson().version;
|
|
23
|
-
}
|
|
24
23
|
function checkForUpdates() {
|
|
25
24
|
(0, update_notifier_1.default)({ pkg: getPackageJson() }).notify();
|
|
26
25
|
}
|
|
@@ -29,13 +28,17 @@ function parseCliArgs() {
|
|
|
29
28
|
program
|
|
30
29
|
.name("ankimcp")
|
|
31
30
|
.description("AnkiMCP Server - Model Context Protocol server for Anki")
|
|
32
|
-
.version(getVersion())
|
|
31
|
+
.version((0, version_1.getVersion)())
|
|
33
32
|
.option("--stdio", "Run in STDIO mode (for MCP clients like Cursor, Cline, Zed)")
|
|
34
33
|
.option("-p, --port <number>", "Port to listen on (HTTP mode)", "3000")
|
|
35
34
|
.option("-h, --host <address>", "Host to bind to (HTTP mode)", "127.0.0.1")
|
|
36
35
|
.option("-a, --anki-connect <url>", "AnkiConnect URL", "http://localhost:8765")
|
|
37
36
|
.option("--ngrok", "Start ngrok tunnel (requires global ngrok installation)")
|
|
38
37
|
.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)")
|
|
39
42
|
.addHelpText("after", `
|
|
40
43
|
Transport Modes:
|
|
41
44
|
HTTP Mode (default): For web-based AI assistants (ChatGPT, Claude.ai)
|
|
@@ -74,6 +77,13 @@ Ngrok Setup (one-time):
|
|
|
74
77
|
2. Get auth token from: https://dashboard.ngrok.com/get-started/your-authtoken
|
|
75
78
|
3. Setup: ngrok config add-authtoken <your-token>
|
|
76
79
|
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
|
|
77
87
|
`);
|
|
78
88
|
program.parse();
|
|
79
89
|
const options = program.opts();
|
|
@@ -83,17 +93,21 @@ Ngrok Setup (one-time):
|
|
|
83
93
|
ankiConnect: options.ankiConnect,
|
|
84
94
|
ngrok: options.ngrok || false,
|
|
85
95
|
readOnly: options.readOnly || false,
|
|
96
|
+
login: options.login ?? false,
|
|
97
|
+
logout: options.logout || false,
|
|
98
|
+
tunnel: options.tunnel ?? false,
|
|
99
|
+
debug: options.debug || false,
|
|
86
100
|
};
|
|
87
101
|
}
|
|
88
102
|
function displayStartupBanner(options, ngrokUrl) {
|
|
89
|
-
const version = getVersion();
|
|
103
|
+
const version = (0, version_1.getVersion)();
|
|
90
104
|
const title = `AnkiMCP HTTP Server v${version}`;
|
|
91
105
|
const padding = Math.floor((64 - title.length) / 2);
|
|
92
106
|
const paddedTitle = " ".repeat(padding) + title + " ".repeat(64 - padding - title.length);
|
|
93
107
|
const readOnlyWarning = options.readOnly
|
|
94
108
|
? "\n\n** READ-ONLY MODE ENABLED **\nContent modifications (addNote, deleteNotes, createDeck, etc.) are blocked.\nReview operations (sync, answerCards, suspend) remain available."
|
|
95
109
|
: "";
|
|
96
|
-
|
|
110
|
+
cli_output_1.cli.info(`
|
|
97
111
|
╔════════════════════════════════════════════════════════════════╗
|
|
98
112
|
║${paddedTitle}║
|
|
99
113
|
╚════════════════════════════════════════════════════════════════╝${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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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AppConfig } from "./config.schema";
|
|
2
|
+
export type ConfigInput = Record<string, string | undefined>;
|
|
3
|
+
export interface CliOverrides {
|
|
4
|
+
port?: number;
|
|
5
|
+
host?: string;
|
|
6
|
+
ankiConnect?: string;
|
|
7
|
+
readOnly?: boolean;
|
|
8
|
+
tunnel?: string | boolean;
|
|
9
|
+
ngrok?: boolean;
|
|
10
|
+
debug?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildConfigInput(cliOverrides?: CliOverrides): ConfigInput;
|
|
13
|
+
export declare function loadValidatedConfig(cliOverrides?: CliOverrides): AppConfig;
|