@ankimcp/anki-mcp-server 0.15.0-tunnel.4 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +17 -0
  2. package/bin/ankimcp.js +1 -10
  3. package/dist/anki-config.service.d.ts +11 -0
  4. package/dist/anki-config.service.js +46 -0
  5. package/dist/anki-config.service.js.map +1 -0
  6. package/dist/app.module.d.ts +2 -4
  7. package/dist/app.module.js +11 -98
  8. package/dist/app.module.js.map +1 -1
  9. package/dist/bootstrap.d.ts +1 -6
  10. package/dist/bootstrap.js +2 -7
  11. package/dist/bootstrap.js.map +1 -1
  12. package/dist/cli.d.ts +0 -4
  13. package/dist/cli.js +6 -20
  14. package/dist/cli.js.map +1 -1
  15. package/dist/http/guards/origin-validation.guard.d.ts +0 -1
  16. package/dist/http/guards/origin-validation.guard.js +3 -5
  17. package/dist/http/guards/origin-validation.guard.js.map +1 -1
  18. package/dist/main-http.js +10 -20
  19. package/dist/main-http.js.map +1 -1
  20. package/dist/main-stdio.js +9 -9
  21. package/dist/main-stdio.js.map +1 -1
  22. package/dist/mcp/primitives/essential/index.d.ts +0 -1
  23. package/dist/mcp/primitives/essential/index.js +1 -8
  24. package/dist/mcp/primitives/essential/index.js.map +1 -1
  25. package/dist/mcp/primitives/essential/tools/mediaActions/actions/deleteMediaFile.action.js +3 -2
  26. package/dist/mcp/primitives/essential/tools/mediaActions/actions/deleteMediaFile.action.js.map +1 -1
  27. package/dist/mcp/primitives/essential/tools/mediaActions/actions/retrieveMediaFile.action.js +3 -2
  28. package/dist/mcp/primitives/essential/tools/mediaActions/actions/retrieveMediaFile.action.js.map +1 -1
  29. package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.js +18 -4
  30. package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.js.map +1 -1
  31. package/dist/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.js +1 -1
  32. package/dist/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.js.map +1 -1
  33. package/dist/mcp/primitives/essential/tools/update-note-fields.tool.js +17 -0
  34. package/dist/mcp/primitives/essential/tools/update-note-fields.tool.js.map +1 -1
  35. package/dist/mcp/primitives/gui/index.d.ts +0 -1
  36. package/dist/mcp/primitives/gui/index.js +1 -8
  37. package/dist/mcp/primitives/gui/index.js.map +1 -1
  38. package/dist/mcp/utils/media-validation.utils.d.ts +33 -0
  39. package/dist/mcp/utils/media-validation.utils.js +208 -0
  40. package/dist/mcp/utils/media-validation.utils.js.map +1 -0
  41. package/dist/services/ngrok.service.d.ts +0 -1
  42. package/dist/services/ngrok.service.js +3 -5
  43. package/dist/services/ngrok.service.js.map +1 -1
  44. package/dist/test-fixtures/mock-data.d.ts +0 -8
  45. package/dist/test-fixtures/mock-data.js +0 -8
  46. package/dist/test-fixtures/mock-data.js.map +1 -1
  47. package/dist/tsconfig.build.tsbuildinfo +1 -1
  48. package/package.json +4 -6
  49. package/dist/app-config.service.d.ts +0 -22
  50. package/dist/app-config.service.js +0 -79
  51. package/dist/app-config.service.js.map +0 -1
  52. package/dist/cli/__tests__/cli-output.manual.d.ts +0 -2
  53. package/dist/cli/__tests__/cli-output.manual.js +0 -13
  54. package/dist/cli/__tests__/cli-output.manual.js.map +0 -1
  55. package/dist/cli/cli-output.d.ts +0 -20
  56. package/dist/cli/cli-output.js +0 -69
  57. package/dist/cli/cli-output.js.map +0 -1
  58. package/dist/cli/index.d.ts +0 -1
  59. package/dist/cli/index.js +0 -18
  60. package/dist/cli/index.js.map +0 -1
  61. package/dist/config/config.factory.d.ts +0 -13
  62. package/dist/config/config.factory.js +0 -32
  63. package/dist/config/config.factory.js.map +0 -1
  64. package/dist/config/config.schema.d.ts +0 -33
  65. package/dist/config/config.schema.js +0 -58
  66. package/dist/config/config.schema.js.map +0 -1
  67. package/dist/config/index.d.ts +0 -3
  68. package/dist/config/index.js +0 -11
  69. package/dist/config/index.js.map +0 -1
  70. package/dist/main-tunnel.d.ts +0 -1
  71. package/dist/main-tunnel.js +0 -26
  72. package/dist/main-tunnel.js.map +0 -1
  73. package/dist/tunnel/commands/index.d.ts +0 -3
  74. package/dist/tunnel/commands/index.js +0 -10
  75. package/dist/tunnel/commands/index.js.map +0 -1
  76. package/dist/tunnel/commands/login.command.d.ts +0 -1
  77. package/dist/tunnel/commands/login.command.js +0 -108
  78. package/dist/tunnel/commands/login.command.js.map +0 -1
  79. package/dist/tunnel/commands/logout.command.d.ts +0 -1
  80. package/dist/tunnel/commands/logout.command.js +0 -26
  81. package/dist/tunnel/commands/logout.command.js.map +0 -1
  82. package/dist/tunnel/commands/tunnel.command.d.ts +0 -1
  83. package/dist/tunnel/commands/tunnel.command.js +0 -185
  84. package/dist/tunnel/commands/tunnel.command.js.map +0 -1
  85. package/dist/tunnel/credentials.service.d.ts +0 -23
  86. package/dist/tunnel/credentials.service.js +0 -152
  87. package/dist/tunnel/credentials.service.js.map +0 -1
  88. package/dist/tunnel/device-flow.service.d.ts +0 -46
  89. package/dist/tunnel/device-flow.service.js +0 -237
  90. package/dist/tunnel/device-flow.service.js.map +0 -1
  91. package/dist/tunnel/in-memory.transport.d.ts +0 -14
  92. package/dist/tunnel/in-memory.transport.js +0 -63
  93. package/dist/tunnel/in-memory.transport.js.map +0 -1
  94. package/dist/tunnel/index.d.ts +0 -6
  95. package/dist/tunnel/index.js +0 -31
  96. package/dist/tunnel/index.js.map +0 -1
  97. package/dist/tunnel/tunnel-mcp.service.d.ts +0 -15
  98. package/dist/tunnel/tunnel-mcp.service.js +0 -100
  99. package/dist/tunnel/tunnel-mcp.service.js.map +0 -1
  100. package/dist/tunnel/tunnel.client.d.ts +0 -60
  101. package/dist/tunnel/tunnel.client.js +0 -386
  102. package/dist/tunnel/tunnel.client.js.map +0 -1
  103. package/dist/tunnel/tunnel.protocol.d.ts +0 -68
  104. package/dist/tunnel/tunnel.protocol.js +0 -26
  105. package/dist/tunnel/tunnel.protocol.js.map +0 -1
  106. package/dist/version.d.ts +0 -2
  107. package/dist/version.js +0 -21
  108. package/dist/version.js.map +0 -1
