@promptpartner/bexio-mcp-server 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +161 -0
- package/dist/bexio-client.d.ts +350 -0
- package/dist/bexio-client.js +1045 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +80 -0
- package/dist/logger.d.ts +17 -0
- package/dist/logger.js +28 -0
- package/dist/server.d.ts +18 -0
- package/dist/server.js +81 -0
- package/dist/shared/errors.d.ts +21 -0
- package/dist/shared/errors.js +54 -0
- package/dist/shared/index.d.ts +5 -0
- package/dist/shared/index.js +5 -0
- package/dist/shared/response.d.ts +24 -0
- package/dist/shared/response.js +92 -0
- package/dist/tools/accounting/definitions.d.ts +9 -0
- package/dist/tools/accounting/definitions.js +345 -0
- package/dist/tools/accounting/handlers.d.ts +10 -0
- package/dist/tools/accounting/handlers.js +121 -0
- package/dist/tools/accounting/index.d.ts +16 -0
- package/dist/tools/accounting/index.js +16 -0
- package/dist/tools/banking/definitions.d.ts +11 -0
- package/dist/tools/banking/definitions.js +349 -0
- package/dist/tools/banking/handlers.d.ts +9 -0
- package/dist/tools/banking/handlers.js +123 -0
- package/dist/tools/banking/index.d.ts +6 -0
- package/dist/tools/banking/index.js +6 -0
- package/dist/tools/company/definitions.d.ts +7 -0
- package/dist/tools/company/definitions.js +87 -0
- package/dist/tools/company/handlers.d.ts +7 -0
- package/dist/tools/company/handlers.js +31 -0
- package/dist/tools/company/index.d.ts +6 -0
- package/dist/tools/company/index.js +6 -0
- package/dist/tools/contacts/definitions.d.ts +6 -0
- package/dist/tools/contacts/definitions.js +150 -0
- package/dist/tools/contacts/handlers.d.ts +7 -0
- package/dist/tools/contacts/handlers.js +40 -0
- package/dist/tools/contacts/index.d.ts +6 -0
- package/dist/tools/contacts/index.js +5 -0
- package/dist/tools/deliveries/definitions.d.ts +6 -0
- package/dist/tools/deliveries/definitions.js +67 -0
- package/dist/tools/deliveries/handlers.d.ts +7 -0
- package/dist/tools/deliveries/handlers.js +28 -0
- package/dist/tools/deliveries/index.d.ts +6 -0
- package/dist/tools/deliveries/index.js +5 -0
- package/dist/tools/files/definitions.d.ts +6 -0
- package/dist/tools/files/definitions.js +217 -0
- package/dist/tools/files/handlers.d.ts +7 -0
- package/dist/tools/files/handlers.js +63 -0
- package/dist/tools/files/index.d.ts +6 -0
- package/dist/tools/files/index.js +5 -0
- package/dist/tools/index.d.ts +19 -0
- package/dist/tools/index.js +93 -0
- package/dist/tools/invoices/definitions.d.ts +6 -0
- package/dist/tools/invoices/definitions.js +147 -0
- package/dist/tools/invoices/handlers.d.ts +7 -0
- package/dist/tools/invoices/handlers.js +119 -0
- package/dist/tools/invoices/index.d.ts +6 -0
- package/dist/tools/invoices/index.js +5 -0
- package/dist/tools/items/definitions.d.ts +6 -0
- package/dist/tools/items/definitions.js +100 -0
- package/dist/tools/items/handlers.d.ts +7 -0
- package/dist/tools/items/handlers.js +36 -0
- package/dist/tools/items/index.d.ts +6 -0
- package/dist/tools/items/index.js +5 -0
- package/dist/tools/misc/definitions.d.ts +6 -0
- package/dist/tools/misc/definitions.js +126 -0
- package/dist/tools/misc/handlers.d.ts +7 -0
- package/dist/tools/misc/handlers.js +52 -0
- package/dist/tools/misc/index.d.ts +6 -0
- package/dist/tools/misc/index.js +5 -0
- package/dist/tools/orders/definitions.d.ts +6 -0
- package/dist/tools/orders/definitions.js +114 -0
- package/dist/tools/orders/handlers.d.ts +7 -0
- package/dist/tools/orders/handlers.js +62 -0
- package/dist/tools/orders/index.d.ts +6 -0
- package/dist/tools/orders/index.js +5 -0
- package/dist/tools/payments/definitions.d.ts +6 -0
- package/dist/tools/payments/definitions.js +74 -0
- package/dist/tools/payments/handlers.d.ts +7 -0
- package/dist/tools/payments/handlers.js +28 -0
- package/dist/tools/payments/index.d.ts +6 -0
- package/dist/tools/payments/index.js +5 -0
- package/dist/tools/payroll/definitions.d.ts +15 -0
- package/dist/tools/payroll/definitions.js +239 -0
- package/dist/tools/payroll/handlers.d.ts +14 -0
- package/dist/tools/payroll/handlers.js +152 -0
- package/dist/tools/payroll/index.d.ts +16 -0
- package/dist/tools/payroll/index.js +16 -0
- package/dist/tools/projects/definitions.d.ts +7 -0
- package/dist/tools/projects/definitions.js +430 -0
- package/dist/tools/projects/handlers.d.ts +7 -0
- package/dist/tools/projects/handlers.js +127 -0
- package/dist/tools/projects/index.d.ts +6 -0
- package/dist/tools/projects/index.js +6 -0
- package/dist/tools/purchase/definitions.d.ts +6 -0
- package/dist/tools/purchase/definitions.js +381 -0
- package/dist/tools/purchase/handlers.d.ts +7 -0
- package/dist/tools/purchase/handlers.js +120 -0
- package/dist/tools/purchase/index.d.ts +7 -0
- package/dist/tools/purchase/index.js +6 -0
- package/dist/tools/quotes/definitions.d.ts +6 -0
- package/dist/tools/quotes/definitions.js +174 -0
- package/dist/tools/quotes/handlers.d.ts +7 -0
- package/dist/tools/quotes/handlers.js +79 -0
- package/dist/tools/quotes/index.d.ts +6 -0
- package/dist/tools/quotes/index.js +5 -0
- package/dist/tools/reference/definitions.d.ts +7 -0
- package/dist/tools/reference/definitions.js +421 -0
- package/dist/tools/reference/handlers.d.ts +7 -0
- package/dist/tools/reference/handlers.js +161 -0
- package/dist/tools/reference/index.d.ts +6 -0
- package/dist/tools/reference/index.js +6 -0
- package/dist/tools/reminders/definitions.d.ts +6 -0
- package/dist/tools/reminders/definitions.js +132 -0
- package/dist/tools/reminders/handlers.d.ts +7 -0
- package/dist/tools/reminders/handlers.js +43 -0
- package/dist/tools/reminders/index.d.ts +6 -0
- package/dist/tools/reminders/index.js +5 -0
- package/dist/tools/reports/definitions.d.ts +6 -0
- package/dist/tools/reports/definitions.js +133 -0
- package/dist/tools/reports/handlers.d.ts +7 -0
- package/dist/tools/reports/handlers.js +33 -0
- package/dist/tools/reports/index.d.ts +6 -0
- package/dist/tools/reports/index.js +5 -0
- package/dist/tools/timetracking/definitions.d.ts +9 -0
- package/dist/tools/timetracking/definitions.js +226 -0
- package/dist/tools/timetracking/handlers.d.ts +9 -0
- package/dist/tools/timetracking/handlers.js +88 -0
- package/dist/tools/timetracking/index.d.ts +6 -0
- package/dist/tools/timetracking/index.js +6 -0
- package/dist/tools/users/definitions.d.ts +6 -0
- package/dist/tools/users/definitions.js +93 -0
- package/dist/tools/users/handlers.d.ts +7 -0
- package/dist/tools/users/handlers.js +35 -0
- package/dist/tools/users/index.d.ts +6 -0
- package/dist/tools/users/index.js +5 -0
- package/dist/transports/http.d.ts +17 -0
- package/dist/transports/http.js +203 -0
- package/dist/transports/index.d.ts +4 -0
- package/dist/transports/index.js +4 -0
- package/dist/types/common.d.ts +32 -0
- package/dist/types/common.js +11 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.js +11 -0
- package/dist/types/schemas/accounting.d.ts +225 -0
- package/dist/types/schemas/accounting.js +96 -0
- package/dist/types/schemas/banking.d.ts +207 -0
- package/dist/types/schemas/banking.js +86 -0
- package/dist/types/schemas/company.d.ts +44 -0
- package/dist/types/schemas/company.js +23 -0
- package/dist/types/schemas/contacts.d.ts +104 -0
- package/dist/types/schemas/contacts.js +42 -0
- package/dist/types/schemas/deliveries.d.ts +40 -0
- package/dist/types/schemas/deliveries.js +22 -0
- package/dist/types/schemas/files.d.ts +152 -0
- package/dist/types/schemas/files.js +64 -0
- package/dist/types/schemas/index.d.ts +24 -0
- package/dist/types/schemas/index.js +44 -0
- package/dist/types/schemas/invoices.d.ts +594 -0
- package/dist/types/schemas/invoices.js +109 -0
- package/dist/types/schemas/items.d.ts +153 -0
- package/dist/types/schemas/items.js +43 -0
- package/dist/types/schemas/misc.d.ts +64 -0
- package/dist/types/schemas/misc.js +36 -0
- package/dist/types/schemas/orders.d.ts +657 -0
- package/dist/types/schemas/orders.js +101 -0
- package/dist/types/schemas/payments.d.ts +46 -0
- package/dist/types/schemas/payments.js +24 -0
- package/dist/types/schemas/payroll.d.ts +146 -0
- package/dist/types/schemas/payroll.js +65 -0
- package/dist/types/schemas/projects.d.ts +268 -0
- package/dist/types/schemas/projects.js +102 -0
- package/dist/types/schemas/purchase.d.ts +228 -0
- package/dist/types/schemas/purchase.js +114 -0
- package/dist/types/schemas/quotes.d.ts +102 -0
- package/dist/types/schemas/quotes.js +49 -0
- package/dist/types/schemas/reference.d.ts +240 -0
- package/dist/types/schemas/reference.js +99 -0
- package/dist/types/schemas/reminders.d.ts +76 -0
- package/dist/types/schemas/reminders.js +38 -0
- package/dist/types/schemas/reports.d.ts +69 -0
- package/dist/types/schemas/reports.js +36 -0
- package/dist/types/schemas/timetracking.d.ts +150 -0
- package/dist/types/schemas/timetracking.js +68 -0
- package/dist/types/schemas/users.d.ts +51 -0
- package/dist/types/schemas/users.js +27 -0
- package/dist/ui/contact-card/mcp-app.d.ts +1 -0
- package/dist/ui/contact-card/mcp-app.js +108 -0
- package/dist/ui/dashboard/mcp-app.d.ts +1 -0
- package/dist/ui/dashboard/mcp-app.js +81 -0
- package/dist/ui/invoice-preview/mcp-app.d.ts +1 -0
- package/dist/ui/invoice-preview/mcp-app.js +96 -0
- package/dist/ui-resources.d.ts +17 -0
- package/dist/ui-resources.js +124 -0
- package/dist/vite.config.d.ts +2 -0
- package/dist/vite.config.js +46 -0
- package/package.json +78 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time Tracking Zod schemas and types.
|
|
3
|
+
* Domain: Time Tracking (Timesheets, Statuses, Business Activities, Communication Types)
|
|
4
|
+
*
|
|
5
|
+
* IMPORTANT: Duration format is "HH:MM" (e.g., "02:30" for 2.5 hours) per Bexio API requirements.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
export declare const ListTimesheetsParamsSchema: z.ZodObject<{
|
|
9
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
10
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
}, "strip", z.ZodTypeAny, {
|
|
12
|
+
limit: number;
|
|
13
|
+
offset: number;
|
|
14
|
+
}, {
|
|
15
|
+
limit?: number | undefined;
|
|
16
|
+
offset?: number | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export type ListTimesheetsParams = z.infer<typeof ListTimesheetsParamsSchema>;
|
|
19
|
+
export declare const GetTimesheetParamsSchema: z.ZodObject<{
|
|
20
|
+
timesheet_id: z.ZodNumber;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
timesheet_id: number;
|
|
23
|
+
}, {
|
|
24
|
+
timesheet_id: number;
|
|
25
|
+
}>;
|
|
26
|
+
export type GetTimesheetParams = z.infer<typeof GetTimesheetParamsSchema>;
|
|
27
|
+
/**
|
|
28
|
+
* Schema for creating a new timesheet entry.
|
|
29
|
+
* Duration MUST be in HH:MM format (e.g., "02:30" for 2.5 hours).
|
|
30
|
+
*/
|
|
31
|
+
export declare const CreateTimesheetParamsSchema: z.ZodObject<{
|
|
32
|
+
user_id: z.ZodNumber;
|
|
33
|
+
date: z.ZodString;
|
|
34
|
+
duration: z.ZodString;
|
|
35
|
+
pr_project_id: z.ZodOptional<z.ZodNumber>;
|
|
36
|
+
pr_package_id: z.ZodOptional<z.ZodNumber>;
|
|
37
|
+
pr_milestone_id: z.ZodOptional<z.ZodNumber>;
|
|
38
|
+
client_service_id: z.ZodOptional<z.ZodNumber>;
|
|
39
|
+
text: z.ZodOptional<z.ZodString>;
|
|
40
|
+
allowable_bill: z.ZodDefault<z.ZodBoolean>;
|
|
41
|
+
}, "strip", z.ZodTypeAny, {
|
|
42
|
+
date: string;
|
|
43
|
+
user_id: number;
|
|
44
|
+
duration: string;
|
|
45
|
+
allowable_bill: boolean;
|
|
46
|
+
text?: string | undefined;
|
|
47
|
+
pr_project_id?: number | undefined;
|
|
48
|
+
pr_package_id?: number | undefined;
|
|
49
|
+
pr_milestone_id?: number | undefined;
|
|
50
|
+
client_service_id?: number | undefined;
|
|
51
|
+
}, {
|
|
52
|
+
date: string;
|
|
53
|
+
user_id: number;
|
|
54
|
+
duration: string;
|
|
55
|
+
text?: string | undefined;
|
|
56
|
+
pr_project_id?: number | undefined;
|
|
57
|
+
pr_package_id?: number | undefined;
|
|
58
|
+
pr_milestone_id?: number | undefined;
|
|
59
|
+
client_service_id?: number | undefined;
|
|
60
|
+
allowable_bill?: boolean | undefined;
|
|
61
|
+
}>;
|
|
62
|
+
export type CreateTimesheetParams = z.infer<typeof CreateTimesheetParamsSchema>;
|
|
63
|
+
export declare const DeleteTimesheetParamsSchema: z.ZodObject<{
|
|
64
|
+
timesheet_id: z.ZodNumber;
|
|
65
|
+
}, "strip", z.ZodTypeAny, {
|
|
66
|
+
timesheet_id: number;
|
|
67
|
+
}, {
|
|
68
|
+
timesheet_id: number;
|
|
69
|
+
}>;
|
|
70
|
+
export type DeleteTimesheetParams = z.infer<typeof DeleteTimesheetParamsSchema>;
|
|
71
|
+
/**
|
|
72
|
+
* Search criteria for timesheets.
|
|
73
|
+
* Supports field/value/criteria pattern used by Bexio search API.
|
|
74
|
+
*/
|
|
75
|
+
export declare const SearchTimesheetsParamsSchema: z.ZodObject<{
|
|
76
|
+
search_criteria: z.ZodArray<z.ZodObject<{
|
|
77
|
+
field: z.ZodString;
|
|
78
|
+
value: z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>;
|
|
79
|
+
criteria: z.ZodOptional<z.ZodString>;
|
|
80
|
+
}, "strip", z.ZodTypeAny, {
|
|
81
|
+
field: string;
|
|
82
|
+
value: string | number | boolean;
|
|
83
|
+
criteria?: string | undefined;
|
|
84
|
+
}, {
|
|
85
|
+
field: string;
|
|
86
|
+
value: string | number | boolean;
|
|
87
|
+
criteria?: string | undefined;
|
|
88
|
+
}>, "many">;
|
|
89
|
+
}, "strip", z.ZodTypeAny, {
|
|
90
|
+
search_criteria: {
|
|
91
|
+
field: string;
|
|
92
|
+
value: string | number | boolean;
|
|
93
|
+
criteria?: string | undefined;
|
|
94
|
+
}[];
|
|
95
|
+
}, {
|
|
96
|
+
search_criteria: {
|
|
97
|
+
field: string;
|
|
98
|
+
value: string | number | boolean;
|
|
99
|
+
criteria?: string | undefined;
|
|
100
|
+
}[];
|
|
101
|
+
}>;
|
|
102
|
+
export type SearchTimesheetsParams = z.infer<typeof SearchTimesheetsParamsSchema>;
|
|
103
|
+
export declare const ListTimesheetStatusesParamsSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
104
|
+
export type ListTimesheetStatusesParams = z.infer<typeof ListTimesheetStatusesParamsSchema>;
|
|
105
|
+
export declare const ListBusinessActivitiesParamsSchema: z.ZodObject<{
|
|
106
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
107
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
108
|
+
}, "strip", z.ZodTypeAny, {
|
|
109
|
+
limit: number;
|
|
110
|
+
offset: number;
|
|
111
|
+
}, {
|
|
112
|
+
limit?: number | undefined;
|
|
113
|
+
offset?: number | undefined;
|
|
114
|
+
}>;
|
|
115
|
+
export type ListBusinessActivitiesParams = z.infer<typeof ListBusinessActivitiesParamsSchema>;
|
|
116
|
+
export declare const GetBusinessActivityParamsSchema: z.ZodObject<{
|
|
117
|
+
activity_id: z.ZodNumber;
|
|
118
|
+
}, "strip", z.ZodTypeAny, {
|
|
119
|
+
activity_id: number;
|
|
120
|
+
}, {
|
|
121
|
+
activity_id: number;
|
|
122
|
+
}>;
|
|
123
|
+
export type GetBusinessActivityParams = z.infer<typeof GetBusinessActivityParamsSchema>;
|
|
124
|
+
export declare const CreateBusinessActivityParamsSchema: z.ZodObject<{
|
|
125
|
+
name: z.ZodString;
|
|
126
|
+
}, "strip", z.ZodTypeAny, {
|
|
127
|
+
name: string;
|
|
128
|
+
}, {
|
|
129
|
+
name: string;
|
|
130
|
+
}>;
|
|
131
|
+
export type CreateBusinessActivityParams = z.infer<typeof CreateBusinessActivityParamsSchema>;
|
|
132
|
+
export declare const ListCommunicationTypesParamsSchema: z.ZodObject<{
|
|
133
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
134
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
135
|
+
}, "strip", z.ZodTypeAny, {
|
|
136
|
+
limit: number;
|
|
137
|
+
offset: number;
|
|
138
|
+
}, {
|
|
139
|
+
limit?: number | undefined;
|
|
140
|
+
offset?: number | undefined;
|
|
141
|
+
}>;
|
|
142
|
+
export type ListCommunicationTypesParams = z.infer<typeof ListCommunicationTypesParamsSchema>;
|
|
143
|
+
export declare const GetCommunicationTypeParamsSchema: z.ZodObject<{
|
|
144
|
+
type_id: z.ZodNumber;
|
|
145
|
+
}, "strip", z.ZodTypeAny, {
|
|
146
|
+
type_id: number;
|
|
147
|
+
}, {
|
|
148
|
+
type_id: number;
|
|
149
|
+
}>;
|
|
150
|
+
export type GetCommunicationTypeParams = z.infer<typeof GetCommunicationTypeParamsSchema>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time Tracking Zod schemas and types.
|
|
3
|
+
* Domain: Time Tracking (Timesheets, Statuses, Business Activities, Communication Types)
|
|
4
|
+
*
|
|
5
|
+
* IMPORTANT: Duration format is "HH:MM" (e.g., "02:30" for 2.5 hours) per Bexio API requirements.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
// ===== TIMESHEETS (PROJ-06) =====
|
|
9
|
+
export const ListTimesheetsParamsSchema = z.object({
|
|
10
|
+
limit: z.number().int().positive().default(100),
|
|
11
|
+
offset: z.number().int().min(0).default(0),
|
|
12
|
+
});
|
|
13
|
+
export const GetTimesheetParamsSchema = z.object({
|
|
14
|
+
timesheet_id: z.number().int().positive(),
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Schema for creating a new timesheet entry.
|
|
18
|
+
* Duration MUST be in HH:MM format (e.g., "02:30" for 2.5 hours).
|
|
19
|
+
*/
|
|
20
|
+
export const CreateTimesheetParamsSchema = z.object({
|
|
21
|
+
// Required fields
|
|
22
|
+
user_id: z.number().int().positive({ message: "User ID is required and must be positive" }),
|
|
23
|
+
date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in YYYY-MM-DD format"),
|
|
24
|
+
duration: z.string().regex(/^\d{2}:\d{2}$/, "Duration must be in HH:MM format (e.g., '02:30' for 2.5 hours)"),
|
|
25
|
+
// Optional linking fields
|
|
26
|
+
pr_project_id: z.number().int().positive().optional(),
|
|
27
|
+
pr_package_id: z.number().int().positive().optional(),
|
|
28
|
+
pr_milestone_id: z.number().int().positive().optional(),
|
|
29
|
+
client_service_id: z.number().int().positive().optional(),
|
|
30
|
+
// Optional metadata
|
|
31
|
+
text: z.string().optional(),
|
|
32
|
+
allowable_bill: z.boolean().default(true),
|
|
33
|
+
});
|
|
34
|
+
export const DeleteTimesheetParamsSchema = z.object({
|
|
35
|
+
timesheet_id: z.number().int().positive(),
|
|
36
|
+
});
|
|
37
|
+
/**
|
|
38
|
+
* Search criteria for timesheets.
|
|
39
|
+
* Supports field/value/criteria pattern used by Bexio search API.
|
|
40
|
+
*/
|
|
41
|
+
export const SearchTimesheetsParamsSchema = z.object({
|
|
42
|
+
search_criteria: z.array(z.object({
|
|
43
|
+
field: z.string(),
|
|
44
|
+
value: z.union([z.string(), z.number(), z.boolean()]),
|
|
45
|
+
criteria: z.string().optional(),
|
|
46
|
+
})).min(1, "At least one search criterion is required"),
|
|
47
|
+
});
|
|
48
|
+
// ===== TIMESHEET STATUSES (PROJ-07) =====
|
|
49
|
+
export const ListTimesheetStatusesParamsSchema = z.object({});
|
|
50
|
+
// ===== BUSINESS ACTIVITIES (PROJ-08) =====
|
|
51
|
+
export const ListBusinessActivitiesParamsSchema = z.object({
|
|
52
|
+
limit: z.number().int().positive().default(100),
|
|
53
|
+
offset: z.number().int().min(0).default(0),
|
|
54
|
+
});
|
|
55
|
+
export const GetBusinessActivityParamsSchema = z.object({
|
|
56
|
+
activity_id: z.number().int().positive(),
|
|
57
|
+
});
|
|
58
|
+
export const CreateBusinessActivityParamsSchema = z.object({
|
|
59
|
+
name: z.string().min(1, "Name is required"),
|
|
60
|
+
});
|
|
61
|
+
// ===== COMMUNICATION TYPES (PROJ-09) =====
|
|
62
|
+
export const ListCommunicationTypesParamsSchema = z.object({
|
|
63
|
+
limit: z.number().int().positive().default(100),
|
|
64
|
+
offset: z.number().int().min(0).default(0),
|
|
65
|
+
});
|
|
66
|
+
export const GetCommunicationTypeParamsSchema = z.object({
|
|
67
|
+
type_id: z.number().int().positive(),
|
|
68
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-related Zod schemas and types.
|
|
3
|
+
* Domain: Users (Fictional Users)
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export declare const ListFictionalUsersParamsSchema: z.ZodObject<{
|
|
7
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
8
|
+
offset: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
limit: number;
|
|
11
|
+
offset: number;
|
|
12
|
+
}, {
|
|
13
|
+
limit?: number | undefined;
|
|
14
|
+
offset?: number | undefined;
|
|
15
|
+
}>;
|
|
16
|
+
export type ListFictionalUsersParams = z.infer<typeof ListFictionalUsersParamsSchema>;
|
|
17
|
+
export declare const GetFictionalUserParamsSchema: z.ZodObject<{
|
|
18
|
+
user_id: z.ZodNumber;
|
|
19
|
+
}, "strip", z.ZodTypeAny, {
|
|
20
|
+
user_id: number;
|
|
21
|
+
}, {
|
|
22
|
+
user_id: number;
|
|
23
|
+
}>;
|
|
24
|
+
export type GetFictionalUserParams = z.infer<typeof GetFictionalUserParamsSchema>;
|
|
25
|
+
export declare const CreateFictionalUserParamsSchema: z.ZodObject<{
|
|
26
|
+
user_data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
27
|
+
}, "strip", z.ZodTypeAny, {
|
|
28
|
+
user_data: Record<string, unknown>;
|
|
29
|
+
}, {
|
|
30
|
+
user_data: Record<string, unknown>;
|
|
31
|
+
}>;
|
|
32
|
+
export type CreateFictionalUserParams = z.infer<typeof CreateFictionalUserParamsSchema>;
|
|
33
|
+
export declare const UpdateFictionalUserParamsSchema: z.ZodObject<{
|
|
34
|
+
user_id: z.ZodNumber;
|
|
35
|
+
user_data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
user_id: number;
|
|
38
|
+
user_data: Record<string, unknown>;
|
|
39
|
+
}, {
|
|
40
|
+
user_id: number;
|
|
41
|
+
user_data: Record<string, unknown>;
|
|
42
|
+
}>;
|
|
43
|
+
export type UpdateFictionalUserParams = z.infer<typeof UpdateFictionalUserParamsSchema>;
|
|
44
|
+
export declare const DeleteFictionalUserParamsSchema: z.ZodObject<{
|
|
45
|
+
user_id: z.ZodNumber;
|
|
46
|
+
}, "strip", z.ZodTypeAny, {
|
|
47
|
+
user_id: number;
|
|
48
|
+
}, {
|
|
49
|
+
user_id: number;
|
|
50
|
+
}>;
|
|
51
|
+
export type DeleteFictionalUserParams = z.infer<typeof DeleteFictionalUserParamsSchema>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-related Zod schemas and types.
|
|
3
|
+
* Domain: Users (Fictional Users)
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
// List fictional users
|
|
7
|
+
export const ListFictionalUsersParamsSchema = z.object({
|
|
8
|
+
limit: z.number().int().positive().default(50),
|
|
9
|
+
offset: z.number().int().min(0).default(0),
|
|
10
|
+
});
|
|
11
|
+
// Get single fictional user
|
|
12
|
+
export const GetFictionalUserParamsSchema = z.object({
|
|
13
|
+
user_id: z.number().int().positive(),
|
|
14
|
+
});
|
|
15
|
+
// Create fictional user
|
|
16
|
+
export const CreateFictionalUserParamsSchema = z.object({
|
|
17
|
+
user_data: z.record(z.unknown()),
|
|
18
|
+
});
|
|
19
|
+
// Update fictional user
|
|
20
|
+
export const UpdateFictionalUserParamsSchema = z.object({
|
|
21
|
+
user_id: z.number().int().positive(),
|
|
22
|
+
user_data: z.record(z.unknown()),
|
|
23
|
+
});
|
|
24
|
+
// Delete fictional user
|
|
25
|
+
export const DeleteFictionalUserParamsSchema = z.object({
|
|
26
|
+
user_id: z.number().int().positive(),
|
|
27
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { App } from "@modelcontextprotocol/ext-apps";
|
|
2
|
+
const appEl = document.getElementById("app");
|
|
3
|
+
const app = new App({ name: "Contact Card", version: "1.0.0" });
|
|
4
|
+
app.ontoolresult = (result) => {
|
|
5
|
+
const text = result.content?.find((c) => c.type === "text")?.text;
|
|
6
|
+
if (text) {
|
|
7
|
+
try {
|
|
8
|
+
const contact = JSON.parse(text);
|
|
9
|
+
renderContact(contact);
|
|
10
|
+
}
|
|
11
|
+
catch (e) {
|
|
12
|
+
appEl.innerHTML = `<div class="loading">Error parsing contact data</div>`;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
app.connect();
|
|
17
|
+
function getInitials(name1, name2) {
|
|
18
|
+
const parts = [name1, name2].filter(Boolean);
|
|
19
|
+
return parts.map(p => p.charAt(0).toUpperCase()).join("").slice(0, 2) || "?";
|
|
20
|
+
}
|
|
21
|
+
function getCountryName(countryId) {
|
|
22
|
+
const countries = {
|
|
23
|
+
1: "Switzerland",
|
|
24
|
+
2: "Germany",
|
|
25
|
+
3: "Austria",
|
|
26
|
+
4: "France",
|
|
27
|
+
5: "Italy",
|
|
28
|
+
6: "Liechtenstein",
|
|
29
|
+
};
|
|
30
|
+
return countryId ? countries[countryId] || `Country #${countryId}` : "";
|
|
31
|
+
}
|
|
32
|
+
function renderContact(contact) {
|
|
33
|
+
const fullName = [contact.name_1, contact.name_2].filter(Boolean).join(" ");
|
|
34
|
+
const initials = getInitials(contact.name_1, contact.name_2);
|
|
35
|
+
const isCompany = contact.contact_type_id === 1;
|
|
36
|
+
const typeBadge = isCompany ? "Company" : "Person";
|
|
37
|
+
const typeClass = isCompany ? "type-company" : "type-person";
|
|
38
|
+
const addressParts = [
|
|
39
|
+
contact.address,
|
|
40
|
+
[contact.postcode, contact.city].filter(Boolean).join(" "),
|
|
41
|
+
getCountryName(contact.country_id),
|
|
42
|
+
].filter(Boolean);
|
|
43
|
+
const hasContactInfo = contact.mail || contact.phone_fixed || contact.phone_mobile || contact.fax;
|
|
44
|
+
const hasAddress = addressParts.length > 0;
|
|
45
|
+
appEl.className = "card";
|
|
46
|
+
appEl.innerHTML = `
|
|
47
|
+
<div class="card-header">
|
|
48
|
+
<div class="avatar">${initials}</div>
|
|
49
|
+
<h1>${fullName}</h1>
|
|
50
|
+
${contact.url ? `<div class="company">${contact.url}</div>` : ""}
|
|
51
|
+
<span class="type-badge ${typeClass}">${typeBadge}</span>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="card-body">
|
|
54
|
+
${hasContactInfo ? `
|
|
55
|
+
<div class="info-section">
|
|
56
|
+
<div class="info-label">Contact Information</div>
|
|
57
|
+
${contact.mail ? `
|
|
58
|
+
<div class="info-row">
|
|
59
|
+
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
60
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/>
|
|
61
|
+
</svg>
|
|
62
|
+
<span class="info-value"><a href="mailto:${contact.mail}">${contact.mail}</a></span>
|
|
63
|
+
</div>
|
|
64
|
+
` : ""}
|
|
65
|
+
${contact.phone_fixed ? `
|
|
66
|
+
<div class="info-row">
|
|
67
|
+
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
68
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"/>
|
|
69
|
+
</svg>
|
|
70
|
+
<span class="info-value"><a href="tel:${contact.phone_fixed}">${contact.phone_fixed}</a></span>
|
|
71
|
+
</div>
|
|
72
|
+
` : ""}
|
|
73
|
+
${contact.phone_mobile ? `
|
|
74
|
+
<div class="info-row">
|
|
75
|
+
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
76
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"/>
|
|
77
|
+
</svg>
|
|
78
|
+
<span class="info-value"><a href="tel:${contact.phone_mobile}">${contact.phone_mobile}</a></span>
|
|
79
|
+
</div>
|
|
80
|
+
` : ""}
|
|
81
|
+
${contact.fax ? `
|
|
82
|
+
<div class="info-row">
|
|
83
|
+
<svg class="info-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
84
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z"/>
|
|
85
|
+
</svg>
|
|
86
|
+
<span class="info-value">${contact.fax}</span>
|
|
87
|
+
</div>
|
|
88
|
+
` : ""}
|
|
89
|
+
</div>
|
|
90
|
+
` : ""}
|
|
91
|
+
|
|
92
|
+
${hasAddress ? `
|
|
93
|
+
<div class="info-section">
|
|
94
|
+
<div class="info-label">Address</div>
|
|
95
|
+
<div class="address-block">
|
|
96
|
+
${addressParts.map(p => `<div>${p}</div>`).join("")}
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
` : ""}
|
|
100
|
+
|
|
101
|
+
${!hasContactInfo && !hasAddress ? `
|
|
102
|
+
<div class="info-section" style="text-align: center; color: #6b7280;">
|
|
103
|
+
No contact details available
|
|
104
|
+
</div>
|
|
105
|
+
` : ""}
|
|
106
|
+
</div>
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { App } from "@modelcontextprotocol/ext-apps";
|
|
2
|
+
const appEl = document.getElementById("app");
|
|
3
|
+
const app = new App({ name: "Bexio Dashboard", version: "1.0.0" });
|
|
4
|
+
app.ontoolresult = (result) => {
|
|
5
|
+
const text = result.content?.find((c) => c.type === "text")?.text;
|
|
6
|
+
if (text) {
|
|
7
|
+
try {
|
|
8
|
+
const data = JSON.parse(text);
|
|
9
|
+
renderDashboard(data);
|
|
10
|
+
}
|
|
11
|
+
catch (e) {
|
|
12
|
+
appEl.innerHTML = `<div class="loading">Error parsing dashboard data</div>`;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
app.connect();
|
|
17
|
+
function formatCurrency(amount, currency) {
|
|
18
|
+
return `${currency} ${amount.toLocaleString("de-CH", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
|
|
19
|
+
}
|
|
20
|
+
function getInitials(name1, name2) {
|
|
21
|
+
const parts = [name1, name2].filter(Boolean);
|
|
22
|
+
return parts.map(p => p.charAt(0).toUpperCase()).join("").slice(0, 2) || "?";
|
|
23
|
+
}
|
|
24
|
+
function renderDashboard(data) {
|
|
25
|
+
appEl.className = "dashboard";
|
|
26
|
+
appEl.innerHTML = `
|
|
27
|
+
<div class="header">
|
|
28
|
+
<h1>Bexio Dashboard</h1>
|
|
29
|
+
<p class="subtitle">Overview of your invoices and recent contacts</p>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div class="grid">
|
|
33
|
+
<div class="card">
|
|
34
|
+
<div class="card-header">
|
|
35
|
+
<div class="card-icon blue">
|
|
36
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
37
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
|
|
38
|
+
</svg>
|
|
39
|
+
</div>
|
|
40
|
+
<span class="card-title">Open Invoices</span>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="card-value">${data.open_invoices_count}</div>
|
|
43
|
+
<div class="card-subtitle">${formatCurrency(data.open_invoices_total, data.currency)} total</div>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<div class="card">
|
|
47
|
+
<div class="card-header">
|
|
48
|
+
<div class="card-icon yellow">
|
|
49
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
50
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
|
51
|
+
</svg>
|
|
52
|
+
</div>
|
|
53
|
+
<span class="card-title">Overdue</span>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="card-value">${data.overdue_count}</div>
|
|
56
|
+
<div class="card-subtitle">${formatCurrency(data.overdue_total, data.currency)} outstanding</div>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<div class="card">
|
|
60
|
+
<div class="card-header">
|
|
61
|
+
<div class="card-icon green">
|
|
62
|
+
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
63
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"/>
|
|
64
|
+
</svg>
|
|
65
|
+
</div>
|
|
66
|
+
<span class="card-title">Recent Contacts</span>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="contacts-list">
|
|
69
|
+
${data.recent_contacts.length > 0 ? data.recent_contacts.slice(0, 5).map(contact => `
|
|
70
|
+
<div class="contact-item">
|
|
71
|
+
<div class="contact-avatar">${getInitials(contact.name_1, contact.name_2)}</div>
|
|
72
|
+
<span class="contact-name">${[contact.name_1, contact.name_2].filter(Boolean).join(" ")}</span>
|
|
73
|
+
</div>
|
|
74
|
+
`).join("") : `
|
|
75
|
+
<div class="empty-state">No recent contacts</div>
|
|
76
|
+
`}
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { App } from "@modelcontextprotocol/ext-apps";
|
|
2
|
+
const appEl = document.getElementById("app");
|
|
3
|
+
const app = new App({ name: "Invoice Preview", version: "1.0.0" });
|
|
4
|
+
app.ontoolresult = (result) => {
|
|
5
|
+
const text = result.content?.find((c) => c.type === "text")?.text;
|
|
6
|
+
if (text) {
|
|
7
|
+
try {
|
|
8
|
+
const invoice = JSON.parse(text);
|
|
9
|
+
renderInvoice(invoice);
|
|
10
|
+
}
|
|
11
|
+
catch (e) {
|
|
12
|
+
appEl.innerHTML = `<div class="loading">Error parsing invoice data</div>`;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
app.connect();
|
|
17
|
+
function getStatusInfo(statusId) {
|
|
18
|
+
switch (statusId) {
|
|
19
|
+
case 7: return { label: "Draft", className: "status-draft" };
|
|
20
|
+
case 8: return { label: "Pending", className: "status-pending" };
|
|
21
|
+
case 9: return { label: "Sent", className: "status-sent" };
|
|
22
|
+
case 16: return { label: "Paid", className: "status-paid" };
|
|
23
|
+
case 17: return { label: "Overdue", className: "status-overdue" };
|
|
24
|
+
case 19: return { label: "Cancelled", className: "status-cancelled" };
|
|
25
|
+
default: return { label: `Status ${statusId}`, className: "status-draft" };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function formatCurrency(amount, currencyId) {
|
|
29
|
+
const value = typeof amount === "string" ? parseFloat(amount) : amount;
|
|
30
|
+
const currency = currencyId === 1 ? "CHF" : currencyId === 2 ? "EUR" : "USD";
|
|
31
|
+
return `${currency} ${value.toFixed(2)}`;
|
|
32
|
+
}
|
|
33
|
+
function formatDate(dateStr) {
|
|
34
|
+
if (!dateStr)
|
|
35
|
+
return "";
|
|
36
|
+
const date = new Date(dateStr);
|
|
37
|
+
return date.toLocaleDateString("de-CH", { day: "2-digit", month: "2-digit", year: "numeric" });
|
|
38
|
+
}
|
|
39
|
+
function renderInvoice(invoice) {
|
|
40
|
+
const status = getStatusInfo(invoice.kb_item_status_id);
|
|
41
|
+
const positions = invoice.positions || [];
|
|
42
|
+
appEl.className = "invoice";
|
|
43
|
+
appEl.innerHTML = `
|
|
44
|
+
<div class="header">
|
|
45
|
+
<div class="header-left">
|
|
46
|
+
<h1>Invoice ${invoice.document_nr}</h1>
|
|
47
|
+
<p class="title">${invoice.title || ""}</p>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="header-right">
|
|
50
|
+
<div class="dates">
|
|
51
|
+
<div>Issue: ${formatDate(invoice.is_valid_from)}</div>
|
|
52
|
+
<div>Due: ${formatDate(invoice.is_valid_to)}</div>
|
|
53
|
+
</div>
|
|
54
|
+
<span class="status-badge ${status.className}">${status.label}</span>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<div class="contact-section">
|
|
59
|
+
<h2>Bill To</h2>
|
|
60
|
+
<div class="name">${invoice.contact_address?.split("\n")[0] || `Contact #${invoice.contact_id}`}</div>
|
|
61
|
+
<div class="email">${invoice.contact_address?.split("\n").slice(1).join(", ") || ""}</div>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<table class="line-items">
|
|
65
|
+
<thead>
|
|
66
|
+
<tr>
|
|
67
|
+
<th>Description</th>
|
|
68
|
+
<th>Qty</th>
|
|
69
|
+
<th>Price</th>
|
|
70
|
+
<th>Amount</th>
|
|
71
|
+
</tr>
|
|
72
|
+
</thead>
|
|
73
|
+
<tbody>
|
|
74
|
+
${positions.length > 0 ? positions.map((p) => `
|
|
75
|
+
<tr>
|
|
76
|
+
<td>${p.text}</td>
|
|
77
|
+
<td>${p.amount}</td>
|
|
78
|
+
<td>${formatCurrency(p.unit_price, invoice.currency_id)}</td>
|
|
79
|
+
<td>${formatCurrency(p.amount * p.unit_price * (1 - (p.discount_in_percent || 0) / 100), invoice.currency_id)}</td>
|
|
80
|
+
</tr>
|
|
81
|
+
`).join("") : `
|
|
82
|
+
<tr>
|
|
83
|
+
<td colspan="4" style="text-align: center; color: #6b7280;">No line items available</td>
|
|
84
|
+
</tr>
|
|
85
|
+
`}
|
|
86
|
+
</tbody>
|
|
87
|
+
</table>
|
|
88
|
+
|
|
89
|
+
<div class="total-section">
|
|
90
|
+
<div class="total-row">
|
|
91
|
+
<span class="total-label">Total:</span>
|
|
92
|
+
<span class="total-amount">${formatCurrency(invoice.total_gross, invoice.currency_id)}</span>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
`;
|
|
96
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Apps UI Resources Registration.
|
|
3
|
+
*
|
|
4
|
+
* Registers UI tools and resources for interactive invoice preview,
|
|
5
|
+
* contact card, and dashboard summary.
|
|
6
|
+
*
|
|
7
|
+
* Uses @modelcontextprotocol/ext-apps SDK for UI resource handling.
|
|
8
|
+
*/
|
|
9
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
10
|
+
import { BexioClient } from "./bexio-client.js";
|
|
11
|
+
/**
|
|
12
|
+
* Register MCP Apps UI resources and tools.
|
|
13
|
+
*
|
|
14
|
+
* @param server - McpServer instance
|
|
15
|
+
* @param client - BexioClient for API calls
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerUIResources(server: McpServer, client: BexioClient): void;
|