@hed-hog/core 0.0.328 → 0.0.330
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/dist/ai/ai.service.d.ts +1 -1
- package/dist/auth/auth.controller.d.ts +23 -23
- package/dist/auth/auth.service.d.ts +41 -41
- package/dist/challenge/challenge.service.d.ts +14 -14
- package/dist/core/system.controller.d.ts +1 -1
- package/dist/core/system.service.d.ts +1 -1
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +9 -2
- package/dist/core.module.js.map +1 -1
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +84 -84
- package/dist/dashboard/dashboard/dashboard.service.d.ts +84 -84
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +29 -29
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +29 -29
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +42 -42
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +42 -42
- package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +11 -11
- package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +11 -11
- package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +6 -6
- package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +6 -6
- package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +33 -33
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +33 -33
- package/dist/dashboard/dashboard-user/dashboard-user.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-user/dashboard-user.service.d.ts +3 -3
- package/dist/file/file.controller.d.ts +10 -10
- package/dist/file/file.service.d.ts +22 -22
- package/dist/index.d.ts +11 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/mail/mail.controller.d.ts +15 -15
- package/dist/mail/mail.service.d.ts +15 -15
- package/dist/mail-profile/mail-profile.controller.d.ts +9 -9
- package/dist/mail-profile/mail-profile.service.d.ts +9 -9
- package/dist/mail-sent/mail-sent.controller.d.ts +17 -17
- package/dist/mail-sent/mail-sent.service.d.ts +17 -17
- package/dist/mcp/decorators/mcp-tool.decorator.d.ts +4 -0
- package/dist/mcp/decorators/mcp-tool.decorator.d.ts.map +1 -0
- package/dist/mcp/decorators/mcp-tool.decorator.js +8 -0
- package/dist/mcp/decorators/mcp-tool.decorator.js.map +1 -0
- package/dist/mcp/guards/mcp-auth.guard.d.ts +9 -0
- package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -0
- package/dist/mcp/guards/mcp-auth.guard.js +41 -0
- package/dist/mcp/guards/mcp-auth.guard.js.map +1 -0
- package/dist/mcp/guards/mcp-permission.guard.d.ts +8 -0
- package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -0
- package/dist/mcp/guards/mcp-permission.guard.js +57 -0
- package/dist/mcp/guards/mcp-permission.guard.js.map +1 -0
- package/dist/mcp/interfaces/mcp-tool-definition.interface.d.ts +7 -0
- package/dist/mcp/interfaces/mcp-tool-definition.interface.d.ts.map +1 -0
- package/dist/mcp/interfaces/mcp-tool-definition.interface.js +3 -0
- package/dist/mcp/interfaces/mcp-tool-definition.interface.js.map +1 -0
- package/dist/mcp/mcp-audit.service.d.ts +17 -0
- package/dist/mcp/mcp-audit.service.d.ts.map +1 -0
- package/dist/mcp/mcp-audit.service.js +46 -0
- package/dist/mcp/mcp-audit.service.js.map +1 -0
- package/dist/mcp/mcp-registry.service.d.ts +21 -0
- package/dist/mcp/mcp-registry.service.d.ts.map +1 -0
- package/dist/mcp/mcp-registry.service.js +69 -0
- package/dist/mcp/mcp-registry.service.js.map +1 -0
- package/dist/mcp/mcp-server.service.d.ts +12 -0
- package/dist/mcp/mcp-server.service.d.ts.map +1 -0
- package/dist/mcp/mcp-server.service.js +94 -0
- package/dist/mcp/mcp-server.service.js.map +1 -0
- package/dist/mcp/mcp.controller.d.ts +8 -0
- package/dist/mcp/mcp.controller.d.ts.map +1 -0
- package/dist/mcp/mcp.controller.js +54 -0
- package/dist/mcp/mcp.controller.js.map +1 -0
- package/dist/mcp/mcp.module.d.ts +3 -0
- package/dist/mcp/mcp.module.d.ts.map +1 -0
- package/dist/mcp/mcp.module.js +49 -0
- package/dist/mcp/mcp.module.js.map +1 -0
- package/dist/mcp/tools/core-settings.mcp-tools.d.ts +12 -0
- package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -0
- package/dist/mcp/tools/core-settings.mcp-tools.js +66 -0
- package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -0
- package/dist/mcp/tools/core-users.mcp-tools.d.ts +55 -0
- package/dist/mcp/tools/core-users.mcp-tools.d.ts.map +1 -0
- package/dist/mcp/tools/core-users.mcp-tools.js +295 -0
- package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -0
- package/dist/mcp/types/mcp-context.type.d.ts +7 -0
- package/dist/mcp/types/mcp-context.type.d.ts.map +1 -0
- package/dist/mcp/types/mcp-context.type.js +3 -0
- package/dist/mcp/types/mcp-context.type.js.map +1 -0
- package/dist/mcp-chat/dto/create-conversation.dto.d.ts +4 -0
- package/dist/mcp-chat/dto/create-conversation.dto.d.ts.map +1 -0
- package/dist/mcp-chat/dto/create-conversation.dto.js +22 -0
- package/dist/mcp-chat/dto/create-conversation.dto.js.map +1 -0
- package/dist/mcp-chat/dto/send-message.dto.d.ts +4 -0
- package/dist/mcp-chat/dto/send-message.dto.d.ts.map +1 -0
- package/dist/mcp-chat/dto/send-message.dto.js +22 -0
- package/dist/mcp-chat/dto/send-message.dto.js.map +1 -0
- package/dist/mcp-chat/mcp-chat.controller.d.ts +55 -0
- package/dist/mcp-chat/mcp-chat.controller.d.ts.map +1 -0
- package/dist/mcp-chat/mcp-chat.controller.js +90 -0
- package/dist/mcp-chat/mcp-chat.controller.js.map +1 -0
- package/dist/mcp-chat/mcp-chat.module.d.ts +3 -0
- package/dist/mcp-chat/mcp-chat.module.d.ts.map +1 -0
- package/dist/mcp-chat/mcp-chat.module.js +30 -0
- package/dist/mcp-chat/mcp-chat.module.js.map +1 -0
- package/dist/mcp-chat/mcp-chat.service.d.ts +50 -0
- package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -0
- package/dist/mcp-chat/mcp-chat.service.js +290 -0
- package/dist/mcp-chat/mcp-chat.service.js.map +1 -0
- package/dist/menu/menu.controller.d.ts +8 -8
- package/dist/menu/menu.service.d.ts +8 -8
- package/dist/oauth/oauth.service.js +1 -1
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/pdf/components/index.d.ts +57 -0
- package/dist/pdf/components/index.d.ts.map +1 -0
- package/dist/pdf/components/index.js +258 -0
- package/dist/pdf/components/index.js.map +1 -0
- package/dist/pdf/dto/generate-pdf.dto.d.ts +5 -0
- package/dist/pdf/dto/generate-pdf.dto.d.ts.map +1 -0
- package/dist/pdf/dto/generate-pdf.dto.js +27 -0
- package/dist/pdf/dto/generate-pdf.dto.js.map +1 -0
- package/dist/pdf/interfaces/pdf-theme-config.interface.d.ts +10 -0
- package/dist/pdf/interfaces/pdf-theme-config.interface.d.ts.map +1 -0
- package/dist/pdf/interfaces/pdf-theme-config.interface.js +3 -0
- package/dist/pdf/interfaces/pdf-theme-config.interface.js.map +1 -0
- package/dist/pdf/pdf.controller.d.ts +16 -0
- package/dist/pdf/pdf.controller.d.ts.map +1 -0
- package/dist/pdf/pdf.controller.js +100 -0
- package/dist/pdf/pdf.controller.js.map +1 -0
- package/dist/pdf/pdf.module.d.ts +3 -0
- package/dist/pdf/pdf.module.d.ts.map +1 -0
- package/dist/pdf/pdf.module.js +29 -0
- package/dist/pdf/pdf.module.js.map +1 -0
- package/dist/pdf/pdf.service.d.ts +44 -0
- package/dist/pdf/pdf.service.d.ts.map +1 -0
- package/dist/pdf/pdf.service.js +185 -0
- package/dist/pdf/pdf.service.js.map +1 -0
- package/dist/pdf/templates/hcode-institutional.template.d.ts +36 -0
- package/dist/pdf/templates/hcode-institutional.template.d.ts.map +1 -0
- package/dist/pdf/templates/hcode-institutional.template.js +67 -0
- package/dist/pdf/templates/hcode-institutional.template.js.map +1 -0
- package/dist/pdf/themes/hcode.theme.d.ts +25 -0
- package/dist/pdf/themes/hcode.theme.d.ts.map +1 -0
- package/dist/pdf/themes/hcode.theme.js +504 -0
- package/dist/pdf/themes/hcode.theme.js.map +1 -0
- package/dist/profile/profile.controller.d.ts +16 -16
- package/dist/profile/profile.service.d.ts +16 -16
- package/dist/role/role.controller.d.ts +12 -12
- package/dist/role/role.service.d.ts +12 -12
- package/dist/route/dto/create.dto.d.ts +6 -2
- package/dist/route/dto/create.dto.d.ts.map +1 -1
- package/dist/route/dto/create.dto.js +19 -1
- package/dist/route/dto/create.dto.js.map +1 -1
- package/dist/route/dto/update.dto.d.ts +4 -0
- package/dist/route/dto/update.dto.d.ts.map +1 -1
- package/dist/route/dto/update.dto.js +19 -3
- package/dist/route/dto/update.dto.js.map +1 -1
- package/dist/route/route.service.d.ts +1 -1
- package/dist/route/route.service.d.ts.map +1 -1
- package/dist/route/route.service.js +18 -11
- package/dist/route/route.service.js.map +1 -1
- package/dist/screen/screen.controller.d.ts +3 -3
- package/dist/screen/screen.service.d.ts +3 -3
- package/dist/session/session.controller.d.ts +4 -4
- package/dist/session/session.service.d.ts +12 -12
- package/dist/setting/setting.controller.d.ts +13 -13
- package/dist/setting/setting.service.d.ts +13 -13
- package/dist/user/user.controller.d.ts +24 -24
- package/dist/user/user.service.d.ts +55 -55
- package/hedhog/data/menu.yaml +40 -26
- package/hedhog/data/route.yaml +583 -152
- package/hedhog/data/setting_group.yaml +60 -0
- package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +574 -0
- package/hedhog/frontend/app/users/user-sheet.tsx.ejs +5 -9
- package/hedhog/frontend/messages/en.json +19 -0
- package/hedhog/frontend/messages/pt.json +19 -0
- package/hedhog/table/mcp_conversation.yaml +12 -0
- package/hedhog/table/mcp_conversation_message.yaml +23 -0
- package/hedhog/table/mcp_tool_call_log.yaml +22 -0
- package/hedhog/table/route.yaml +33 -22
- package/package.json +7 -6
- package/src/core.module.ts +18 -11
- package/src/index.ts +22 -12
- package/src/mcp/decorators/mcp-tool.decorator.ts +7 -0
- package/src/mcp/guards/mcp-auth.guard.ts +32 -0
- package/src/mcp/guards/mcp-permission.guard.ts +51 -0
- package/src/mcp/interfaces/mcp-tool-definition.interface.ts +6 -0
- package/src/mcp/mcp-audit.service.ts +36 -0
- package/src/mcp/mcp-registry.service.ts +69 -0
- package/src/mcp/mcp-server.service.ts +87 -0
- package/src/mcp/mcp.controller.ts +30 -0
- package/src/mcp/mcp.module.ts +36 -0
- package/src/mcp/tools/core-settings.mcp-tools.ts +53 -0
- package/src/mcp/tools/core-users.mcp-tools.ts +267 -0
- package/src/mcp/types/mcp-context.type.ts +6 -0
- package/src/mcp-chat/dto/create-conversation.dto.ts +7 -0
- package/src/mcp-chat/dto/send-message.dto.ts +7 -0
- package/src/mcp-chat/mcp-chat.controller.ts +60 -0
- package/src/mcp-chat/mcp-chat.module.ts +17 -0
- package/src/mcp-chat/mcp-chat.service.ts +332 -0
- package/src/oauth/oauth.service.ts +12 -12
- package/src/pdf/components/index.ts +316 -0
- package/src/pdf/dto/generate-pdf.dto.ts +11 -0
- package/src/pdf/interfaces/pdf-theme-config.interface.ts +10 -0
- package/src/pdf/pdf.controller.ts +86 -0
- package/src/pdf/pdf.module.ts +17 -0
- package/src/pdf/pdf.service.ts +229 -0
- package/src/pdf/templates/hcode-institutional.template.ts +122 -0
- package/src/pdf/themes/hcode.theme.ts +515 -0
- package/src/route/dto/create.dto.ts +32 -14
- package/src/route/dto/update.dto.ts +31 -16
- package/src/route/route.service.ts +23 -12
|
@@ -19,7 +19,7 @@ export declare class MailSentController {
|
|
|
19
19
|
mail_sent_user?: {
|
|
20
20
|
id: number;
|
|
21
21
|
recipient_email: string;
|
|
22
|
-
status: "
|
|
22
|
+
status: "received" | "read" | "error";
|
|
23
23
|
read_at: Date | null;
|
|
24
24
|
error_code: string | null;
|
|
25
25
|
error_message: string | null;
|
|
@@ -37,40 +37,40 @@ export declare class MailSentController {
|
|
|
37
37
|
next: number;
|
|
38
38
|
}>;
|
|
39
39
|
get(id: number, locale: string): Promise<{
|
|
40
|
-
body: string;
|
|
41
|
-
id: number;
|
|
42
|
-
from: string;
|
|
43
|
-
created_at: Date;
|
|
44
|
-
updated_at: Date;
|
|
45
|
-
subject: string;
|
|
46
40
|
mail_id: number;
|
|
41
|
+
subject: string;
|
|
42
|
+
from: string;
|
|
47
43
|
to: string | null;
|
|
48
44
|
cc: string | null;
|
|
49
45
|
bcc: string | null;
|
|
50
|
-
}>;
|
|
51
|
-
create(data: CreateDTO): Promise<{
|
|
52
46
|
body: string;
|
|
53
|
-
id: number;
|
|
54
|
-
from: string;
|
|
55
47
|
created_at: Date;
|
|
48
|
+
id: number;
|
|
56
49
|
updated_at: Date;
|
|
57
|
-
|
|
50
|
+
}>;
|
|
51
|
+
create(data: CreateDTO): Promise<{
|
|
58
52
|
mail_id: number;
|
|
53
|
+
subject: string;
|
|
54
|
+
from: string;
|
|
59
55
|
to: string | null;
|
|
60
56
|
cc: string | null;
|
|
61
57
|
bcc: string | null;
|
|
62
|
-
}>;
|
|
63
|
-
update(locale: string, id: number, data: UpdateDTO): Promise<{
|
|
64
58
|
body: string;
|
|
65
|
-
id: number;
|
|
66
|
-
from: string;
|
|
67
59
|
created_at: Date;
|
|
60
|
+
id: number;
|
|
68
61
|
updated_at: Date;
|
|
69
|
-
|
|
62
|
+
}>;
|
|
63
|
+
update(locale: string, id: number, data: UpdateDTO): Promise<{
|
|
70
64
|
mail_id: number;
|
|
65
|
+
subject: string;
|
|
66
|
+
from: string;
|
|
71
67
|
to: string | null;
|
|
72
68
|
cc: string | null;
|
|
73
69
|
bcc: string | null;
|
|
70
|
+
body: string;
|
|
71
|
+
created_at: Date;
|
|
72
|
+
id: number;
|
|
73
|
+
updated_at: Date;
|
|
74
74
|
}>;
|
|
75
75
|
delete(locale: string, data: DeleteDTO): Promise<{
|
|
76
76
|
count: number;
|
|
@@ -41,43 +41,43 @@ export declare class MailSentService {
|
|
|
41
41
|
next: number;
|
|
42
42
|
}>;
|
|
43
43
|
get(locale: string, id: number): Promise<{
|
|
44
|
-
body: string;
|
|
45
|
-
id: number;
|
|
46
|
-
from: string;
|
|
47
|
-
created_at: Date;
|
|
48
|
-
updated_at: Date;
|
|
49
|
-
subject: string;
|
|
50
44
|
mail_id: number;
|
|
45
|
+
subject: string;
|
|
46
|
+
from: string;
|
|
51
47
|
to: string | null;
|
|
52
48
|
cc: string | null;
|
|
53
49
|
bcc: string | null;
|
|
54
|
-
}>;
|
|
55
|
-
create({ body, from, mail_id, subject, bcc, cc, to }: CreateDTO): Promise<{
|
|
56
50
|
body: string;
|
|
57
|
-
id: number;
|
|
58
|
-
from: string;
|
|
59
51
|
created_at: Date;
|
|
52
|
+
id: number;
|
|
60
53
|
updated_at: Date;
|
|
61
|
-
|
|
54
|
+
}>;
|
|
55
|
+
create({ body, from, mail_id, subject, bcc, cc, to }: CreateDTO): Promise<{
|
|
62
56
|
mail_id: number;
|
|
57
|
+
subject: string;
|
|
58
|
+
from: string;
|
|
63
59
|
to: string | null;
|
|
64
60
|
cc: string | null;
|
|
65
61
|
bcc: string | null;
|
|
62
|
+
body: string;
|
|
63
|
+
created_at: Date;
|
|
64
|
+
id: number;
|
|
65
|
+
updated_at: Date;
|
|
66
66
|
}>;
|
|
67
67
|
update(locale: string, { id, data }: {
|
|
68
68
|
id: number;
|
|
69
69
|
data: UpdateDTO;
|
|
70
70
|
}): Promise<{
|
|
71
|
-
body: string;
|
|
72
|
-
id: number;
|
|
73
|
-
from: string;
|
|
74
|
-
created_at: Date;
|
|
75
|
-
updated_at: Date;
|
|
76
|
-
subject: string;
|
|
77
71
|
mail_id: number;
|
|
72
|
+
subject: string;
|
|
73
|
+
from: string;
|
|
78
74
|
to: string | null;
|
|
79
75
|
cc: string | null;
|
|
80
76
|
bcc: string | null;
|
|
77
|
+
body: string;
|
|
78
|
+
created_at: Date;
|
|
79
|
+
id: number;
|
|
80
|
+
updated_at: Date;
|
|
81
81
|
}>;
|
|
82
82
|
delete(locale: string, { ids }: DeleteDTO): Promise<{
|
|
83
83
|
count: number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tool.decorator.d.ts","sourceRoot":"","sources":["../../../src/mcp/decorators/mcp-tool.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAEhF,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAE5C,eAAO,MAAM,OAAO,GAAI,YAAY,iBAAiB,KAAG,eACZ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.McpTool = exports.MCP_TOOL_METADATA = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
exports.MCP_TOOL_METADATA = 'mcp:tool';
|
|
6
|
+
const McpTool = (definition) => (0, common_1.SetMetadata)(exports.MCP_TOOL_METADATA, definition);
|
|
7
|
+
exports.McpTool = McpTool;
|
|
8
|
+
//# sourceMappingURL=mcp-tool.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tool.decorator.js","sourceRoot":"","sources":["../../../src/mcp/decorators/mcp-tool.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAGhC,QAAA,iBAAiB,GAAG,UAAU,CAAC;AAErC,MAAM,OAAO,GAAG,CAAC,UAA6B,EAAmB,EAAE,CACxE,IAAA,oBAAW,EAAC,yBAAiB,EAAE,UAAU,CAAC,CAAC;AADhC,QAAA,OAAO,WACyB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { TokenService } from '../../token/token.service';
|
|
3
|
+
export declare class McpAuthGuard implements CanActivate {
|
|
4
|
+
private readonly tokenService;
|
|
5
|
+
constructor(tokenService: TokenService);
|
|
6
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
7
|
+
private extractToken;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=mcp-auth.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-auth.guard.d.ts","sourceRoot":"","sources":["../../../src/mcp/guards/mcp-auth.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAGjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,qBACa,YAAa,YAAW,WAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAEjD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAc9D,OAAO,CAAC,YAAY;CAIrB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
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.McpAuthGuard = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const token_service_1 = require("../../token/token.service");
|
|
15
|
+
let McpAuthGuard = class McpAuthGuard {
|
|
16
|
+
constructor(tokenService) {
|
|
17
|
+
this.tokenService = tokenService;
|
|
18
|
+
}
|
|
19
|
+
async canActivate(context) {
|
|
20
|
+
var _a, _b, _c;
|
|
21
|
+
const request = context.switchToHttp().getRequest();
|
|
22
|
+
const locale = (_c = (_b = (_a = request.headers['accept-language']) === null || _a === void 0 ? void 0 : _a.split(',')[0]) === null || _b === void 0 ? void 0 : _b.split('-')[0]) !== null && _c !== void 0 ? _c : 'en';
|
|
23
|
+
const token = this.extractToken(request);
|
|
24
|
+
if (!token) {
|
|
25
|
+
throw new common_1.UnauthorizedException('MCP: Bearer token required');
|
|
26
|
+
}
|
|
27
|
+
request['auth'] = await this.tokenService.verify(locale, token);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
extractToken(request) {
|
|
31
|
+
var _a, _b;
|
|
32
|
+
const [type, token] = (_b = (_a = request.headers.authorization) === null || _a === void 0 ? void 0 : _a.split(' ')) !== null && _b !== void 0 ? _b : [];
|
|
33
|
+
return type === 'Bearer' ? token : undefined;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
exports.McpAuthGuard = McpAuthGuard;
|
|
37
|
+
exports.McpAuthGuard = McpAuthGuard = __decorate([
|
|
38
|
+
(0, common_1.Injectable)(),
|
|
39
|
+
__metadata("design:paramtypes", [token_service_1.TokenService])
|
|
40
|
+
], McpAuthGuard);
|
|
41
|
+
//# sourceMappingURL=mcp-auth.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-auth.guard.js","sourceRoot":"","sources":["../../../src/mcp/guards/mcp-auth.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AAExB,6DAAyD;AAGlD,IAAM,YAAY,GAAlB,MAAM,YAAY;IACvB,YAA6B,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAE3D,KAAK,CAAC,WAAW,CAAC,OAAyB;;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAC7D,MAAM,MAAM,GACV,MAAA,MAAA,MAAA,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,0CAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,0CAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,mCAAI,IAAI,CAAC;QAE3E,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,8BAAqB,CAAC,4BAA4B,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,YAAY,CAAC,OAAgB;;QACnC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAA,MAAA,OAAO,CAAC,OAAO,CAAC,aAAa,0CAAE,KAAK,CAAC,GAAG,CAAC,mCAAI,EAAE,CAAC;QACtE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;CACF,CAAA;AArBY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;qCAEgC,4BAAY;GAD5C,YAAY,CAqBxB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PrismaService } from '@hed-hog/api-prisma';
|
|
2
|
+
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
3
|
+
export declare class McpPermissionGuard implements CanActivate {
|
|
4
|
+
private readonly prisma;
|
|
5
|
+
constructor(prisma: PrismaService);
|
|
6
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=mcp-permission.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-permission.guard.d.ts","sourceRoot":"","sources":["../../../src/mcp/guards/mcp-permission.guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,WAAW,EACX,gBAAgB,EAGjB,MAAM,gBAAgB,CAAC;AAGxB,qBACa,kBAAmB,YAAW,WAAW;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAE5C,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CAqC/D"}
|
|
@@ -0,0 +1,57 @@
|
|
|
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.McpPermissionGuard = void 0;
|
|
13
|
+
const api_prisma_1 = require("@hed-hog/api-prisma");
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
let McpPermissionGuard = class McpPermissionGuard {
|
|
16
|
+
constructor(prisma) {
|
|
17
|
+
this.prisma = prisma;
|
|
18
|
+
}
|
|
19
|
+
async canActivate(context) {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
const request = context.switchToHttp().getRequest();
|
|
22
|
+
// Only POST requests carry tool invocations
|
|
23
|
+
if (request.method !== 'POST')
|
|
24
|
+
return true;
|
|
25
|
+
const body = request.body;
|
|
26
|
+
const toolName = (body === null || body === void 0 ? void 0 : body.method) === 'tools/call' ? (_a = body === null || body === void 0 ? void 0 : body.params) === null || _a === void 0 ? void 0 : _a.name : undefined;
|
|
27
|
+
// tools/list, initialize, ping, etc. — no per-tool permission check needed
|
|
28
|
+
if (!toolName)
|
|
29
|
+
return true;
|
|
30
|
+
const userId = (_b = request === null || request === void 0 ? void 0 : request.auth) === null || _b === void 0 ? void 0 : _b.sub;
|
|
31
|
+
const count = await this.prisma.route.count({
|
|
32
|
+
where: {
|
|
33
|
+
type: 'MCP',
|
|
34
|
+
tool_name: toolName,
|
|
35
|
+
role_route: {
|
|
36
|
+
some: {
|
|
37
|
+
role: {
|
|
38
|
+
role_user: {
|
|
39
|
+
some: { user_id: userId },
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
if (count === 0) {
|
|
47
|
+
throw new common_1.ForbiddenException(`Access denied to MCP tool '${toolName}'`);
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
exports.McpPermissionGuard = McpPermissionGuard;
|
|
53
|
+
exports.McpPermissionGuard = McpPermissionGuard = __decorate([
|
|
54
|
+
(0, common_1.Injectable)(),
|
|
55
|
+
__metadata("design:paramtypes", [api_prisma_1.PrismaService])
|
|
56
|
+
], McpPermissionGuard);
|
|
57
|
+
//# sourceMappingURL=mcp-permission.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-permission.guard.js","sourceRoot":"","sources":["../../../src/mcp/guards/mcp-permission.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAoD;AACpD,2CAKwB;AAIjB,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,KAAK,CAAC,WAAW,CAAC,OAAyB;;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAE7D,4CAA4C;QAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAE3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAW,CAAC;QACjC,MAAM,QAAQ,GACZ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,MAAK,YAAY,CAAC,CAAC,CAAC,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,0CAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAEjE,2EAA2E;QAC3E,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAC,OAAe,aAAf,OAAO,uBAAP,OAAO,CAAU,IAAI,0CAAE,GAAG,CAAC;QAE3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YAC1C,KAAK,EAAE;gBACL,IAAI,EAAE,KAAY;gBAClB,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE;4BACJ,SAAS,EAAE;gCACT,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;6BAC1B;yBACF;qBACF;iBACF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,2BAAkB,CAAC,8BAA8B,QAAQ,GAAG,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAxCY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;qCAE0B,0BAAa;GADvC,kBAAkB,CAwC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tool-definition.interface.d.ts","sourceRoot":"","sources":["../../../src/mcp/interfaces/mcp-tool-definition.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tool-definition.interface.js","sourceRoot":"","sources":["../../../src/mcp/interfaces/mcp-tool-definition.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PrismaService } from '@hed-hog/api-prisma';
|
|
2
|
+
interface AuditRecord {
|
|
3
|
+
userId: number;
|
|
4
|
+
toolName: string;
|
|
5
|
+
input: Record<string, any>;
|
|
6
|
+
success: boolean;
|
|
7
|
+
error?: string;
|
|
8
|
+
durationMs: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class McpAuditService {
|
|
11
|
+
private readonly prisma;
|
|
12
|
+
private readonly logger;
|
|
13
|
+
constructor(prisma: PrismaService);
|
|
14
|
+
record(data: AuditRecord): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=mcp-audit.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-audit.service.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-audit.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBACa,eAAe;IAGd,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;gBAE9B,MAAM,EAAE,aAAa;IAE5C,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAiB/C"}
|
|
@@ -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
|
+
var McpAuditService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.McpAuditService = void 0;
|
|
14
|
+
const api_prisma_1 = require("@hed-hog/api-prisma");
|
|
15
|
+
const common_1 = require("@nestjs/common");
|
|
16
|
+
let McpAuditService = McpAuditService_1 = class McpAuditService {
|
|
17
|
+
constructor(prisma) {
|
|
18
|
+
this.prisma = prisma;
|
|
19
|
+
this.logger = new common_1.Logger(McpAuditService_1.name);
|
|
20
|
+
}
|
|
21
|
+
async record(data) {
|
|
22
|
+
var _a;
|
|
23
|
+
const sanitized = JSON.stringify(data.input).slice(0, 1000);
|
|
24
|
+
try {
|
|
25
|
+
await this.prisma.mcp_tool_call_log.create({
|
|
26
|
+
data: {
|
|
27
|
+
user_id: data.userId || null,
|
|
28
|
+
tool_name: data.toolName,
|
|
29
|
+
input: sanitized,
|
|
30
|
+
success: data.success,
|
|
31
|
+
error: (_a = data.error) !== null && _a !== void 0 ? _a : null,
|
|
32
|
+
duration_ms: data.durationMs,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
this.logger.warn(`Failed to persist MCP audit record: ${e.message}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.McpAuditService = McpAuditService;
|
|
42
|
+
exports.McpAuditService = McpAuditService = McpAuditService_1 = __decorate([
|
|
43
|
+
(0, common_1.Injectable)(),
|
|
44
|
+
__metadata("design:paramtypes", [api_prisma_1.PrismaService])
|
|
45
|
+
], McpAuditService);
|
|
46
|
+
//# sourceMappingURL=mcp-audit.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-audit.service.js","sourceRoot":"","sources":["../../src/mcp/mcp-audit.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,oDAAoD;AACpD,2CAAoD;AAY7C,IAAM,eAAe,uBAArB,MAAM,eAAe;IAG1B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;QAFjC,WAAM,GAAG,IAAI,eAAM,CAAC,iBAAe,CAAC,IAAI,CAAC,CAAC;IAEN,CAAC;IAEtD,KAAK,CAAC,MAAM,CAAC,IAAiB;;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC;gBACzC,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;oBAC5B,SAAS,EAAE,IAAI,CAAC,QAAQ;oBACxB,KAAK,EAAE,SAAS;oBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,KAAK,EAAE,MAAA,IAAI,CAAC,KAAK,mCAAI,IAAI;oBACzB,WAAW,EAAE,IAAI,CAAC,UAAU;iBAC7B;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;CACF,CAAA;AAtBY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;qCAI0B,0BAAa;GAHvC,eAAe,CAsB3B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { DiscoveryService } from '@nestjs/core';
|
|
3
|
+
import { Reflector } from '@nestjs/core';
|
|
4
|
+
import { McpToolDefinition } from './interfaces/mcp-tool-definition.interface';
|
|
5
|
+
import { McpContext } from './types/mcp-context.type';
|
|
6
|
+
export interface McpToolEntry {
|
|
7
|
+
definition: McpToolDefinition;
|
|
8
|
+
handler: (args: Record<string, any>, context: McpContext) => Promise<any>;
|
|
9
|
+
}
|
|
10
|
+
export declare class McpRegistryService implements OnModuleInit {
|
|
11
|
+
private readonly discovery;
|
|
12
|
+
private readonly reflector;
|
|
13
|
+
private readonly logger;
|
|
14
|
+
private readonly tools;
|
|
15
|
+
constructor(discovery: DiscoveryService, reflector: Reflector);
|
|
16
|
+
onModuleInit(): void;
|
|
17
|
+
getAll(): McpToolEntry[];
|
|
18
|
+
get(toolName: string): McpToolEntry | undefined;
|
|
19
|
+
has(toolName: string): boolean;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=mcp-registry.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-registry.service.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-registry.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC3E;AAED,qBACa,kBAAmB,YAAW,YAAY;IAKnD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAL5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;gBAGtC,SAAS,EAAE,gBAAgB,EAC3B,SAAS,EAAE,SAAS;IAGvC,YAAY,IAAI,IAAI;IAmCpB,MAAM,IAAI,YAAY,EAAE;IAIxB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI/C,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAG/B"}
|
|
@@ -0,0 +1,69 @@
|
|
|
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 McpRegistryService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.McpRegistryService = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const core_1 = require("@nestjs/core");
|
|
16
|
+
const core_2 = require("@nestjs/core");
|
|
17
|
+
const mcp_tool_decorator_1 = require("./decorators/mcp-tool.decorator");
|
|
18
|
+
let McpRegistryService = McpRegistryService_1 = class McpRegistryService {
|
|
19
|
+
constructor(discovery, reflector) {
|
|
20
|
+
this.discovery = discovery;
|
|
21
|
+
this.reflector = reflector;
|
|
22
|
+
this.logger = new common_1.Logger(McpRegistryService_1.name);
|
|
23
|
+
this.tools = new Map();
|
|
24
|
+
}
|
|
25
|
+
onModuleInit() {
|
|
26
|
+
const providers = this.discovery.getProviders();
|
|
27
|
+
for (const wrapper of providers) {
|
|
28
|
+
const { instance } = wrapper;
|
|
29
|
+
if (!instance || typeof instance !== 'object')
|
|
30
|
+
continue;
|
|
31
|
+
const prototype = Object.getPrototypeOf(instance);
|
|
32
|
+
if (!prototype)
|
|
33
|
+
continue;
|
|
34
|
+
const methodNames = Object.getOwnPropertyNames(prototype).filter((key) => {
|
|
35
|
+
if (key === 'constructor')
|
|
36
|
+
return false;
|
|
37
|
+
const descriptor = Object.getOwnPropertyDescriptor(prototype, key);
|
|
38
|
+
return descriptor !== undefined && typeof descriptor.value === 'function';
|
|
39
|
+
});
|
|
40
|
+
for (const methodName of methodNames) {
|
|
41
|
+
const definition = this.reflector.get(mcp_tool_decorator_1.MCP_TOOL_METADATA, prototype[methodName]);
|
|
42
|
+
if (!definition)
|
|
43
|
+
continue;
|
|
44
|
+
this.logger.log(`Registered MCP tool: ${definition.name}`);
|
|
45
|
+
this.tools.set(definition.name, {
|
|
46
|
+
definition,
|
|
47
|
+
handler: instance[methodName].bind(instance),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
this.logger.log(`McpRegistryService: ${this.tools.size} tools registered`);
|
|
52
|
+
}
|
|
53
|
+
getAll() {
|
|
54
|
+
return Array.from(this.tools.values());
|
|
55
|
+
}
|
|
56
|
+
get(toolName) {
|
|
57
|
+
return this.tools.get(toolName);
|
|
58
|
+
}
|
|
59
|
+
has(toolName) {
|
|
60
|
+
return this.tools.has(toolName);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
exports.McpRegistryService = McpRegistryService;
|
|
64
|
+
exports.McpRegistryService = McpRegistryService = McpRegistryService_1 = __decorate([
|
|
65
|
+
(0, common_1.Injectable)(),
|
|
66
|
+
__metadata("design:paramtypes", [core_1.DiscoveryService,
|
|
67
|
+
core_2.Reflector])
|
|
68
|
+
], McpRegistryService);
|
|
69
|
+
//# sourceMappingURL=mcp-registry.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-registry.service.js","sourceRoot":"","sources":["../../src/mcp/mcp-registry.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAkE;AAClE,uCAAgD;AAChD,uCAAyC;AACzC,wEAAoE;AAU7D,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAI7B,YACmB,SAA2B,EAC3B,SAAoB;QADpB,cAAS,GAAT,SAAS,CAAkB;QAC3B,cAAS,GAAT,SAAS,CAAW;QALtB,WAAM,GAAG,IAAI,eAAM,CAAC,oBAAkB,CAAC,IAAI,CAAC,CAAC;QAC7C,UAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAKtD,CAAC;IAEJ,YAAY;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QAEhD,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;YAC7B,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;gBAAE,SAAS;YAExD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,MAAM,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvE,IAAI,GAAG,KAAK,aAAa;oBAAE,OAAO,KAAK,CAAC;gBACxC,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBACnE,OAAO,UAAU,KAAK,SAAS,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,CAAC;YAC5E,CAAC,CAAC,CAAC;YAEH,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CACnC,sCAAiB,EACjB,SAAS,CAAC,UAAU,CAAC,CACtB,CAAC;gBAEF,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAE1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC3D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE;oBAC9B,UAAU;oBACV,OAAO,EAAG,QAAgB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;iBACtD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,KAAK,CAAC,IAAI,mBAAmB,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;CACF,CAAA;AAvDY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;qCAMmB,uBAAgB;QAChB,gBAAS;GAN5B,kBAAkB,CAuD9B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { McpAuditService } from './mcp-audit.service';
|
|
3
|
+
import { McpRegistryService } from './mcp-registry.service';
|
|
4
|
+
import { McpContext } from './types/mcp-context.type';
|
|
5
|
+
export declare class McpServerService {
|
|
6
|
+
private readonly registry;
|
|
7
|
+
private readonly audit;
|
|
8
|
+
constructor(registry: McpRegistryService, audit: McpAuditService);
|
|
9
|
+
handleRequest(req: Request, res: Response, context: McpContext): Promise<void>;
|
|
10
|
+
private buildServer;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=mcp-server.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.service.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-server.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,qBACa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,eAAe;IAGnC,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IASpF,OAAO,CAAC,WAAW;CA0DpB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
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.McpServerService = void 0;
|
|
13
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
14
|
+
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
15
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const mcp_audit_service_1 = require("./mcp-audit.service");
|
|
18
|
+
const mcp_registry_service_1 = require("./mcp-registry.service");
|
|
19
|
+
let McpServerService = class McpServerService {
|
|
20
|
+
constructor(registry, audit) {
|
|
21
|
+
this.registry = registry;
|
|
22
|
+
this.audit = audit;
|
|
23
|
+
}
|
|
24
|
+
async handleRequest(req, res, context) {
|
|
25
|
+
const server = this.buildServer(context);
|
|
26
|
+
const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
|
|
27
|
+
sessionIdGenerator: undefined,
|
|
28
|
+
});
|
|
29
|
+
await server.connect(transport);
|
|
30
|
+
await transport.handleRequest(req, res, req.body);
|
|
31
|
+
}
|
|
32
|
+
buildServer(context) {
|
|
33
|
+
const server = new index_js_1.Server({ name: 'hedhog-mcp', version: '1.0.0' }, { capabilities: { tools: {} } });
|
|
34
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
|
|
35
|
+
tools: this.registry.getAll().map((e) => {
|
|
36
|
+
var _a;
|
|
37
|
+
return ({
|
|
38
|
+
name: e.definition.name,
|
|
39
|
+
description: e.definition.description,
|
|
40
|
+
inputSchema: (_a = e.definition.inputSchema) !== null && _a !== void 0 ? _a : {
|
|
41
|
+
type: 'object',
|
|
42
|
+
properties: {},
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}),
|
|
46
|
+
}));
|
|
47
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
48
|
+
var _a;
|
|
49
|
+
const toolName = request.params.name;
|
|
50
|
+
const args = ((_a = request.params.arguments) !== null && _a !== void 0 ? _a : {});
|
|
51
|
+
const entry = this.registry.get(toolName);
|
|
52
|
+
if (!entry) {
|
|
53
|
+
return {
|
|
54
|
+
isError: true,
|
|
55
|
+
content: [{ type: 'text', text: `Tool '${toolName}' not found` }],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const start = Date.now();
|
|
59
|
+
try {
|
|
60
|
+
const result = await entry.handler(args, Object.assign(Object.assign({}, context), { toolName }));
|
|
61
|
+
await this.audit.record({
|
|
62
|
+
userId: context.userId,
|
|
63
|
+
toolName,
|
|
64
|
+
input: args,
|
|
65
|
+
success: true,
|
|
66
|
+
durationMs: Date.now() - start,
|
|
67
|
+
});
|
|
68
|
+
return { content: [{ type: 'text', text: JSON.stringify(result) }] };
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
await this.audit.record({
|
|
72
|
+
userId: context.userId,
|
|
73
|
+
toolName,
|
|
74
|
+
input: args,
|
|
75
|
+
success: false,
|
|
76
|
+
error: e.message,
|
|
77
|
+
durationMs: Date.now() - start,
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
isError: true,
|
|
81
|
+
content: [{ type: 'text', text: e.message }],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
return server;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
exports.McpServerService = McpServerService;
|
|
89
|
+
exports.McpServerService = McpServerService = __decorate([
|
|
90
|
+
(0, common_1.Injectable)(),
|
|
91
|
+
__metadata("design:paramtypes", [mcp_registry_service_1.McpRegistryService,
|
|
92
|
+
mcp_audit_service_1.McpAuditService])
|
|
93
|
+
], McpServerService);
|
|
94
|
+
//# sourceMappingURL=mcp-server.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.service.js","sourceRoot":"","sources":["../../src/mcp/mcp-server.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { McpServerService } from './mcp-server.service';
|
|
3
|
+
export declare class McpController {
|
|
4
|
+
private readonly mcpServer;
|
|
5
|
+
constructor(mcpServer: McpServerService);
|
|
6
|
+
handle(req: Request, res: Response): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=mcp.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.controller.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,qBAGa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,gBAAgB;IAGlD,MAAM,CAAQ,GAAG,EAAE,OAAO,EAAS,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAevE"}
|