package/README.md CHANGED
@@ -368,6 +368,9 @@ For more details, see the [official MCP documentation](https://modelcontextproto
368
368
  | `ANKI_CONNECT_API_KEY` | API key if configured in AnkiConnect | - |
369
369
  | `ANKI_CONNECT_TIMEOUT` | Request timeout in ms | `5000` |
370
370
  | `READ_ONLY` | Enable read-only mode (`true` or `1`) | `false` |
371
+ | `MEDIA_ALLOWED_TYPES` | Extra MIME types to allow for file path imports (comma-separated, e.g., `application/pdf`) | - |
372
+ | `MEDIA_IMPORT_DIR` | Restrict file path imports to this directory | - |
373
+ | `MEDIA_ALLOWED_HOSTS` | Allow specific private network hosts for URL imports (comma-separated, e.g., `192.168.1.50,my-nas`) | - |
371
374
 
372
375
  ## Usage Examples
373
376
 
@@ -421,6 +424,20 @@ The `findNotes` tool supports Anki's powerful query syntax:
421
424
  #### Deletion Safety
422
425
  The `deleteNotes` tool requires explicit confirmation (`confirmDeletion: true`) to prevent accidental deletions. Deleting a note removes ALL associated cards permanently.
423
426
 
427
+ ## Security
428
+
429
+ ### Media File Path and URL Validation
430
+
431
+ The `mediaActions` tool and `updateNoteFields` audio/picture fields include security validation to prevent misuse via prompt injection:
432
+
433
+ - **File path imports** are restricted to media file types only (images, audio, video). Non-media files (e.g., SSH keys, credentials, shell configs) are rejected based on MIME type. Configure `MEDIA_ALLOWED_TYPES` to allow additional file types, or `MEDIA_IMPORT_DIR` to restrict imports to a specific directory.
434
+ - **URL imports** are validated against SSRF attacks. Requests to private networks (10.x, 172.16.x, 192.168.x), loopback (127.x), link-local (169.254.x), and non-HTTP(S) schemes are blocked. Configure `MEDIA_ALLOWED_HOSTS` to allow specific private network hosts.
435
+ - **Filenames** are sanitized to prevent path traversal (e.g., `../../` sequences are stripped).
436
+
437
+ These protections apply to `storeMediaFile`, `retrieveMediaFile`, `deleteMediaFile`, and `updateNoteFields` audio/picture fields.
438
+
439
+ > Path traversal vulnerability reported by [Hideaki Takahashi](https://github.com/Koukyosyumei).
440
+
424
441
  ## Known Issues
425
442
 
426
443
  For a comprehensive list of known issues and limitations, please visit our documentation:
package/bin/ankimcp.js CHANGED
@@ -16,21 +16,12 @@ if (
16
16
  process.exit(1);
17
17
  }
18
18
 
19
- // Determine mode based on CLI flags
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"}
@@ -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(configInput: ConfigInput): DynamicModule;
5
- static forHttp(configInput: ConfigInput): DynamicModule;
6
- static forTunnel(cliOverrides?: CliOverrides): DynamicModule;
3
+ static forStdio(): DynamicModule;
4
+ static forHttp(): DynamicModule;
7
5
  }
@@ -13,19 +13,16 @@ 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 app_config_service_1 = require("./app-config.service");
17
- const config_2 = require("./config");
18
- const tunnel_mcp_service_1 = require("./tunnel/tunnel-mcp.service");
16
+ const anki_config_service_1 = require("./anki-config.service");
19
17
  let AppModule = AppModule_1 = class AppModule {
20
- static forStdio(configInput) {
21
- const validatedConfig = config_2.configSchema.parse((0, config_2.transformEnvToConfig)(configInput));
18
+ static forStdio() {
22
19
  return {
23
20
  module: AppModule_1,
24
21
  imports: [
25
22
  config_1.ConfigModule.forRoot({
26
23
  isGlobal: true,
27
24
  cache: true,
28
- load: [() => validatedConfig],
25
+ envFilePath: [".env.local", ".env"],
29
26
  }),
30
27
  mcp_nest_1.McpModule.forRoot({
31
28
  name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
@@ -35,45 +32,27 @@ let AppModule = AppModule_1 = class AppModule {
35
32
  essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
36
33
  ankiConfigProvider: {
37
34
  provide: essential_1.ANKI_CONFIG,
38
- useClass: app_config_service_1.AppConfigService,
39
- },
40
- appConfigProvider: {
41
- provide: config_2.APP_CONFIG,
42
- useValue: validatedConfig,
35
+ useClass: anki_config_service_1.AnkiConfigService,
43
36
  },
44
37
  }),
45
38
  gui_1.McpPrimitivesAnkiGuiModule.forRoot({
46
39
  ankiConfigProvider: {
47
40
  provide: essential_1.ANKI_CONFIG,
48
- useClass: app_config_service_1.AppConfigService,
49
- },
50
- appConfigProvider: {
51
- provide: config_2.APP_CONFIG,
52
- useValue: validatedConfig,
41
+ useClass: anki_config_service_1.AnkiConfigService,
53
42
  },
54
43
  }),
55
44
  ],
56
- providers: [
57
- {
58
- provide: config_2.APP_CONFIG,
59
- useValue: validatedConfig,
60
- },
61
- app_config_service_1.AppConfigService,
62
- ...essential_1.ESSENTIAL_MCP_TOOLS,
63
- ...gui_1.GUI_MCP_TOOLS,
64
- ],
65
- exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService],
45
+ providers: [anki_config_service_1.AnkiConfigService, ...essential_1.ESSENTIAL_MCP_TOOLS, ...gui_1.GUI_MCP_TOOLS],
66
46
  };
67
47
  }
68
- static forHttp(configInput) {
69
- const validatedConfig = config_2.configSchema.parse((0, config_2.transformEnvToConfig)(configInput));
48
+ static forHttp() {
70
49
  return {
71
50
  module: AppModule_1,
72
51
  imports: [
73
52
  config_1.ConfigModule.forRoot({
74
53
  isGlobal: true,
75
54
  cache: true,
76
- load: [() => validatedConfig],
55
+ envFilePath: [".env.local", ".env"],
77
56
  }),
78
57
  mcp_nest_1.McpModule.forRoot({
79
58
  name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
@@ -84,83 +63,17 @@ let AppModule = AppModule_1 = class AppModule {
84
63
  essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
85
64
  ankiConfigProvider: {
86
65
  provide: essential_1.ANKI_CONFIG,
87
- useClass: app_config_service_1.AppConfigService,
88
- },
89
- appConfigProvider: {
90
- provide: config_2.APP_CONFIG,
91
- useValue: validatedConfig,
66
+ useClass: anki_config_service_1.AnkiConfigService,
92
67
  },
93
68
  }),
94
69
  gui_1.McpPrimitivesAnkiGuiModule.forRoot({
95
70
  ankiConfigProvider: {
96
71
  provide: essential_1.ANKI_CONFIG,
97
- useClass: app_config_service_1.AppConfigService,
98
- },
99
- appConfigProvider: {
100
- provide: config_2.APP_CONFIG,
101
- useValue: validatedConfig,
72
+ useClass: anki_config_service_1.AnkiConfigService,
102
73
  },
103
74
  }),
104
75
  ],
105
- providers: [
106
- {
107
- provide: config_2.APP_CONFIG,
108
- useValue: validatedConfig,
109
- },
110
- app_config_service_1.AppConfigService,
111
- ...essential_1.ESSENTIAL_MCP_TOOLS,
112
- ...gui_1.GUI_MCP_TOOLS,
113
- ],
114
- exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService],
115
- };
116
- }
117
- static forTunnel(cliOverrides) {
118
- const validatedConfig = (0, config_2.loadValidatedConfig)(cliOverrides);
119
- return {
120
- module: AppModule_1,
121
- imports: [
122
- config_1.ConfigModule.forRoot({
123
- isGlobal: true,
124
- cache: true,
125
- load: [() => validatedConfig],
126
- }),
127
- mcp_nest_1.McpModule.forRoot({
128
- name: process.env.MCP_SERVER_NAME || "anki-mcp-server",
129
- version: process.env.MCP_SERVER_VERSION || "1.0.0",
130
- transport: [],
131
- }),
132
- essential_1.McpPrimitivesAnkiEssentialModule.forRoot({
133
- ankiConfigProvider: {
134
- provide: essential_1.ANKI_CONFIG,
135
- useClass: app_config_service_1.AppConfigService,
136
- },
137
- appConfigProvider: {
138
- provide: config_2.APP_CONFIG,
139
- useValue: validatedConfig,
140
- },
141
- }),
142
- gui_1.McpPrimitivesAnkiGuiModule.forRoot({
143
- ankiConfigProvider: {
144
- provide: essential_1.ANKI_CONFIG,
145
- useClass: app_config_service_1.AppConfigService,
146
- },
147
- appConfigProvider: {
148
- provide: config_2.APP_CONFIG,
149
- useValue: validatedConfig,
150
- },
151
- }),
152
- ],
153
- providers: [
154
- {
155
- provide: config_2.APP_CONFIG,
156
- useValue: validatedConfig,
157
- },
158
- app_config_service_1.AppConfigService,
159
- tunnel_mcp_service_1.TunnelMcpService,
160
- ...essential_1.ESSENTIAL_MCP_TOOLS,
161
- ...gui_1.GUI_MCP_TOOLS,
162
- ],
163
- exports: [config_2.APP_CONFIG, app_config_service_1.AppConfigService, tunnel_mcp_service_1.TunnelMcpService],
76
+ providers: [anki_config_service_1.AnkiConfigService, ...essential_1.ESSENTIAL_MCP_TOOLS, ...gui_1.GUI_MCP_TOOLS],
164
77
  };
165
78
  }
166
79
  };
@@ -1 +1 @@
1
- {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":"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"}
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;AAGnD,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;iBAClC,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;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;AArFY,8BAAS;oBAAT,SAAS;IADrB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,SAAS,CAqFrB"}
@@ -1,8 +1,3 @@
1
1
  import { LoggerService } from "@nestjs/common";
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>;
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
- exports.LOG_DESTINATION = {
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: logLevel,
8
+ level: process.env.LOG_LEVEL || "info",
14
9
  transport: {
15
10
  target: "pino-pretty",
16
11
  options: {
@@ -1 +1 @@
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"}
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((0, version_1.getVersion)())
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 = (0, version_1.getVersion)();
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
- cli_output_1.cli.info(`
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":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { CanActivate, ExecutionContext } from "@nestjs/common";
2
2
  export declare class OriginValidationGuard implements CanActivate {
3
- private readonly logger;
4
3
  private readonly allowedOrigins;
5
4
  constructor();
6
5
  canActivate(context: ExecutionContext): boolean;
@@ -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 = OriginValidationGuard_1 = class 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
- this.logger.warn(`Rejected request from unauthorized origin: ${origin}`);
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 = OriginValidationGuard_1 = __decorate([
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":";;;;;;;;;;;;;AAAA,2CAKwB;AAiBjB,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IACf,MAAM,GAAG,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,CAAC;IAChD,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,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,MAAM,EAAE,CAAC,CAAC;QAC3E,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;AAxDY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;;GACA,qBAAqB,CAwDjC"}
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
- (0, cli_output_1.setDebugMode)(options.debug);
15
- const configInput = (0, config_1.buildConfigInput)({
16
- port: options.port,
17
- host: options.host,
18
- ankiConnect: options.ankiConnect,
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(configInput), {
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
- cli_output_1.cli.blank();
41
- cli_output_1.cli.error(`Failed to start ngrok: ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? err : undefined);
42
- cli_output_1.cli.blank();
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
- cli_output_1.cli.error(`Failed to start MCP HTTP server: ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? err : undefined);
40
+ console.error("Failed to start MCP HTTP server:", err);
51
41
  process.exit(1);
52
42
  });
53
43
  //# sourceMappingURL=main-http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"main-http.js","sourceRoot":"","sources":["../src/main-http.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;AACzC,2CAIqB;AACrB,mFAA8E;AAC9E,+BAA4E;AAC5E,iDAAqD;AACrD,4DAAwD;AACxD,qCAA4C;AAE5C,KAAK,UAAU,SAAS;IAEtB,IAAA,qBAAe,GAAE,CAAC;IAElB,MAAM,OAAO,GAAG,IAAA,kBAAY,GAAE,CAAC;IAG/B,IAAA,yBAAY,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAG5B,MAAM,WAAW,GAAG,IAAA,yBAAgB,EAAC;QACnC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAIH,MAAM,UAAU,GAAG,IAAA,4BAAgB,EACjC,2BAAe,CAAC,MAAM,EACtB,WAAW,CAAC,SAAS,IAAI,MAAM,CAChC,CAAC;IACF,MAAM,aAAa,GAAG,IAAA,+BAAmB,EAAC,UAAU,CAAC,CAAC;IAGtD,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;QACnE,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,gBAAG,CAAC,KAAK,EAAE,CAAC;YACZ,gBAAG,CAAC,KAAK,CACP,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC5E,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CACvC,CAAC;YACF,gBAAG,CAAC,KAAK,EAAE,CAAC;YACZ,gBAAG,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAC5D,gBAAG,CAAC,KAAK,EAAE,CAAC;QACd,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,gBAAG,CAAC,KAAK,CACP,oCAAoC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACtF,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CACvC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
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"}
@@ -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
- const configInput = (0, config_1.buildConfigInput)({
26
- ankiConnect: cliOptions.ankiConnect,
27
- readOnly: cliOptions.readOnly,
28
- });
29
- const pinoLogger = (0, bootstrap_1.createPinoLogger)(bootstrap_1.LOG_DESTINATION.STDERR, configInput.LOG_LEVEL || "info");
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(configInput), {
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
- cli_output_1.cli.error(`Failed to start MCP STDIO server: ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? err : undefined);
44
+ console.error("Failed to start MCP STDIO server:", err);
45
45
  process.exit(1);
46
46
  });
47
47
  //# sourceMappingURL=main-stdio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"main-stdio.js","sourceRoot":"","sources":["../src/main-stdio.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;AACzC,2CAIqB;AACrB,iDAAuC;AACvC,qCAA4C;AAM5C,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,MAAM,WAAW,GAAG,IAAA,yBAAgB,EAAC;QACnC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,QAAQ,EAAE,UAAU,CAAC,QAAQ;KAC9B,CAAC,CAAC;IAIH,MAAM,UAAU,GAAG,IAAA,4BAAgB,EACjC,2BAAe,CAAC,MAAM,EACtB,WAAW,CAAC,SAAS,IAAI,MAAM,CAChC,CAAC;IACF,MAAM,aAAa,GAAG,IAAA,+BAAmB,EAAC,UAAU,CAAC,CAAC;IAGtD,MAAM,kBAAW,CAAC,wBAAwB,CAAC,sBAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;QAC1E,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,gBAAG,CAAC,KAAK,CACP,qCAAqC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACvF,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CACvC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
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"}
@@ -57,7 +57,6 @@ import { SystemInfoResource } from "./resources/system-info.resource";
57
57
  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 MediaActionsTool | typeof GetTagsTool | typeof TagActionsTool | typeof DeckActionsTool | typeof CollectionStatsTool | typeof ReviewStatsTool | typeof ReviewSessionPrompt | typeof TwentyRulesPrompt | typeof SystemInfoResource)[];
58
58
  export interface McpPrimitivesAnkiEssentialModuleOptions {
59
59
  ankiConfigProvider: Provider;
60
- appConfigProvider?: Provider;
61
60
  }
62
61
  export declare class McpPrimitivesAnkiEssentialModule {
63
62
  static forRoot(options: McpPrimitivesAnkiEssentialModuleOptions): DynamicModule;