@stevepic95/rabbitmq-masstransit-mcp 1.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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +176 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +62 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/masstransit.d.ts +18 -0
  8. package/dist/masstransit.d.ts.map +1 -0
  9. package/dist/masstransit.js +203 -0
  10. package/dist/masstransit.js.map +1 -0
  11. package/dist/rabbitmq-client.d.ts +29 -0
  12. package/dist/rabbitmq-client.d.ts.map +1 -0
  13. package/dist/rabbitmq-client.js +123 -0
  14. package/dist/rabbitmq-client.js.map +1 -0
  15. package/dist/tools/connections.d.ts +4 -0
  16. package/dist/tools/connections.d.ts.map +1 -0
  17. package/dist/tools/connections.js +42 -0
  18. package/dist/tools/connections.js.map +1 -0
  19. package/dist/tools/exchanges.d.ts +4 -0
  20. package/dist/tools/exchanges.d.ts.map +1 -0
  21. package/dist/tools/exchanges.js +109 -0
  22. package/dist/tools/exchanges.js.map +1 -0
  23. package/dist/tools/masstransit.d.ts +4 -0
  24. package/dist/tools/masstransit.d.ts.map +1 -0
  25. package/dist/tools/masstransit.js +295 -0
  26. package/dist/tools/masstransit.js.map +1 -0
  27. package/dist/tools/messages.d.ts +4 -0
  28. package/dist/tools/messages.d.ts.map +1 -0
  29. package/dist/tools/messages.js +145 -0
  30. package/dist/tools/messages.js.map +1 -0
  31. package/dist/tools/overview.d.ts +4 -0
  32. package/dist/tools/overview.d.ts.map +1 -0
  33. package/dist/tools/overview.js +32 -0
  34. package/dist/tools/overview.js.map +1 -0
  35. package/dist/tools/queues.d.ts +4 -0
  36. package/dist/tools/queues.d.ts.map +1 -0
  37. package/dist/tools/queues.js +121 -0
  38. package/dist/tools/queues.js.map +1 -0
  39. package/dist/types.d.ts +195 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/package.json +47 -0
