@hasna/microservices 0.0.9 → 0.0.11

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 (100) hide show
  1. package/bin/index.js +236 -36
  2. package/bin/mcp.js +153 -4
  3. package/dist/index.js +120 -3
  4. package/microservices/microservice-analytics/package.json +27 -0
  5. package/microservices/microservice-analytics/src/cli/index.ts +373 -0
  6. package/microservices/microservice-analytics/src/db/analytics.ts +564 -0
  7. package/microservices/microservice-analytics/src/db/database.ts +93 -0
  8. package/microservices/microservice-analytics/src/db/migrations.ts +50 -0
  9. package/microservices/microservice-analytics/src/index.ts +37 -0
  10. package/microservices/microservice-analytics/src/mcp/index.ts +334 -0
  11. package/microservices/microservice-assets/package.json +27 -0
  12. package/microservices/microservice-assets/src/cli/index.ts +375 -0
  13. package/microservices/microservice-assets/src/db/assets.ts +370 -0
  14. package/microservices/microservice-assets/src/db/database.ts +93 -0
  15. package/microservices/microservice-assets/src/db/migrations.ts +51 -0
  16. package/microservices/microservice-assets/src/index.ts +32 -0
  17. package/microservices/microservice-assets/src/mcp/index.ts +346 -0
  18. package/microservices/microservice-compliance/package.json +27 -0
  19. package/microservices/microservice-compliance/src/cli/index.ts +467 -0
  20. package/microservices/microservice-compliance/src/db/compliance.ts +633 -0
  21. package/microservices/microservice-compliance/src/db/database.ts +93 -0
  22. package/microservices/microservice-compliance/src/db/migrations.ts +63 -0
  23. package/microservices/microservice-compliance/src/index.ts +46 -0
  24. package/microservices/microservice-compliance/src/mcp/index.ts +438 -0
  25. package/microservices/microservice-habits/package.json +27 -0
  26. package/microservices/microservice-habits/src/cli/index.ts +315 -0
  27. package/microservices/microservice-habits/src/db/database.ts +93 -0
  28. package/microservices/microservice-habits/src/db/habits.ts +451 -0
  29. package/microservices/microservice-habits/src/db/migrations.ts +46 -0
  30. package/microservices/microservice-habits/src/index.ts +31 -0
  31. package/microservices/microservice-habits/src/mcp/index.ts +313 -0
  32. package/microservices/microservice-health/package.json +27 -0
  33. package/microservices/microservice-health/src/cli/index.ts +484 -0
  34. package/microservices/microservice-health/src/db/database.ts +93 -0
  35. package/microservices/microservice-health/src/db/health.ts +708 -0
  36. package/microservices/microservice-health/src/db/migrations.ts +70 -0
  37. package/microservices/microservice-health/src/index.ts +63 -0
  38. package/microservices/microservice-health/src/mcp/index.ts +437 -0
  39. package/microservices/microservice-leads/package.json +27 -0
  40. package/microservices/microservice-leads/src/cli/index.ts +596 -0
  41. package/microservices/microservice-leads/src/db/database.ts +93 -0
  42. package/microservices/microservice-leads/src/db/leads.ts +520 -0
  43. package/microservices/microservice-leads/src/db/lists.ts +151 -0
  44. package/microservices/microservice-leads/src/db/migrations.ts +93 -0
  45. package/microservices/microservice-leads/src/index.ts +65 -0
  46. package/microservices/microservice-leads/src/lib/enrichment.ts +202 -0
  47. package/microservices/microservice-leads/src/lib/scoring.ts +134 -0
  48. package/microservices/microservice-leads/src/mcp/index.ts +533 -0
  49. package/microservices/microservice-notifications/package.json +27 -0
  50. package/microservices/microservice-notifications/src/cli/index.ts +349 -0
  51. package/microservices/microservice-notifications/src/db/database.ts +93 -0
  52. package/microservices/microservice-notifications/src/db/migrations.ts +62 -0
  53. package/microservices/microservice-notifications/src/db/notifications.ts +509 -0
  54. package/microservices/microservice-notifications/src/index.ts +41 -0
  55. package/microservices/microservice-notifications/src/mcp/index.ts +422 -0
  56. package/microservices/microservice-products/package.json +27 -0
  57. package/microservices/microservice-products/src/cli/index.ts +416 -0
  58. package/microservices/microservice-products/src/db/categories.ts +154 -0
  59. package/microservices/microservice-products/src/db/database.ts +93 -0
  60. package/microservices/microservice-products/src/db/migrations.ts +58 -0
  61. package/microservices/microservice-products/src/db/pricing-tiers.ts +66 -0
  62. package/microservices/microservice-products/src/db/products.ts +452 -0
  63. package/microservices/microservice-products/src/index.ts +53 -0
  64. package/microservices/microservice-products/src/mcp/index.ts +453 -0
  65. package/microservices/microservice-projects/package.json +27 -0
  66. package/microservices/microservice-projects/src/cli/index.ts +480 -0
  67. package/microservices/microservice-projects/src/db/database.ts +93 -0
  68. package/microservices/microservice-projects/src/db/migrations.ts +65 -0
  69. package/microservices/microservice-projects/src/db/projects.ts +715 -0
  70. package/microservices/microservice-projects/src/index.ts +57 -0
  71. package/microservices/microservice-projects/src/mcp/index.ts +501 -0
  72. package/microservices/microservice-proposals/package.json +27 -0
  73. package/microservices/microservice-proposals/src/cli/index.ts +400 -0
  74. package/microservices/microservice-proposals/src/db/database.ts +93 -0
  75. package/microservices/microservice-proposals/src/db/migrations.ts +52 -0
  76. package/microservices/microservice-proposals/src/db/proposals.ts +532 -0
  77. package/microservices/microservice-proposals/src/index.ts +37 -0
  78. package/microservices/microservice-proposals/src/mcp/index.ts +375 -0
  79. package/microservices/microservice-reading/package.json +27 -0
  80. package/microservices/microservice-reading/src/cli/index.ts +464 -0
  81. package/microservices/microservice-reading/src/db/database.ts +93 -0
  82. package/microservices/microservice-reading/src/db/migrations.ts +59 -0
  83. package/microservices/microservice-reading/src/db/reading.ts +524 -0
  84. package/microservices/microservice-reading/src/index.ts +51 -0
  85. package/microservices/microservice-reading/src/mcp/index.ts +368 -0
  86. package/microservices/microservice-travel/package.json +27 -0
  87. package/microservices/microservice-travel/src/cli/index.ts +505 -0
  88. package/microservices/microservice-travel/src/db/database.ts +93 -0
  89. package/microservices/microservice-travel/src/db/migrations.ts +77 -0
  90. package/microservices/microservice-travel/src/db/travel.ts +802 -0
  91. package/microservices/microservice-travel/src/index.ts +60 -0
  92. package/microservices/microservice-travel/src/mcp/index.ts +495 -0
  93. package/microservices/microservice-wiki/package.json +27 -0
  94. package/microservices/microservice-wiki/src/cli/index.ts +345 -0
  95. package/microservices/microservice-wiki/src/db/database.ts +93 -0
  96. package/microservices/microservice-wiki/src/db/migrations.ts +55 -0
  97. package/microservices/microservice-wiki/src/db/wiki.ts +395 -0
  98. package/microservices/microservice-wiki/src/index.ts +32 -0
  99. package/microservices/microservice-wiki/src/mcp/index.ts +344 -0
  100. package/package.json +1 -1
