@hasna/microservices 0.0.3 → 0.0.4

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 (67) hide show
  1. package/bin/index.js +63 -0
  2. package/bin/mcp.js +63 -0
  3. package/dist/index.js +63 -0
  4. package/microservices/microservice-ads/package.json +27 -0
  5. package/microservices/microservice-ads/src/cli/index.ts +407 -0
  6. package/microservices/microservice-ads/src/db/campaigns.ts +493 -0
  7. package/microservices/microservice-ads/src/db/database.ts +93 -0
  8. package/microservices/microservice-ads/src/db/migrations.ts +60 -0
  9. package/microservices/microservice-ads/src/index.ts +39 -0
  10. package/microservices/microservice-ads/src/mcp/index.ts +320 -0
  11. package/microservices/microservice-contracts/package.json +27 -0
  12. package/microservices/microservice-contracts/src/cli/index.ts +383 -0
  13. package/microservices/microservice-contracts/src/db/contracts.ts +496 -0
  14. package/microservices/microservice-contracts/src/db/database.ts +93 -0
  15. package/microservices/microservice-contracts/src/db/migrations.ts +58 -0
  16. package/microservices/microservice-contracts/src/index.ts +43 -0
  17. package/microservices/microservice-contracts/src/mcp/index.ts +308 -0
  18. package/microservices/microservice-domains/package.json +27 -0
  19. package/microservices/microservice-domains/src/cli/index.ts +438 -0
  20. package/microservices/microservice-domains/src/db/database.ts +93 -0
  21. package/microservices/microservice-domains/src/db/domains.ts +551 -0
  22. package/microservices/microservice-domains/src/db/migrations.ts +60 -0
  23. package/microservices/microservice-domains/src/index.ts +44 -0
  24. package/microservices/microservice-domains/src/mcp/index.ts +368 -0
  25. package/microservices/microservice-hiring/package.json +27 -0
  26. package/microservices/microservice-hiring/src/cli/index.ts +431 -0
  27. package/microservices/microservice-hiring/src/db/database.ts +93 -0
  28. package/microservices/microservice-hiring/src/db/hiring.ts +582 -0
  29. package/microservices/microservice-hiring/src/db/migrations.ts +68 -0
  30. package/microservices/microservice-hiring/src/index.ts +51 -0
  31. package/microservices/microservice-hiring/src/mcp/index.ts +464 -0
  32. package/microservices/microservice-payments/package.json +27 -0
  33. package/microservices/microservice-payments/src/cli/index.ts +357 -0
  34. package/microservices/microservice-payments/src/db/database.ts +93 -0
  35. package/microservices/microservice-payments/src/db/migrations.ts +63 -0
  36. package/microservices/microservice-payments/src/db/payments.ts +652 -0
  37. package/microservices/microservice-payments/src/index.ts +51 -0
  38. package/microservices/microservice-payments/src/mcp/index.ts +460 -0
  39. package/microservices/microservice-payroll/package.json +27 -0
  40. package/microservices/microservice-payroll/src/cli/index.ts +374 -0
  41. package/microservices/microservice-payroll/src/db/database.ts +93 -0
  42. package/microservices/microservice-payroll/src/db/migrations.ts +69 -0
  43. package/microservices/microservice-payroll/src/db/payroll.ts +741 -0
  44. package/microservices/microservice-payroll/src/index.ts +48 -0
  45. package/microservices/microservice-payroll/src/mcp/index.ts +420 -0
  46. package/microservices/microservice-shipping/package.json +27 -0
  47. package/microservices/microservice-shipping/src/cli/index.ts +398 -0
  48. package/microservices/microservice-shipping/src/db/database.ts +93 -0
  49. package/microservices/microservice-shipping/src/db/migrations.ts +61 -0
  50. package/microservices/microservice-shipping/src/db/shipping.ts +643 -0
  51. package/microservices/microservice-shipping/src/index.ts +53 -0
  52. package/microservices/microservice-shipping/src/mcp/index.ts +385 -0
  53. package/microservices/microservice-social/package.json +27 -0
  54. package/microservices/microservice-social/src/cli/index.ts +447 -0
  55. package/microservices/microservice-social/src/db/database.ts +93 -0
  56. package/microservices/microservice-social/src/db/migrations.ts +55 -0
  57. package/microservices/microservice-social/src/db/social.ts +672 -0
  58. package/microservices/microservice-social/src/index.ts +46 -0
  59. package/microservices/microservice-social/src/mcp/index.ts +435 -0
  60. package/microservices/microservice-subscriptions/package.json +27 -0
  61. package/microservices/microservice-subscriptions/src/cli/index.ts +400 -0
  62. package/microservices/microservice-subscriptions/src/db/database.ts +93 -0
  63. package/microservices/microservice-subscriptions/src/db/migrations.ts +57 -0
  64. package/microservices/microservice-subscriptions/src/db/subscriptions.ts +692 -0
  65. package/microservices/microservice-subscriptions/src/index.ts +41 -0
  66. package/microservices/microservice-subscriptions/src/mcp/index.ts +365 -0
  67. package/package.json +1 -1