@@ -0,0 +1,123 @@
1
+ export class RabbitMQClient {
2
+ config;
3
+ baseUrl;
4
+ authHeader;
5
+ constructor(config) {
6
+ this.config = config;
7
+ const protocol = config.ssl ? "https" : "http";
8
+ this.baseUrl = `${protocol}://${config.host}:${config.port}/api`;
9
+ this.authHeader =
10
+ "Basic " +
11
+ Buffer.from(`${config.username}:${config.password}`).toString("base64");
12
+ }
13
+ encodeVhost(vhost) {
14
+ const v = vhost ?? this.config.vhost;
15
+ return v === "/" ? "%2F" : encodeURIComponent(v);
16
+ }
17
+ async request(method, path, body) {
18
+ const url = `${this.baseUrl}${path}`;
19
+ const headers = {
20
+ Authorization: this.authHeader,
21
+ "Content-Type": "application/json",
22
+ };
23
+ const response = await fetch(url, {
24
+ method,
25
+ headers,
26
+ body: body ? JSON.stringify(body) : undefined,
27
+ });
28
+ if (!response.ok) {
29
+ const text = await response.text().catch(() => "");
30
+ throw new Error(`RabbitMQ API error: ${response.status} ${response.statusText}${text ? ` - ${text}` : ""}`);
31
+ }
32
+ if (response.status === 204) {
33
+ return undefined;
34
+ }
35
+ return response.json();
36
+ }
37
+ async get(path) {
38
+ return this.request("GET", path);
39
+ }
40
+ async post(path, body) {
41
+ return this.request("POST", path, body);
42
+ }
43
+ async del(path) {
44
+ return this.request("DELETE", path);
45
+ }
46
+ // Overview
47
+ async getOverview() {
48
+ return this.get("/overview");
49
+ }
50
+ // Queues
51
+ async listQueues(vhost) {
52
+ if (vhost) {
53
+ return this.get(`/queues/${this.encodeVhost(vhost)}`);
54
+ }
55
+ return this.get("/queues");
56
+ }
57
+ async getQueue(name, vhost) {
58
+ return this.get(`/queues/${this.encodeVhost(vhost)}/${encodeURIComponent(name)}`);
59
+ }
60
+ async purgeQueue(name, vhost) {
61
+ await this.del(`/queues/${this.encodeVhost(vhost)}/${encodeURIComponent(name)}/contents`);
62
+ }
63
+ async deleteQueue(name, vhost) {
64
+ await this.del(`/queues/${this.encodeVhost(vhost)}/${encodeURIComponent(name)}`);
65
+ }
66
+ // Exchanges
67
+ async listExchanges(vhost) {
68
+ if (vhost) {
69
+ return this.get(`/exchanges/${this.encodeVhost(vhost)}`);
70
+ }
71
+ return this.get("/exchanges");
72
+ }
73
+ async getExchange(name, vhost) {
74
+ return this.get(`/exchanges/${this.encodeVhost(vhost)}/${encodeURIComponent(name)}`);
75
+ }
76
+ // Bindings
77
+ async listBindingsForQueue(queue, vhost) {
78
+ return this.get(`/queues/${this.encodeVhost(vhost)}/${encodeURIComponent(queue)}/bindings`);
79
+ }
80
+ async listBindingsForExchange(exchange, type, vhost) {
81
+ return this.get(`/exchanges/${this.encodeVhost(vhost)}/${encodeURIComponent(exchange)}/bindings/${type}`);
82
+ }
83
+ // Connections & Consumers
84
+ async listConnections() {
85
+ return this.get("/connections");
86
+ }
87
+ async listConsumers(vhost) {
88
+ if (vhost) {
89
+ return this.get(`/consumers/${this.encodeVhost(vhost)}`);
90
+ }
91
+ return this.get("/consumers");
92
+ }
93
+ // Messages
94
+ async peekMessages(queue, count = 5, vhost, ackMode = "ack_requeue_true") {
95
+ return this.post(`/queues/${this.encodeVhost(vhost)}/${encodeURIComponent(queue)}/get`, {
96
+ count,
97
+ ackmode: ackMode,
98
+ encoding: "auto",
99
+ truncate: 50000,
100
+ });
101
+ }
102
+ async publishMessage(exchange, routingKey, payload, properties = {}, vhost) {
103
+ return this.post(`/exchanges/${this.encodeVhost(vhost)}/${encodeURIComponent(exchange)}/publish`, {
104
+ routing_key: routingKey,
105
+ payload,
106
+ payload_encoding: "string",
107
+ properties: {
108
+ delivery_mode: 2,
109
+ content_type: "application/vnd.masstransit+json",
110
+ ...properties,
111
+ },
112
+ });
113
+ }
114
+ async consumeMessages(queue, count = 1, vhost) {
115
+ return this.post(`/queues/${this.encodeVhost(vhost)}/${encodeURIComponent(queue)}/get`, {
116
+ count,
117
+ ackmode: "ack_requeue_false",
118
+ encoding: "auto",
119
+ truncate: 50000,
120
+ });
121
+ }
122
+ }
123
+ //# sourceMappingURL=rabbitmq-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq-client.js","sourceRoot":"","sources":["../src/rabbitmq-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { RabbitMQClient } from "../rabbitmq-client.js";
3
+ export declare function registerConnectionTools(server: McpServer, client: RabbitMQClient): void;
4
+ //# sourceMappingURL=connections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../src/tools/connections.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,QAsEvB"}
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ export function registerConnectionTools(server, client) {
3
+ server.registerTool("list_connections", {
4
+ description: "List active RabbitMQ connections with client info, state, and channel count.",
5
+ inputSchema: z.object({}),
6
+ }, async () => {
7
+ const connections = await client.listConnections();
8
+ if (connections.length === 0) {
9
+ return {
10
+ content: [{ type: "text", text: "No active connections." }],
11
+ };
12
+ }
13
+ const lines = [`Active connections: ${connections.length}\n`];
14
+ for (const c of connections) {
15
+ const clientProps = c.client_properties ?? {};
16
+ const product = clientProps.product ??
17
+ clientProps.connection_name ??
18
+ "unknown";
19
+ lines.push(`${c.name}`, ` User: ${c.user} | Vhost: ${c.vhost} | State: ${c.state}`, ` Channels: ${c.channels} | Client: ${product}`, ` From: ${c.peer_host}:${c.peer_port} → ${c.host}:${c.port}`, ` Connected: ${new Date(c.connected_at).toISOString()}`, "");
20
+ }
21
+ return { content: [{ type: "text", text: lines.join("\n") }] };
22
+ });
23
+ server.registerTool("list_consumers", {
24
+ description: "List active consumers with their queue assignments, prefetch, and connection info.",
25
+ inputSchema: z.object({
26
+ vhost: z.string().optional().describe("Filter by vhost"),
27
+ }),
28
+ }, async ({ vhost }) => {
29
+ const consumers = await client.listConsumers(vhost);
30
+ if (consumers.length === 0) {
31
+ return {
32
+ content: [{ type: "text", text: "No active consumers." }],
33
+ };
34
+ }
35
+ const lines = [`Active consumers: ${consumers.length}\n`];
36
+ for (const c of consumers) {
37
+ lines.push(`Queue: ${c.queue.name}`, ` Tag: ${c.consumer_tag}`, ` Connection: ${c.channel_details.connection_name}`, ` User: ${c.channel_details.user} | Prefetch: ${c.prefetch_count}`, ` Ack Required: ${c.ack_required} | Active: ${c.active}`, "");
38
+ }
39
+ return { content: [{ type: "text", text: lines.join("\n") }] };
40
+ });
41
+ }
42
+ //# sourceMappingURL=connections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../src/tools/connections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { RabbitMQClient } from "../rabbitmq-client.js";
3
+ export declare function registerExchangeTools(server: McpServer, client: RabbitMQClient): void;
4
+ //# sourceMappingURL=exchanges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchanges.d.ts","sourceRoot":"","sources":["../../src/tools/exchanges.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,QAqKvB"}
@@ -0,0 +1,109 @@
1
+ import { z } from "zod";
2
+ export function registerExchangeTools(server, client) {
3
+ server.registerTool("list_exchanges", {
4
+ description: "List exchanges with type and binding info. Filter by vhost, name pattern, or type.",
5
+ inputSchema: z.object({
6
+ vhost: z.string().optional().describe("Filter by vhost"),
7
+ namePattern: z
8
+ .string()
9
+ .optional()
10
+ .describe("Filter exchange names containing this string (case-insensitive)"),
11
+ type: z
12
+ .enum(["direct", "fanout", "topic", "headers"])
13
+ .optional()
14
+ .describe("Filter by exchange type"),
15
+ }),
16
+ }, async ({ vhost, namePattern, type }) => {
17
+ let exchanges = await client.listExchanges(vhost);
18
+ if (namePattern) {
19
+ const pattern = namePattern.toLowerCase();
20
+ exchanges = exchanges.filter((e) => e.name.toLowerCase().includes(pattern));
21
+ }
22
+ if (type) {
23
+ exchanges = exchanges.filter((e) => e.type === type);
24
+ }
25
+ // Filter out default empty-name exchange unless explicitly searched
26
+ if (!namePattern) {
27
+ exchanges = exchanges.filter((e) => e.name !== "");
28
+ }
29
+ exchanges.sort((a, b) => a.name.localeCompare(b.name));
30
+ if (exchanges.length === 0) {
31
+ return {
32
+ content: [{ type: "text", text: "No exchanges found matching criteria." }],
33
+ };
34
+ }
35
+ const lines = [`Found ${exchanges.length} exchange(s):\n`];
36
+ for (const e of exchanges) {
37
+ lines.push(`${e.name || "(default)"}`, ` Type: ${e.type} | Durable: ${e.durable} | Auto-delete: ${e.auto_delete} | Internal: ${e.internal}`, "");
38
+ }
39
+ return { content: [{ type: "text", text: lines.join("\n") }] };
40
+ });
41
+ server.registerTool("get_exchange", {
42
+ description: "Get exchange details and its bindings (both source and destination).",
43
+ inputSchema: z.object({
44
+ name: z.string().describe("Exchange name"),
45
+ vhost: z.string().optional().describe("Vhost (default: configured vhost)"),
46
+ }),
47
+ }, async ({ name, vhost }) => {
48
+ const exchange = await client.getExchange(name, vhost);
49
+ const sourceBindings = await client.listBindingsForExchange(name, "source", vhost);
50
+ const destBindings = await client.listBindingsForExchange(name, "destination", vhost);
51
+ const lines = [
52
+ `Exchange: ${exchange.name}`,
53
+ `Vhost: ${exchange.vhost}`,
54
+ `Type: ${exchange.type}`,
55
+ `Durable: ${exchange.durable}`,
56
+ `Auto-delete: ${exchange.auto_delete}`,
57
+ `Internal: ${exchange.internal}`,
58
+ ];
59
+ if (sourceBindings.length > 0) {
60
+ lines.push("", `Bindings (source → destination): ${sourceBindings.length}`);
61
+ for (const b of sourceBindings) {
62
+ lines.push(` → ${b.destination_type} "${b.destination}" (routing_key: "${b.routing_key}")`);
63
+ }
64
+ }
65
+ if (destBindings.length > 0) {
66
+ lines.push("", `Bindings (incoming from): ${destBindings.length}`);
67
+ for (const b of destBindings) {
68
+ lines.push(` ← exchange "${b.source}" (routing_key: "${b.routing_key}")`);
69
+ }
70
+ }
71
+ return { content: [{ type: "text", text: lines.join("\n") }] };
72
+ });
73
+ server.registerTool("list_bindings", {
74
+ description: "List bindings for a specific queue or exchange.",
75
+ inputSchema: z.object({
76
+ target: z.string().describe("Queue or exchange name"),
77
+ targetType: z
78
+ .enum(["queue", "exchange"])
79
+ .describe("Whether the target is a queue or exchange"),
80
+ vhost: z.string().optional().describe("Vhost (default: configured vhost)"),
81
+ }),
82
+ }, async ({ target, targetType, vhost }) => {
83
+ let bindings;
84
+ if (targetType === "queue") {
85
+ bindings = await client.listBindingsForQueue(target, vhost);
86
+ }
87
+ else {
88
+ const source = await client.listBindingsForExchange(target, "source", vhost);
89
+ const dest = await client.listBindingsForExchange(target, "destination", vhost);
90
+ bindings = [...source, ...dest];
91
+ }
92
+ if (bindings.length === 0) {
93
+ return {
94
+ content: [
95
+ {
96
+ type: "text",
97
+ text: `No bindings found for ${targetType} "${target}".`,
98
+ },
99
+ ],
100
+ };
101
+ }
102
+ const lines = [`Bindings for ${targetType} "${target}": ${bindings.length}\n`];
103
+ for (const b of bindings) {
104
+ lines.push(`Source: ${b.source || "(default)"} → Destination: ${b.destination} (${b.destination_type})`, ` Routing Key: "${b.routing_key}"`, "");
105
+ }
106
+ return { content: [{ type: "text", text: lines.join("\n") }] };
107
+ });
108
+ }
109
+ //# sourceMappingURL=exchanges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchanges.js","sourceRoot":"","sources":["../../src/tools/exchanges.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { RabbitMQClient } from "../rabbitmq-client.js";
3
+ export declare function registerMassTransitTools(server: McpServer, client: RabbitMQClient, allowMutative: boolean): void;
4
+ //# sourceMappingURL=masstransit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masstransit.d.ts","sourceRoot":"","sources":["../../src/tools/masstransit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAU5D,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,EACtB,aAAa,EAAE,OAAO,QAkavB"}
@@ -0,0 +1,295 @@
1
+ import { z } from "zod";
2
+ import { isErrorQueue, isSkippedQueue, getSourceQueue, formatFaultMessage, parseEnvelope, } from "../masstransit.js";
3
+ export function registerMassTransitTools(server, client, allowMutative) {
4
+ server.registerTool("list_error_queues", {
5
+ description: "Find all MassTransit _error queues with message counts. Helps identify services with unprocessed failures.",
6
+ inputSchema: z.object({
7
+ vhost: z.string().optional().describe("Filter by vhost"),
8
+ nonEmpty: z
9
+ .boolean()
10
+ .optional()
11
+ .describe("Only show queues with messages (default: true)"),
12
+ }),
13
+ }, async ({ vhost, nonEmpty }) => {
14
+ const queues = await client.listQueues(vhost);
15
+ let errorQueues = queues.filter((q) => isErrorQueue(q.name));
16
+ if (nonEmpty !== false) {
17
+ errorQueues = errorQueues.filter((q) => q.messages > 0);
18
+ }
19
+ errorQueues.sort((a, b) => (b.messages ?? 0) - (a.messages ?? 0));
20
+ if (errorQueues.length === 0) {
21
+ return {
22
+ content: [
23
+ {
24
+ type: "text",
25
+ text: nonEmpty !== false
26
+ ? "No _error queues with messages found."
27
+ : "No _error queues found.",
28
+ },
29
+ ],
30
+ };
31
+ }
32
+ const totalErrors = errorQueues.reduce((sum, q) => sum + (q.messages ?? 0), 0);
33
+ const lines = [
34
+ `Found ${errorQueues.length} _error queue(s) with ${totalErrors} total message(s):\n`,
35
+ ];
36
+ for (const q of errorQueues) {
37
+ const source = getSourceQueue(q.name);
38
+ lines.push(`${q.name}`, ` Messages: ${q.messages} | Source queue: ${source} | Consumers: ${q.consumers}`, "");
39
+ }
40
+ return { content: [{ type: "text", text: lines.join("\n") }] };
41
+ });
42
+ server.registerTool("list_skipped_queues", {
43
+ description: "Find all MassTransit _skipped queues with message counts. Skipped messages indicate routing or serialization issues.",
44
+ inputSchema: z.object({
45
+ vhost: z.string().optional().describe("Filter by vhost"),
46
+ nonEmpty: z
47
+ .boolean()
48
+ .optional()
49
+ .describe("Only show queues with messages (default: true)"),
50
+ }),
51
+ }, async ({ vhost, nonEmpty }) => {
52
+ const queues = await client.listQueues(vhost);
53
+ let skippedQueues = queues.filter((q) => isSkippedQueue(q.name));
54
+ if (nonEmpty !== false) {
55
+ skippedQueues = skippedQueues.filter((q) => q.messages > 0);
56
+ }
57
+ skippedQueues.sort((a, b) => (b.messages ?? 0) - (a.messages ?? 0));
58
+ if (skippedQueues.length === 0) {
59
+ return {
60
+ content: [
61
+ {
62
+ type: "text",
63
+ text: nonEmpty !== false
64
+ ? "No _skipped queues with messages found."
65
+ : "No _skipped queues found.",
66
+ },
67
+ ],
68
+ };
69
+ }
70
+ const totalSkipped = skippedQueues.reduce((sum, q) => sum + (q.messages ?? 0), 0);
71
+ const lines = [
72
+ `Found ${skippedQueues.length} _skipped queue(s) with ${totalSkipped} total message(s):\n`,
73
+ ];
74
+ for (const q of skippedQueues) {
75
+ const source = getSourceQueue(q.name);
76
+ lines.push(`${q.name}`, ` Messages: ${q.messages} | Source queue: ${source} | Consumers: ${q.consumers}`, "");
77
+ }
78
+ return { content: [{ type: "text", text: lines.join("\n") }] };
79
+ });
80
+ server.registerTool("peek_errors", {
81
+ description: "Browse error queue messages with parsed MassTransit fault details: exception type, message, stack trace, original payload, and source host.",
82
+ inputSchema: z.object({
83
+ queue: z
84
+ .string()
85
+ .describe('Error queue name (e.g., "submit-order_error")'),
86
+ count: z
87
+ .number()
88
+ .int()
89
+ .min(1)
90
+ .max(50)
91
+ .optional()
92
+ .describe("Number of messages to peek (default: 5, max: 50)"),
93
+ vhost: z.string().optional().describe("Vhost (default: configured vhost)"),
94
+ }),
95
+ }, async ({ queue, count, vhost }) => {
96
+ const messages = await client.peekMessages(queue, count ?? 5, vhost);
97
+ if (messages.length === 0) {
98
+ return {
99
+ content: [
100
+ {
101
+ type: "text",
102
+ text: `Queue "${queue}" is empty.`,
103
+ },
104
+ ],
105
+ };
106
+ }
107
+ const lines = [`Queue: ${queue} (${messages.length} message(s))\n`];
108
+ for (let i = 0; i < messages.length; i++) {
109
+ lines.push(formatFaultMessage(messages[i], i));
110
+ lines.push("");
111
+ }
112
+ return { content: [{ type: "text", text: lines.join("\n") }] };
113
+ });
114
+ server.registerTool("get_queue_health", {
115
+ description: "Quick health check: find queues with no consumers, growing depth, or high error counts. Identifies potential issues.",
116
+ inputSchema: z.object({
117
+ vhost: z.string().optional().describe("Filter by vhost"),
118
+ minMessages: z
119
+ .number()
120
+ .int()
121
+ .optional()
122
+ .describe("Minimum messages to flag a queue (default: 1)"),
123
+ }),
124
+ }, async ({ vhost, minMessages }) => {
125
+ const queues = await client.listQueues(vhost);
126
+ const threshold = minMessages ?? 1;
127
+ const noConsumers = queues.filter((q) => q.consumers === 0 &&
128
+ q.messages >= threshold &&
129
+ !isErrorQueue(q.name) &&
130
+ !isSkippedQueue(q.name));
131
+ const errorQueues = queues
132
+ .filter((q) => isErrorQueue(q.name) && q.messages >= threshold)
133
+ .sort((a, b) => (b.messages ?? 0) - (a.messages ?? 0));
134
+ const skippedQueues = queues
135
+ .filter((q) => isSkippedQueue(q.name) && q.messages >= threshold)
136
+ .sort((a, b) => (b.messages ?? 0) - (a.messages ?? 0));
137
+ const highDepth = queues
138
+ .filter((q) => q.messages >= 1000 &&
139
+ !isErrorQueue(q.name) &&
140
+ !isSkippedQueue(q.name))
141
+ .sort((a, b) => (b.messages ?? 0) - (a.messages ?? 0));
142
+ const lines = [];
143
+ if (noConsumers.length === 0 &&
144
+ errorQueues.length === 0 &&
145
+ skippedQueues.length === 0 &&
146
+ highDepth.length === 0) {
147
+ return {
148
+ content: [
149
+ { type: "text", text: "All queues look healthy — no issues detected." },
150
+ ],
151
+ };
152
+ }
153
+ if (noConsumers.length > 0) {
154
+ lines.push(`⚠ Queues with NO consumers and messages (${noConsumers.length}):`);
155
+ for (const q of noConsumers) {
156
+ lines.push(` ${q.name} — ${q.messages} message(s)`);
157
+ }
158
+ lines.push("");
159
+ }
160
+ if (errorQueues.length > 0) {
161
+ const total = errorQueues.reduce((s, q) => s + q.messages, 0);
162
+ lines.push(`✗ Error queues with messages (${errorQueues.length} queues, ${total} total):`);
163
+ for (const q of errorQueues) {
164
+ lines.push(` ${q.name} — ${q.messages} message(s)`);
165
+ }
166
+ lines.push("");
167
+ }
168
+ if (skippedQueues.length > 0) {
169
+ const total = skippedQueues.reduce((s, q) => s + q.messages, 0);
170
+ lines.push(`⊘ Skipped queues with messages (${skippedQueues.length} queues, ${total} total):`);
171
+ for (const q of skippedQueues) {
172
+ lines.push(` ${q.name} — ${q.messages} message(s)`);
173
+ }
174
+ lines.push("");
175
+ }
176
+ if (highDepth.length > 0) {
177
+ lines.push(`△ High depth queues (>1000 messages, ${highDepth.length}):`);
178
+ for (const q of highDepth) {
179
+ lines.push(` ${q.name} — ${q.messages} message(s), ${q.consumers} consumer(s)`);
180
+ }
181
+ lines.push("");
182
+ }
183
+ return { content: [{ type: "text", text: lines.join("\n") }] };
184
+ });
185
+ if (allowMutative) {
186
+ server.registerTool("republish_from_error", {
187
+ description: "Fetch messages from a MassTransit _error queue and republish them to their original exchange for reprocessing. Two-step: first call shows message details, second call with confirm=true executes the republish.",
188
+ inputSchema: z.object({
189
+ errorQueue: z
190
+ .string()
191
+ .describe('Error queue name (e.g., "submit-order_error")'),
192
+ count: z
193
+ .number()
194
+ .int()
195
+ .min(1)
196
+ .max(50)
197
+ .optional()
198
+ .describe("Number of messages to republish (default: 1, max: 50)"),
199
+ confirm: z
200
+ .boolean()
201
+ .optional()
202
+ .describe("Set to true to execute the republish. Without this, only previews messages."),
203
+ vhost: z.string().optional().describe("Vhost (default: configured vhost)"),
204
+ }),
205
+ annotations: {
206
+ destructiveHint: true,
207
+ },
208
+ }, async ({ errorQueue, count, confirm, vhost }) => {
209
+ const peekCount = count ?? 1;
210
+ if (!confirm) {
211
+ // Preview mode — peek without consuming
212
+ const messages = await client.peekMessages(errorQueue, peekCount, vhost);
213
+ if (messages.length === 0) {
214
+ return {
215
+ content: [
216
+ {
217
+ type: "text",
218
+ text: `Queue "${errorQueue}" is empty — nothing to republish.`,
219
+ },
220
+ ],
221
+ };
222
+ }
223
+ const lines = [
224
+ `Preview: ${messages.length} message(s) from "${errorQueue}" ready to republish:\n`,
225
+ ];
226
+ for (let i = 0; i < messages.length; i++) {
227
+ lines.push(formatFaultMessage(messages[i], i));
228
+ lines.push("");
229
+ }
230
+ lines.push("---", `To republish these messages, call again with confirm=true and count=${messages.length}.`);
231
+ return {
232
+ content: [{ type: "text", text: lines.join("\n") }],
233
+ };
234
+ }
235
+ // Confirm mode — consume and republish
236
+ const messages = await client.consumeMessages(errorQueue, peekCount, vhost);
237
+ if (messages.length === 0) {
238
+ return {
239
+ content: [
240
+ {
241
+ type: "text",
242
+ text: `Queue "${errorQueue}" is empty — nothing to republish.`,
243
+ },
244
+ ],
245
+ };
246
+ }
247
+ let republished = 0;
248
+ const errors = [];
249
+ for (const msg of messages) {
250
+ try {
251
+ const envelope = parseEnvelope(msg.payload);
252
+ let targetExchange;
253
+ let routingKey;
254
+ if (envelope?.destinationAddress) {
255
+ // Extract exchange from MassTransit destination address
256
+ // Format: rabbitmq://host/vhost/exchange-name
257
+ const url = new URL(envelope.destinationAddress);
258
+ const pathParts = url.pathname.split("/").filter(Boolean);
259
+ targetExchange = pathParts[pathParts.length - 1] ?? "";
260
+ routingKey = targetExchange;
261
+ }
262
+ else {
263
+ // Fallback: derive from error queue name
264
+ const sourceQueue = getSourceQueue(errorQueue);
265
+ targetExchange = sourceQueue;
266
+ routingKey = sourceQueue;
267
+ }
268
+ // Republish the original message content
269
+ const payload = envelope?.message
270
+ ? msg.payload // Keep the full envelope
271
+ : msg.payload;
272
+ await client.publishMessage(targetExchange, routingKey, payload, {
273
+ content_type: msg.properties.content_type ??
274
+ "application/vnd.masstransit+json",
275
+ headers: msg.properties.headers,
276
+ message_id: msg.properties.message_id,
277
+ }, vhost);
278
+ republished++;
279
+ }
280
+ catch (err) {
281
+ const errMsg = err instanceof Error ? err.message : String(err);
282
+ errors.push(`Message ${republished + 1}: ${errMsg}`);
283
+ }
284
+ }
285
+ const lines = [
286
+ `Republished ${republished}/${messages.length} message(s) from "${errorQueue}".`,
287
+ ];
288
+ if (errors.length > 0) {
289
+ lines.push("", "Errors:", ...errors);
290
+ }
291
+ return { content: [{ type: "text", text: lines.join("\n") }] };
292
+ });
293
+ }
294
+ }
295
+ //# sourceMappingURL=masstransit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masstransit.js","sourceRoot":"","sources":["../../src/tools/masstransit.ts"],"names":[],"mappings":"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"}