@@ -0,0 +1,422 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import { z } from "zod";
6
+ import {
7
+ sendNotification,
8
+ getNotification,
9
+ listNotifications,
10
+ markRead,
11
+ markAllRead,
12
+ markSent,
13
+ markFailed,
14
+ createRule,
15
+ getRule,
16
+ listRules,
17
+ updateRule,
18
+ deleteRule,
19
+ enableRule,
20
+ disableRule,
21
+ createTemplate,
22
+ getTemplate,
23
+ listTemplates,
24
+ deleteTemplate,
25
+ renderTemplate,
26
+ processEvent,
27
+ getNotificationStats,
28
+ } from "../db/notifications.js";
29
+
30
+ const server = new McpServer({
31
+ name: "microservice-notifications",
32
+ version: "0.0.1",
33
+ });
34
+
35
+ // --- Notifications ---
36
+
37
+ server.registerTool(
38
+ "send_notification",
39
+ {
40
+ title: "Send Notification",
41
+ description: "Send a notification via a specified channel.",
42
+ inputSchema: {
43
+ channel: z.enum(["email", "slack", "sms", "webhook", "in_app"]),
44
+ recipient: z.string(),
45
+ subject: z.string().optional(),
46
+ body: z.string().optional(),
47
+ priority: z.enum(["low", "normal", "high", "urgent"]).optional(),
48
+ source_service: z.string().optional(),
49
+ source_event: z.string().optional(),
50
+ metadata: z.record(z.unknown()).optional(),
51
+ },
52
+ },
53
+ async (params) => {
54
+ const notification = sendNotification(params);
55
+ return { content: [{ type: "text", text: JSON.stringify(notification, null, 2) }] };
56
+ }
57
+ );
58
+
59
+ server.registerTool(
60
+ "get_notification",
61
+ {
62
+ title: "Get Notification",
63
+ description: "Get a notification by ID.",
64
+ inputSchema: { id: z.string() },
65
+ },
66
+ async ({ id }) => {
67
+ const notification = getNotification(id);
68
+ if (!notification) {
69
+ return { content: [{ type: "text", text: `Notification '${id}' not found.` }], isError: true };
70
+ }
71
+ return { content: [{ type: "text", text: JSON.stringify(notification, null, 2) }] };
72
+ }
73
+ );
74
+
75
+ server.registerTool(
76
+ "list_notifications",
77
+ {
78
+ title: "List Notifications",
79
+ description: "List notifications with optional filters.",
80
+ inputSchema: {
81
+ status: z.enum(["pending", "sent", "failed", "read"]).optional(),
82
+ channel: z.enum(["email", "slack", "sms", "webhook", "in_app"]).optional(),
83
+ priority: z.enum(["low", "normal", "high", "urgent"]).optional(),
84
+ recipient: z.string().optional(),
85
+ limit: z.number().optional(),
86
+ },
87
+ },
88
+ async (params) => {
89
+ const notifications = listNotifications(params);
90
+ return {
91
+ content: [
92
+ {
93
+ type: "text",
94
+ text: JSON.stringify({ notifications, count: notifications.length }, null, 2),
95
+ },
96
+ ],
97
+ };
98
+ }
99
+ );
100
+
101
+ server.registerTool(
102
+ "mark_notification_read",
103
+ {
104
+ title: "Mark Notification Read",
105
+ description: "Mark a notification as read.",
106
+ inputSchema: { id: z.string() },
107
+ },
108
+ async ({ id }) => {
109
+ const notification = markRead(id);
110
+ if (!notification) {
111
+ return { content: [{ type: "text", text: `Notification '${id}' not found.` }], isError: true };
112
+ }
113
+ return { content: [{ type: "text", text: JSON.stringify(notification, null, 2) }] };
114
+ }
115
+ );
116
+
117
+ server.registerTool(
118
+ "mark_all_notifications_read",
119
+ {
120
+ title: "Mark All Notifications Read",
121
+ description: "Mark all notifications as read for a recipient.",
122
+ inputSchema: { recipient: z.string() },
123
+ },
124
+ async ({ recipient }) => {
125
+ const count = markAllRead(recipient);
126
+ return { content: [{ type: "text", text: JSON.stringify({ recipient, marked_read: count }) }] };
127
+ }
128
+ );
129
+
130
+ server.registerTool(
131
+ "mark_notification_sent",
132
+ {
133
+ title: "Mark Notification Sent",
134
+ description: "Mark a notification as sent.",
135
+ inputSchema: { id: z.string() },
136
+ },
137
+ async ({ id }) => {
138
+ const notification = markSent(id);
139
+ if (!notification) {
140
+ return { content: [{ type: "text", text: `Notification '${id}' not found.` }], isError: true };
141
+ }
142
+ return { content: [{ type: "text", text: JSON.stringify(notification, null, 2) }] };
143
+ }
144
+ );
145
+
146
+ server.registerTool(
147
+ "mark_notification_failed",
148
+ {
149
+ title: "Mark Notification Failed",
150
+ description: "Mark a notification as failed.",
151
+ inputSchema: { id: z.string() },
152
+ },
153
+ async ({ id }) => {
154
+ const notification = markFailed(id);
155
+ if (!notification) {
156
+ return { content: [{ type: "text", text: `Notification '${id}' not found.` }], isError: true };
157
+ }
158
+ return { content: [{ type: "text", text: JSON.stringify(notification, null, 2) }] };
159
+ }
160
+ );
161
+
162
+ // --- Rules ---
163
+
164
+ server.registerTool(
165
+ "create_notification_rule",
166
+ {
167
+ title: "Create Notification Rule",
168
+ description: "Create a rule that triggers notifications on events.",
169
+ inputSchema: {
170
+ name: z.string().optional(),
171
+ trigger_event: z.string(),
172
+ channel: z.string(),
173
+ recipient: z.string(),
174
+ template_id: z.string().optional(),
175
+ metadata: z.record(z.unknown()).optional(),
176
+ },
177
+ },
178
+ async (params) => {
179
+ const rule = createRule(params);
180
+ return { content: [{ type: "text", text: JSON.stringify(rule, null, 2) }] };
181
+ }
182
+ );
183
+
184
+ server.registerTool(
185
+ "get_notification_rule",
186
+ {
187
+ title: "Get Notification Rule",
188
+ description: "Get a notification rule by ID.",
189
+ inputSchema: { id: z.string() },
190
+ },
191
+ async ({ id }) => {
192
+ const rule = getRule(id);
193
+ if (!rule) {
194
+ return { content: [{ type: "text", text: `Rule '${id}' not found.` }], isError: true };
195
+ }
196
+ return { content: [{ type: "text", text: JSON.stringify(rule, null, 2) }] };
197
+ }
198
+ );
199
+
200
+ server.registerTool(
201
+ "list_notification_rules",
202
+ {
203
+ title: "List Notification Rules",
204
+ description: "List all notification rules.",
205
+ inputSchema: {},
206
+ },
207
+ async () => {
208
+ const rules = listRules();
209
+ return {
210
+ content: [
211
+ { type: "text", text: JSON.stringify({ rules, count: rules.length }, null, 2) },
212
+ ],
213
+ };
214
+ }
215
+ );
216
+
217
+ server.registerTool(
218
+ "update_notification_rule",
219
+ {
220
+ title: "Update Notification Rule",
221
+ description: "Update a notification rule.",
222
+ inputSchema: {
223
+ id: z.string(),
224
+ name: z.string().optional(),
225
+ trigger_event: z.string().optional(),
226
+ channel: z.string().optional(),
227
+ recipient: z.string().optional(),
228
+ template_id: z.string().optional(),
229
+ metadata: z.record(z.unknown()).optional(),
230
+ },
231
+ },
232
+ async ({ id, ...input }) => {
233
+ const rule = updateRule(id, input);
234
+ if (!rule) {
235
+ return { content: [{ type: "text", text: `Rule '${id}' not found.` }], isError: true };
236
+ }
237
+ return { content: [{ type: "text", text: JSON.stringify(rule, null, 2) }] };
238
+ }
239
+ );
240
+
241
+ server.registerTool(
242
+ "delete_notification_rule",
243
+ {
244
+ title: "Delete Notification Rule",
245
+ description: "Delete a notification rule by ID.",
246
+ inputSchema: { id: z.string() },
247
+ },
248
+ async ({ id }) => {
249
+ const deleted = deleteRule(id);
250
+ return { content: [{ type: "text", text: JSON.stringify({ id, deleted }) }] };
251
+ }
252
+ );
253
+
254
+ server.registerTool(
255
+ "enable_notification_rule",
256
+ {
257
+ title: "Enable Notification Rule",
258
+ description: "Enable a notification rule.",
259
+ inputSchema: { id: z.string() },
260
+ },
261
+ async ({ id }) => {
262
+ const rule = enableRule(id);
263
+ if (!rule) {
264
+ return { content: [{ type: "text", text: `Rule '${id}' not found.` }], isError: true };
265
+ }
266
+ return { content: [{ type: "text", text: JSON.stringify(rule, null, 2) }] };
267
+ }
268
+ );
269
+
270
+ server.registerTool(
271
+ "disable_notification_rule",
272
+ {
273
+ title: "Disable Notification Rule",
274
+ description: "Disable a notification rule.",
275
+ inputSchema: { id: z.string() },
276
+ },
277
+ async ({ id }) => {
278
+ const rule = disableRule(id);
279
+ if (!rule) {
280
+ return { content: [{ type: "text", text: `Rule '${id}' not found.` }], isError: true };
281
+ }
282
+ return { content: [{ type: "text", text: JSON.stringify(rule, null, 2) }] };
283
+ }
284
+ );
285
+
286
+ // --- Templates ---
287
+
288
+ server.registerTool(
289
+ "create_notification_template",
290
+ {
291
+ title: "Create Notification Template",
292
+ description: "Create a notification template with variable substitution.",
293
+ inputSchema: {
294
+ name: z.string(),
295
+ channel: z.string().optional(),
296
+ subject_template: z.string().optional(),
297
+ body_template: z.string().optional(),
298
+ variables: z.array(z.string()).optional(),
299
+ },
300
+ },
301
+ async (params) => {
302
+ const template = createTemplate(params);
303
+ return { content: [{ type: "text", text: JSON.stringify(template, null, 2) }] };
304
+ }
305
+ );
306
+
307
+ server.registerTool(
308
+ "get_notification_template",
309
+ {
310
+ title: "Get Notification Template",
311
+ description: "Get a notification template by ID.",
312
+ inputSchema: { id: z.string() },
313
+ },
314
+ async ({ id }) => {
315
+ const template = getTemplate(id);
316
+ if (!template) {
317
+ return { content: [{ type: "text", text: `Template '${id}' not found.` }], isError: true };
318
+ }
319
+ return { content: [{ type: "text", text: JSON.stringify(template, null, 2) }] };
320
+ }
321
+ );
322
+
323
+ server.registerTool(
324
+ "list_notification_templates",
325
+ {
326
+ title: "List Notification Templates",
327
+ description: "List all notification templates.",
328
+ inputSchema: {},
329
+ },
330
+ async () => {
331
+ const templates = listTemplates();
332
+ return {
333
+ content: [
334
+ { type: "text", text: JSON.stringify({ templates, count: templates.length }, null, 2) },
335
+ ],
336
+ };
337
+ }
338
+ );
339
+
340
+ server.registerTool(
341
+ "delete_notification_template",
342
+ {
343
+ title: "Delete Notification Template",
344
+ description: "Delete a notification template by ID.",
345
+ inputSchema: { id: z.string() },
346
+ },
347
+ async ({ id }) => {
348
+ const deleted = deleteTemplate(id);
349
+ return { content: [{ type: "text", text: JSON.stringify({ id, deleted }) }] };
350
+ }
351
+ );
352
+
353
+ server.registerTool(
354
+ "render_notification_template",
355
+ {
356
+ title: "Render Notification Template",
357
+ description: "Render a template with variable substitution.",
358
+ inputSchema: {
359
+ template_id: z.string(),
360
+ variables: z.record(z.string()),
361
+ },
362
+ },
363
+ async ({ template_id, variables }) => {
364
+ const rendered = renderTemplate(template_id, variables);
365
+ if (!rendered) {
366
+ return { content: [{ type: "text", text: `Template '${template_id}' not found.` }], isError: true };
367
+ }
368
+ return { content: [{ type: "text", text: JSON.stringify(rendered, null, 2) }] };
369
+ }
370
+ );
371
+
372
+ // --- Event Processing ---
373
+
374
+ server.registerTool(
375
+ "process_notification_event",
376
+ {
377
+ title: "Process Notification Event",
378
+ description: "Process an event, matching rules and creating notifications with template substitution.",
379
+ inputSchema: {
380
+ event: z.string(),
381
+ data: z.record(z.string()).optional(),
382
+ },
383
+ },
384
+ async ({ event, data }) => {
385
+ const notifications = processEvent(event, data || {});
386
+ return {
387
+ content: [
388
+ {
389
+ type: "text",
390
+ text: JSON.stringify({ event, notifications, count: notifications.length }, null, 2),
391
+ },
392
+ ],
393
+ };
394
+ }
395
+ );
396
+
397
+ // --- Stats ---
398
+
399
+ server.registerTool(
400
+ "get_notification_stats",
401
+ {
402
+ title: "Get Notification Stats",
403
+ description: "Get notification statistics by channel, status, and priority.",
404
+ inputSchema: {},
405
+ },
406
+ async () => {
407
+ const stats = getNotificationStats();
408
+ return { content: [{ type: "text", text: JSON.stringify(stats, null, 2) }] };
409
+ }
410
+ );
411
+
412
+ // --- Start ---
413
+ async function main() {
414
+ const transport = new StdioServerTransport();
415
+ await server.connect(transport);
416
+ console.error("microservice-notifications MCP server running on stdio");
417
+ }
418
+
419
+ main().catch((error) => {
420
+ console.error("Fatal error:", error);
421
+ process.exit(1);
422
+ });
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@hasna/microservice-products",
3
+ "version": "0.0.1",
4
+ "description": "Product catalog microservice with SQLite — manage products, categories, and pricing tiers",
5
+ "type": "module",
6
+ "bin": {
7
+ "microservice-products": "./src/cli/index.ts",
8
+ "microservice-products-mcp": "./src/mcp/index.ts"
9
+ },
10
+ "exports": {
11
+ ".": "./src/index.ts"
12
+ },
13
+ "scripts": {
14
+ "dev": "bun run ./src/cli/index.ts",
15
+ "test": "bun test"
16
+ },
17
+ "dependencies": {
18
+ "@modelcontextprotocol/sdk": "^1.26.0",
19
+ "commander": "^12.1.0",
20
+ "zod": "^3.24.0"
21
+ },
22
+ "license": "Apache-2.0",
23
+ "publishConfig": {
24
+ "registry": "https://registry.npmjs.org",
25
+ "access": "public"
26
+ }
27
+ }