@@ -0,0 +1,368 @@
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
+ createDomain,
8
+ getDomain,
9
+ listDomains,
10
+ updateDomain,
11
+ deleteDomain,
12
+ countDomains,
13
+ searchDomains,
14
+ getByRegistrar,
15
+ listExpiring,
16
+ listSslExpiring,
17
+ getDomainStats,
18
+ createDnsRecord,
19
+ listDnsRecords,
20
+ updateDnsRecord,
21
+ deleteDnsRecord,
22
+ createAlert,
23
+ listAlerts,
24
+ deleteAlert,
25
+ } from "../db/domains.js";
26
+
27
+ const server = new McpServer({
28
+ name: "microservice-domains",
29
+ version: "0.0.1",
30
+ });
31
+
32
+ // --- Domains ---
33
+
34
+ server.registerTool(
35
+ "create_domain",
36
+ {
37
+ title: "Create Domain",
38
+ description: "Add a new domain to the portfolio.",
39
+ inputSchema: {
40
+ name: z.string(),
41
+ registrar: z.string().optional(),
42
+ status: z.enum(["active", "expired", "transferring", "redemption"]).optional(),
43
+ registered_at: z.string().optional(),
44
+ expires_at: z.string().optional(),
45
+ auto_renew: z.boolean().optional(),
46
+ nameservers: z.array(z.string()).optional(),
47
+ ssl_expires_at: z.string().optional(),
48
+ ssl_issuer: z.string().optional(),
49
+ notes: z.string().optional(),
50
+ },
51
+ },
52
+ async (params) => {
53
+ const domain = createDomain(params);
54
+ return { content: [{ type: "text", text: JSON.stringify(domain, null, 2) }] };
55
+ }
56
+ );
57
+
58
+ server.registerTool(
59
+ "get_domain",
60
+ {
61
+ title: "Get Domain",
62
+ description: "Get a domain by ID.",
63
+ inputSchema: { id: z.string() },
64
+ },
65
+ async ({ id }) => {
66
+ const domain = getDomain(id);
67
+ if (!domain) {
68
+ return { content: [{ type: "text", text: `Domain '${id}' not found.` }], isError: true };
69
+ }
70
+ return { content: [{ type: "text", text: JSON.stringify(domain, null, 2) }] };
71
+ }
72
+ );
73
+
74
+ server.registerTool(
75
+ "list_domains",
76
+ {
77
+ title: "List Domains",
78
+ description: "List domains with optional filters.",
79
+ inputSchema: {
80
+ search: z.string().optional(),
81
+ status: z.enum(["active", "expired", "transferring", "redemption"]).optional(),
82
+ registrar: z.string().optional(),
83
+ limit: z.number().optional(),
84
+ },
85
+ },
86
+ async (params) => {
87
+ const domains = listDomains(params);
88
+ return {
89
+ content: [
90
+ { type: "text", text: JSON.stringify({ domains, count: domains.length }, null, 2) },
91
+ ],
92
+ };
93
+ }
94
+ );
95
+
96
+ server.registerTool(
97
+ "update_domain",
98
+ {
99
+ title: "Update Domain",
100
+ description: "Update an existing domain.",
101
+ inputSchema: {
102
+ id: z.string(),
103
+ name: z.string().optional(),
104
+ registrar: z.string().optional(),
105
+ status: z.enum(["active", "expired", "transferring", "redemption"]).optional(),
106
+ registered_at: z.string().optional(),
107
+ expires_at: z.string().optional(),
108
+ auto_renew: z.boolean().optional(),
109
+ nameservers: z.array(z.string()).optional(),
110
+ ssl_expires_at: z.string().optional(),
111
+ ssl_issuer: z.string().optional(),
112
+ notes: z.string().optional(),
113
+ },
114
+ },
115
+ async ({ id, ...input }) => {
116
+ const domain = updateDomain(id, input);
117
+ if (!domain) {
118
+ return { content: [{ type: "text", text: `Domain '${id}' not found.` }], isError: true };
119
+ }
120
+ return { content: [{ type: "text", text: JSON.stringify(domain, null, 2) }] };
121
+ }
122
+ );
123
+
124
+ server.registerTool(
125
+ "delete_domain",
126
+ {
127
+ title: "Delete Domain",
128
+ description: "Delete a domain by ID.",
129
+ inputSchema: { id: z.string() },
130
+ },
131
+ async ({ id }) => {
132
+ const deleted = deleteDomain(id);
133
+ return { content: [{ type: "text", text: JSON.stringify({ id, deleted }) }] };
134
+ }
135
+ );
136
+
137
+ server.registerTool(
138
+ "search_domains",
139
+ {
140
+ title: "Search Domains",
141
+ description: "Search domains by name, registrar, or notes.",
142
+ inputSchema: { query: z.string() },
143
+ },
144
+ async ({ query }) => {
145
+ const results = searchDomains(query);
146
+ return {
147
+ content: [
148
+ { type: "text", text: JSON.stringify({ results, count: results.length }, null, 2) },
149
+ ],
150
+ };
151
+ }
152
+ );
153
+
154
+ server.registerTool(
155
+ "count_domains",
156
+ {
157
+ title: "Count Domains",
158
+ description: "Get the total number of domains.",
159
+ inputSchema: {},
160
+ },
161
+ async () => {
162
+ const count = countDomains();
163
+ return { content: [{ type: "text", text: JSON.stringify({ count }) }] };
164
+ }
165
+ );
166
+
167
+ server.registerTool(
168
+ "list_expiring_domains",
169
+ {
170
+ title: "List Expiring Domains",
171
+ description: "List domains expiring within N days.",
172
+ inputSchema: { days: z.number().default(30) },
173
+ },
174
+ async ({ days }) => {
175
+ const domains = listExpiring(days);
176
+ return {
177
+ content: [
178
+ { type: "text", text: JSON.stringify({ domains, count: domains.length }, null, 2) },
179
+ ],
180
+ };
181
+ }
182
+ );
183
+
184
+ server.registerTool(
185
+ "list_ssl_expiring",
186
+ {
187
+ title: "List SSL Expiring",
188
+ description: "List domains with SSL certificates expiring within N days.",
189
+ inputSchema: { days: z.number().default(30) },
190
+ },
191
+ async ({ days }) => {
192
+ const domains = listSslExpiring(days);
193
+ return {
194
+ content: [
195
+ { type: "text", text: JSON.stringify({ domains, count: domains.length }, null, 2) },
196
+ ],
197
+ };
198
+ }
199
+ );
200
+
201
+ server.registerTool(
202
+ "get_domains_by_registrar",
203
+ {
204
+ title: "Get Domains by Registrar",
205
+ description: "List all domains from a specific registrar.",
206
+ inputSchema: { registrar: z.string() },
207
+ },
208
+ async ({ registrar }) => {
209
+ const domains = getByRegistrar(registrar);
210
+ return {
211
+ content: [
212
+ { type: "text", text: JSON.stringify({ domains, count: domains.length }, null, 2) },
213
+ ],
214
+ };
215
+ }
216
+ );
217
+
218
+ server.registerTool(
219
+ "get_domain_stats",
220
+ {
221
+ title: "Get Domain Stats",
222
+ description: "Get domain portfolio statistics.",
223
+ inputSchema: {},
224
+ },
225
+ async () => {
226
+ const stats = getDomainStats();
227
+ return { content: [{ type: "text", text: JSON.stringify(stats, null, 2) }] };
228
+ }
229
+ );
230
+
231
+ // --- DNS Records ---
232
+
233
+ server.registerTool(
234
+ "create_dns_record",
235
+ {
236
+ title: "Create DNS Record",
237
+ description: "Create a new DNS record for a domain.",
238
+ inputSchema: {
239
+ domain_id: z.string(),
240
+ type: z.enum(["A", "AAAA", "CNAME", "MX", "TXT", "NS", "SRV"]),
241
+ name: z.string(),
242
+ value: z.string(),
243
+ ttl: z.number().optional(),
244
+ priority: z.number().optional(),
245
+ },
246
+ },
247
+ async (params) => {
248
+ const record = createDnsRecord(params);
249
+ return { content: [{ type: "text", text: JSON.stringify(record, null, 2) }] };
250
+ }
251
+ );
252
+
253
+ server.registerTool(
254
+ "list_dns_records",
255
+ {
256
+ title: "List DNS Records",
257
+ description: "List DNS records for a domain.",
258
+ inputSchema: {
259
+ domain_id: z.string(),
260
+ type: z.enum(["A", "AAAA", "CNAME", "MX", "TXT", "NS", "SRV"]).optional(),
261
+ },
262
+ },
263
+ async ({ domain_id, type }) => {
264
+ const records = listDnsRecords(domain_id, type);
265
+ return {
266
+ content: [
267
+ { type: "text", text: JSON.stringify({ records, count: records.length }, null, 2) },
268
+ ],
269
+ };
270
+ }
271
+ );
272
+
273
+ server.registerTool(
274
+ "update_dns_record",
275
+ {
276
+ title: "Update DNS Record",
277
+ description: "Update a DNS record.",
278
+ inputSchema: {
279
+ id: z.string(),
280
+ type: z.enum(["A", "AAAA", "CNAME", "MX", "TXT", "NS", "SRV"]).optional(),
281
+ name: z.string().optional(),
282
+ value: z.string().optional(),
283
+ ttl: z.number().optional(),
284
+ priority: z.number().optional(),
285
+ },
286
+ },
287
+ async ({ id, ...input }) => {
288
+ const record = updateDnsRecord(id, input);
289
+ if (!record) {
290
+ return { content: [{ type: "text", text: `DNS record '${id}' not found.` }], isError: true };
291
+ }
292
+ return { content: [{ type: "text", text: JSON.stringify(record, null, 2) }] };
293
+ }
294
+ );
295
+
296
+ server.registerTool(
297
+ "delete_dns_record",
298
+ {
299
+ title: "Delete DNS Record",
300
+ description: "Delete a DNS record by ID.",
301
+ inputSchema: { id: z.string() },
302
+ },
303
+ async ({ id }) => {
304
+ const deleted = deleteDnsRecord(id);
305
+ return { content: [{ type: "text", text: JSON.stringify({ id, deleted }) }] };
306
+ }
307
+ );
308
+
309
+ // --- Alerts ---
310
+
311
+ server.registerTool(
312
+ "create_alert",
313
+ {
314
+ title: "Create Alert",
315
+ description: "Set an alert for a domain (expiry, SSL expiry, or DNS change).",
316
+ inputSchema: {
317
+ domain_id: z.string(),
318
+ type: z.enum(["expiry", "ssl_expiry", "dns_change"]),
319
+ trigger_days_before: z.number().optional(),
320
+ },
321
+ },
322
+ async (params) => {
323
+ const alert = createAlert(params);
324
+ return { content: [{ type: "text", text: JSON.stringify(alert, null, 2) }] };
325
+ }
326
+ );
327
+
328
+ server.registerTool(
329
+ "list_alerts",
330
+ {
331
+ title: "List Alerts",
332
+ description: "List alerts for a domain.",
333
+ inputSchema: { domain_id: z.string() },
334
+ },
335
+ async ({ domain_id }) => {
336
+ const alerts = listAlerts(domain_id);
337
+ return {
338
+ content: [
339
+ { type: "text", text: JSON.stringify({ alerts, count: alerts.length }, null, 2) },
340
+ ],
341
+ };
342
+ }
343
+ );
344
+
345
+ server.registerTool(
346
+ "delete_alert",
347
+ {
348
+ title: "Delete Alert",
349
+ description: "Delete an alert by ID.",
350
+ inputSchema: { id: z.string() },
351
+ },
352
+ async ({ id }) => {
353
+ const deleted = deleteAlert(id);
354
+ return { content: [{ type: "text", text: JSON.stringify({ id, deleted }) }] };
355
+ }
356
+ );
357
+
358
+ // --- Start ---
359
+ async function main() {
360
+ const transport = new StdioServerTransport();
361
+ await server.connect(transport);
362
+ console.error("microservice-domains MCP server running on stdio");
363
+ }
364
+
365
+ main().catch((error) => {
366
+ console.error("Fatal error:", error);
367
+ process.exit(1);
368
+ });
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@hasna/microservice-hiring",
3
+ "version": "0.0.1",
4
+ "description": "Applicant tracking and recruitment microservice with SQLite — manage jobs, applicants, and interviews",
5
+ "type": "module",
6
+ "bin": {
7
+ "microservice-hiring": "./src/cli/index.ts",
8
+ "microservice-hiring-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
+ }