@zerobuild/mcp 2.6.1
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/README.md +114 -0
- package/dist/client.d.ts +79 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +137 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +171 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +164 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/channels.d.ts +4 -0
- package/dist/resources/channels.d.ts.map +1 -0
- package/dist/resources/channels.js +58 -0
- package/dist/resources/channels.js.map +1 -0
- package/dist/resources/contacts.d.ts +4 -0
- package/dist/resources/contacts.d.ts.map +1 -0
- package/dist/resources/contacts.js +73 -0
- package/dist/resources/contacts.js.map +1 -0
- package/dist/resources/conversations.d.ts +4 -0
- package/dist/resources/conversations.d.ts.map +1 -0
- package/dist/resources/conversations.js +97 -0
- package/dist/resources/conversations.js.map +1 -0
- package/dist/resources/documents.d.ts +4 -0
- package/dist/resources/documents.d.ts.map +1 -0
- package/dist/resources/documents.js +63 -0
- package/dist/resources/documents.js.map +1 -0
- package/dist/resources/search.d.ts +4 -0
- package/dist/resources/search.d.ts.map +1 -0
- package/dist/resources/search.js +44 -0
- package/dist/resources/search.js.map +1 -0
- package/dist/tools/conversations.d.ts +4 -0
- package/dist/tools/conversations.d.ts.map +1 -0
- package/dist/tools/conversations.js +124 -0
- package/dist/tools/conversations.js.map +1 -0
- package/dist/tools/documents.d.ts +4 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +75 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/messages.d.ts +4 -0
- package/dist/tools/messages.d.ts.map +1 -0
- package/dist/tools/messages.js +31 -0
- package/dist/tools/messages.js.map +1 -0
- package/dist/tools/search.d.ts +4 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +37 -0
- package/dist/tools/search.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerPrompts(server, client) {
|
|
3
|
+
server.prompt("summarize-conversation", "Summarize a live chat conversation with full customer context", { conversationId: z.string().uuid().describe("Conversation UUID") }, async ({ conversationId }) => {
|
|
4
|
+
const [conversation, messages] = await Promise.all([
|
|
5
|
+
client.getConversation(conversationId),
|
|
6
|
+
client.getConversationMessages(conversationId, { limit: 100 }),
|
|
7
|
+
]);
|
|
8
|
+
const contact = conversation.contact;
|
|
9
|
+
const msgList = Array.isArray(messages) ? messages : messages.data || [];
|
|
10
|
+
const contextLines = [];
|
|
11
|
+
contextLines.push(`Contact: ${contact?.name || "Unknown"} (${contact?.email || "no email"})`);
|
|
12
|
+
contextLines.push(`Status: ${conversation.status}`);
|
|
13
|
+
contextLines.push(`Assigned: ${conversation.assignedAgentName || "Unassigned"}`);
|
|
14
|
+
if (conversation.tags?.length) {
|
|
15
|
+
contextLines.push(`Tags: ${conversation.tags.map((t) => t.name).join(", ")}`);
|
|
16
|
+
}
|
|
17
|
+
contextLines.push("");
|
|
18
|
+
contextLines.push("Messages:");
|
|
19
|
+
for (const msg of msgList) {
|
|
20
|
+
const time = new Date(msg.createdAt).toLocaleString();
|
|
21
|
+
const author = msg.author?.name || "System";
|
|
22
|
+
const prefix = msg.isInternalNote ? "[INTERNAL] " : "";
|
|
23
|
+
contextLines.push(`[${time}] ${prefix}${author}: ${msg.content}`);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
messages: [
|
|
27
|
+
{
|
|
28
|
+
role: "user",
|
|
29
|
+
content: {
|
|
30
|
+
type: "text",
|
|
31
|
+
text: `Summarize the following customer conversation. Include:\n- Customer info and context\n- Key issues or questions raised\n- Current status and any pending actions\n- Sentiment assessment\n\n${contextLines.join("\n")}`,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
server.prompt("draft-reply", "Draft a reply to a customer based on conversation history and available canned responses", {
|
|
38
|
+
conversationId: z.string().uuid().describe("Conversation UUID"),
|
|
39
|
+
tone: z
|
|
40
|
+
.enum(["friendly", "professional", "concise"])
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("Reply tone"),
|
|
43
|
+
}, async ({ conversationId, tone }) => {
|
|
44
|
+
const [conversation, messages, canned] = await Promise.all([
|
|
45
|
+
client.getConversation(conversationId),
|
|
46
|
+
client.getConversationMessages(conversationId, { limit: 50 }),
|
|
47
|
+
client.listCannedResponses(),
|
|
48
|
+
]);
|
|
49
|
+
const msgList = Array.isArray(messages) ? messages : messages.data || [];
|
|
50
|
+
const cannedList = Array.isArray(canned) ? canned : [];
|
|
51
|
+
const contextLines = [];
|
|
52
|
+
contextLines.push("## Conversation");
|
|
53
|
+
contextLines.push(`Customer: ${conversation.contact?.name || conversation.contact?.email || "Unknown"}`);
|
|
54
|
+
contextLines.push("");
|
|
55
|
+
for (const msg of msgList) {
|
|
56
|
+
const author = msg.author?.name || "Customer";
|
|
57
|
+
const prefix = msg.isInternalNote ? "[INTERNAL] " : "";
|
|
58
|
+
contextLines.push(`${prefix}${author}: ${msg.content}`);
|
|
59
|
+
}
|
|
60
|
+
if (cannedList.length > 0) {
|
|
61
|
+
contextLines.push("");
|
|
62
|
+
contextLines.push("## Available Canned Responses");
|
|
63
|
+
for (const cr of cannedList) {
|
|
64
|
+
contextLines.push(`- /${cr.shortcut}: ${cr.title} — "${cr.content}"`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const toneInstruction = tone
|
|
68
|
+
? `Use a ${tone} tone.`
|
|
69
|
+
: "Use a professional and helpful tone.";
|
|
70
|
+
return {
|
|
71
|
+
messages: [
|
|
72
|
+
{
|
|
73
|
+
role: "user",
|
|
74
|
+
content: {
|
|
75
|
+
type: "text",
|
|
76
|
+
text: `Draft a reply to the customer's last message. ${toneInstruction}\n\nIf a canned response fits, you can adapt it. Keep the reply concise and helpful.\n\n${contextLines.join("\n")}`,
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
server.prompt("find-related", "Find conversations and documents related to a topic", { topic: z.string().describe("Topic or keywords to search for") }, async ({ topic }) => {
|
|
83
|
+
const result = await client.search({ q: topic, type: "all", limit: 20 });
|
|
84
|
+
const results = result.results || [];
|
|
85
|
+
const contextLines = [`Search results for "${topic}":\n`];
|
|
86
|
+
for (const r of results) {
|
|
87
|
+
contextLines.push(`[${r.type}] ${r.title || r.id}`);
|
|
88
|
+
if (r.snippet)
|
|
89
|
+
contextLines.push(` ${r.snippet}`);
|
|
90
|
+
contextLines.push("");
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
messages: [
|
|
94
|
+
{
|
|
95
|
+
role: "user",
|
|
96
|
+
content: {
|
|
97
|
+
type: "text",
|
|
98
|
+
text: `Analyze these search results and identify the most relevant conversations and documents related to "${topic}". Group by theme and highlight any patterns or connections.\n\n${contextLines.join("\n")}`,
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
server.prompt("conversation-handoff", "Generate a handoff summary for transferring a conversation to another agent", { conversationId: z.string().uuid().describe("Conversation UUID") }, async ({ conversationId }) => {
|
|
105
|
+
const [conversation, messages] = await Promise.all([
|
|
106
|
+
client.getConversation(conversationId),
|
|
107
|
+
client.getConversationMessages(conversationId, { limit: 100 }),
|
|
108
|
+
]);
|
|
109
|
+
const contact = conversation.contact;
|
|
110
|
+
const msgList = Array.isArray(messages) ? messages : messages.data || [];
|
|
111
|
+
const contextLines = [];
|
|
112
|
+
contextLines.push(`Customer: ${contact?.name || "Unknown"} (${contact?.email || "no email"})`);
|
|
113
|
+
contextLines.push(`Assigned: ${conversation.assignedAgentName || "Unassigned"}`);
|
|
114
|
+
contextLines.push(`Tags: ${conversation.tags?.map((t) => t.name).join(", ") || "none"}`);
|
|
115
|
+
contextLines.push("");
|
|
116
|
+
for (const msg of msgList) {
|
|
117
|
+
const author = msg.author?.name || "Customer";
|
|
118
|
+
const prefix = msg.isInternalNote ? "[INTERNAL] " : "";
|
|
119
|
+
contextLines.push(`${prefix}${author}: ${msg.content}`);
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
messages: [
|
|
123
|
+
{
|
|
124
|
+
role: "user",
|
|
125
|
+
content: {
|
|
126
|
+
type: "text",
|
|
127
|
+
text: `Generate a structured handoff summary for this conversation. Include:\n- Customer background\n- Issue summary\n- What's been tried or discussed\n- Recommended next steps\n\n${contextLines.join("\n")}`,
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
server.prompt("daily-digest", "Generate a digest of today's conversation activity", {}, async () => {
|
|
134
|
+
const [open, closed] = await Promise.all([
|
|
135
|
+
client.listConversations({ status: "open", limit: 50 }),
|
|
136
|
+
client.listConversations({ status: "closed", limit: 50 }),
|
|
137
|
+
]);
|
|
138
|
+
const contextLines = [];
|
|
139
|
+
contextLines.push(`## Open Conversations (${open.conversations.length})`);
|
|
140
|
+
for (const c of open.conversations) {
|
|
141
|
+
const contact = c.contact?.name || c.contact?.email || "Unknown";
|
|
142
|
+
const assigned = c.assignedAgentName || "Unassigned";
|
|
143
|
+
contextLines.push(`- ${contact} → ${assigned} (since ${new Date(c.createdAt).toLocaleDateString()})`);
|
|
144
|
+
}
|
|
145
|
+
contextLines.push("");
|
|
146
|
+
contextLines.push(`## Recently Closed (${closed.conversations.length})`);
|
|
147
|
+
for (const c of closed.conversations) {
|
|
148
|
+
const contact = c.contact?.name || c.contact?.email || "Unknown";
|
|
149
|
+
contextLines.push(`- ${contact} (closed ${new Date(c.closedAt || c.updatedAt).toLocaleDateString()})`);
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
messages: [
|
|
153
|
+
{
|
|
154
|
+
role: "user",
|
|
155
|
+
content: {
|
|
156
|
+
type: "text",
|
|
157
|
+
text: `Generate a daily digest of conversation activity. Summarize:\n- New and open conversations requiring attention\n- Recently resolved conversations\n- Any patterns or observations\n\n${contextLines.join("\n")}`,
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../src/resources/channels.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,QAqExB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export function registerChannelResources(server, client) {
|
|
3
|
+
// List channels
|
|
4
|
+
server.resource("channels", "zerobuild://channels", { description: "List of team chat channels" }, async () => {
|
|
5
|
+
const channels = await client.listChannels();
|
|
6
|
+
const list = Array.isArray(channels) ? channels : [];
|
|
7
|
+
const lines = ["# Channels\n"];
|
|
8
|
+
if (list.length === 0) {
|
|
9
|
+
lines.push("No channels found.");
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
lines.push("| ID | Name | Description | Private |");
|
|
13
|
+
lines.push("|---|---|---|---|");
|
|
14
|
+
for (const ch of list) {
|
|
15
|
+
const desc = ch.description || "-";
|
|
16
|
+
lines.push(`| ${ch.id} | #${ch.name} | ${desc} | ${ch.isPrivate ? "Yes" : "No"} |`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
contents: [
|
|
21
|
+
{
|
|
22
|
+
uri: "zerobuild://channels",
|
|
23
|
+
mimeType: "text/markdown",
|
|
24
|
+
text: lines.join("\n"),
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
// Channel messages
|
|
30
|
+
server.resource("channel-messages", new ResourceTemplate("zerobuild://channels/{channelId}/messages", { list: undefined }), { description: "Recent messages in a channel" }, async (uri, variables) => {
|
|
31
|
+
const channelId = variables.channelId;
|
|
32
|
+
const messages = await client.getChannelMessages(channelId, { limit: 50 });
|
|
33
|
+
const list = Array.isArray(messages) ? messages : messages.data || [];
|
|
34
|
+
const lines = [`# Channel Messages\n`];
|
|
35
|
+
if (list.length === 0) {
|
|
36
|
+
lines.push("No messages in this channel.");
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
for (const msg of list) {
|
|
40
|
+
const time = new Date(msg.createdAt).toLocaleString();
|
|
41
|
+
const author = msg.author?.name || "System";
|
|
42
|
+
lines.push(`**[${time}] ${author}:**`);
|
|
43
|
+
lines.push(msg.content);
|
|
44
|
+
lines.push("");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
contents: [
|
|
49
|
+
{
|
|
50
|
+
uri: uri.href,
|
|
51
|
+
mimeType: "text/markdown",
|
|
52
|
+
text: lines.join("\n"),
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=channels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../../src/resources/channels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/resources/contacts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,QAqFxB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export function registerContactResources(server, client) {
|
|
3
|
+
// List contacts
|
|
4
|
+
server.resource("contacts", "zerobuild://contacts", { description: "List of all contacts (customers)" }, async () => {
|
|
5
|
+
const contacts = await client.listContacts({ limit: 100 });
|
|
6
|
+
const list = Array.isArray(contacts) ? contacts : contacts.data || [];
|
|
7
|
+
const lines = ["# Contacts\n"];
|
|
8
|
+
if (list.length === 0) {
|
|
9
|
+
lines.push("No contacts found.");
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
lines.push("| ID | Name | Email | First Seen | Last Seen |");
|
|
13
|
+
lines.push("|---|---|---|---|---|");
|
|
14
|
+
for (const c of list) {
|
|
15
|
+
const name = c.name || "-";
|
|
16
|
+
const email = c.email || "-";
|
|
17
|
+
const firstSeen = new Date(c.firstSeenAt).toLocaleDateString();
|
|
18
|
+
const lastSeen = new Date(c.lastSeenAt).toLocaleDateString();
|
|
19
|
+
lines.push(`| ${c.id} | ${name} | ${email} | ${firstSeen} | ${lastSeen} |`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
contents: [
|
|
24
|
+
{
|
|
25
|
+
uri: "zerobuild://contacts",
|
|
26
|
+
mimeType: "text/markdown",
|
|
27
|
+
text: lines.join("\n"),
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
// Contact detail
|
|
33
|
+
server.resource("contact-detail", new ResourceTemplate("zerobuild://contacts/{contactId}", { list: undefined }), { description: "Contact detail with conversation history" }, async (uri, variables) => {
|
|
34
|
+
const contactId = variables.contactId;
|
|
35
|
+
const contact = await client.getContact(contactId);
|
|
36
|
+
const lines = [
|
|
37
|
+
`# Contact: ${contact.name || contact.email || "Unknown"}`,
|
|
38
|
+
"",
|
|
39
|
+
];
|
|
40
|
+
if (contact.name)
|
|
41
|
+
lines.push(`- **Name:** ${contact.name}`);
|
|
42
|
+
if (contact.email)
|
|
43
|
+
lines.push(`- **Email:** ${contact.email}`);
|
|
44
|
+
lines.push(`- **First seen:** ${new Date(contact.firstSeenAt).toLocaleDateString()}`);
|
|
45
|
+
lines.push(`- **Last seen:** ${new Date(contact.lastSeenAt).toLocaleDateString()}`);
|
|
46
|
+
if (contact.customFields && Object.keys(contact.customFields).length > 0) {
|
|
47
|
+
lines.push("", "## Custom Fields");
|
|
48
|
+
for (const [key, value] of Object.entries(contact.customFields)) {
|
|
49
|
+
lines.push(`- **${key}:** ${value}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (contact.conversations?.length) {
|
|
53
|
+
lines.push("", "## Conversations");
|
|
54
|
+
lines.push("| ID | Status | Subject | Created |");
|
|
55
|
+
lines.push("|---|---|---|---|");
|
|
56
|
+
for (const conv of contact.conversations) {
|
|
57
|
+
const subject = conv.subject || "-";
|
|
58
|
+
const created = new Date(conv.createdAt).toLocaleDateString();
|
|
59
|
+
lines.push(`| ${conv.id} | ${conv.status} | ${subject} | ${created} |`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
contents: [
|
|
64
|
+
{
|
|
65
|
+
uri: uri.href,
|
|
66
|
+
mimeType: "text/markdown",
|
|
67
|
+
text: lines.join("\n"),
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=contacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/resources/contacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { ZerobuildClient } from "../client.js";
|
|
3
|
+
export declare function registerConversationResources(server: McpServer, client: ZerobuildClient): void;
|
|
4
|
+
//# sourceMappingURL=conversations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../src/resources/conversations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,QAoHxB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export function registerConversationResources(server, client) {
|
|
3
|
+
// List open conversations
|
|
4
|
+
server.resource("conversations", "zerobuild://conversations", { description: "List of open live chat conversations" }, async () => {
|
|
5
|
+
const result = await client.listConversations({
|
|
6
|
+
status: "open",
|
|
7
|
+
limit: 50,
|
|
8
|
+
});
|
|
9
|
+
const conversations = result.conversations;
|
|
10
|
+
const lines = ["# Open Conversations\n"];
|
|
11
|
+
if (conversations.length === 0) {
|
|
12
|
+
lines.push("No open conversations.");
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
lines.push("| ID | Contact | Assigned | Tags | Last Message | Created |");
|
|
16
|
+
lines.push("|---|---|---|---|---|---|");
|
|
17
|
+
for (const c of conversations) {
|
|
18
|
+
const contact = c.contact?.name || c.contact?.email || "Unknown";
|
|
19
|
+
const assigned = c.assignedAgentName || "Unassigned";
|
|
20
|
+
const tags = c.tags?.map((t) => t.name).join(", ") || "-";
|
|
21
|
+
const lastMsg = c.lastMessage
|
|
22
|
+
? c.lastMessage.content?.slice(0, 60) + (c.lastMessage.content?.length > 60 ? "..." : "")
|
|
23
|
+
: "-";
|
|
24
|
+
const created = new Date(c.createdAt).toLocaleDateString();
|
|
25
|
+
lines.push(`| ${c.id} | ${contact} | ${assigned} | ${tags} | ${lastMsg} | ${created} |`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
contents: [
|
|
30
|
+
{
|
|
31
|
+
uri: "zerobuild://conversations",
|
|
32
|
+
mimeType: "text/markdown",
|
|
33
|
+
text: lines.join("\n"),
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
// Conversation detail with messages
|
|
39
|
+
server.resource("conversation-detail", new ResourceTemplate("zerobuild://conversations/{conversationId}", { list: undefined }), { description: "Conversation detail with messages and customer context" }, async (uri, variables) => {
|
|
40
|
+
const conversationId = variables.conversationId;
|
|
41
|
+
const [conversation, messages] = await Promise.all([
|
|
42
|
+
client.getConversation(conversationId),
|
|
43
|
+
client.getConversationMessages(conversationId, { limit: 50 }),
|
|
44
|
+
]);
|
|
45
|
+
const contact = conversation.contact;
|
|
46
|
+
const visitor = conversation.visitorMetadata;
|
|
47
|
+
const lines = [
|
|
48
|
+
`# Conversation with ${contact?.name || contact?.email || "Unknown"}`,
|
|
49
|
+
"",
|
|
50
|
+
`**Status:** ${conversation.status} | **Assigned:** ${conversation.assignedAgentName || "Unassigned"}`,
|
|
51
|
+
];
|
|
52
|
+
if (conversation.tags?.length) {
|
|
53
|
+
lines.push(`**Tags:** ${conversation.tags.map((t) => t.name).join(", ")}`);
|
|
54
|
+
}
|
|
55
|
+
if (visitor) {
|
|
56
|
+
const visitorParts = [];
|
|
57
|
+
if (visitor.browser)
|
|
58
|
+
visitorParts.push(`${visitor.browser} on ${visitor.os || "unknown OS"}`);
|
|
59
|
+
if (visitor.city || visitor.country)
|
|
60
|
+
visitorParts.push([visitor.city, visitor.country].filter(Boolean).join(", "));
|
|
61
|
+
if (visitor.pageUrl)
|
|
62
|
+
visitorParts.push(`Page: ${visitor.pageUrl}`);
|
|
63
|
+
if (visitorParts.length)
|
|
64
|
+
lines.push(`**Visitor:** ${visitorParts.join(" | ")}`);
|
|
65
|
+
}
|
|
66
|
+
if (contact) {
|
|
67
|
+
lines.push("");
|
|
68
|
+
lines.push("## Contact");
|
|
69
|
+
if (contact.name)
|
|
70
|
+
lines.push(`- **Name:** ${contact.name}`);
|
|
71
|
+
if (contact.email)
|
|
72
|
+
lines.push(`- **Email:** ${contact.email}`);
|
|
73
|
+
lines.push(`- **First seen:** ${new Date(contact.firstSeenAt).toLocaleDateString()}`);
|
|
74
|
+
lines.push(`- **Last seen:** ${new Date(contact.lastSeenAt).toLocaleDateString()}`);
|
|
75
|
+
}
|
|
76
|
+
lines.push("", "## Messages", "");
|
|
77
|
+
const msgList = Array.isArray(messages) ? messages : messages.data || [];
|
|
78
|
+
for (const msg of msgList) {
|
|
79
|
+
const time = new Date(msg.createdAt).toLocaleString();
|
|
80
|
+
const author = msg.author?.name || "System";
|
|
81
|
+
const prefix = msg.isInternalNote ? "[INTERNAL NOTE] " : "";
|
|
82
|
+
lines.push(`**[${time}] ${prefix}${author}:**`);
|
|
83
|
+
lines.push(msg.content);
|
|
84
|
+
lines.push("");
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
contents: [
|
|
88
|
+
{
|
|
89
|
+
uri: uri.href,
|
|
90
|
+
mimeType: "text/markdown",
|
|
91
|
+
text: lines.join("\n"),
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=conversations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversations.js","sourceRoot":"","sources":["../../src/resources/conversations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/resources/documents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAgBpD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,QAkExB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
function formatDocTree(docs, indent = 0) {
|
|
3
|
+
const lines = [];
|
|
4
|
+
for (const doc of docs) {
|
|
5
|
+
const prefix = " ".repeat(indent);
|
|
6
|
+
const icon = doc.isFolder ? "[folder]" : "[doc]";
|
|
7
|
+
const updated = new Date(doc.updatedAt).toLocaleDateString();
|
|
8
|
+
lines.push(`${prefix}${icon} ${doc.title} (${doc.id}) — updated ${updated}`);
|
|
9
|
+
if (doc.children?.length) {
|
|
10
|
+
lines.push(...formatDocTree(doc.children, indent + 1));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return lines;
|
|
14
|
+
}
|
|
15
|
+
export function registerDocumentResources(server, client) {
|
|
16
|
+
// Document tree
|
|
17
|
+
server.resource("documents", "zerobuild://documents", { description: "Document and folder tree" }, async () => {
|
|
18
|
+
const docs = await client.listDocuments();
|
|
19
|
+
const list = Array.isArray(docs) ? docs : [];
|
|
20
|
+
const lines = ["# Documents\n"];
|
|
21
|
+
if (list.length === 0) {
|
|
22
|
+
lines.push("No documents found.");
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
lines.push(...formatDocTree(list));
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
contents: [
|
|
29
|
+
{
|
|
30
|
+
uri: "zerobuild://documents",
|
|
31
|
+
mimeType: "text/markdown",
|
|
32
|
+
text: lines.join("\n"),
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
// Document detail
|
|
38
|
+
server.resource("document-detail", new ResourceTemplate("zerobuild://documents/{documentId}", { list: undefined }), { description: "Document content" }, async (uri, variables) => {
|
|
39
|
+
const documentId = variables.documentId;
|
|
40
|
+
const doc = await client.getDocument(documentId);
|
|
41
|
+
const lines = [`# ${doc.title}`, ""];
|
|
42
|
+
if (doc.isFolder) {
|
|
43
|
+
lines.push("*This is a folder.*");
|
|
44
|
+
}
|
|
45
|
+
else if (doc.contentText) {
|
|
46
|
+
lines.push(doc.contentText);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
lines.push("*Empty document.*");
|
|
50
|
+
}
|
|
51
|
+
lines.push("", "---", `Last updated: ${new Date(doc.updatedAt).toLocaleString()}`);
|
|
52
|
+
return {
|
|
53
|
+
contents: [
|
|
54
|
+
{
|
|
55
|
+
uri: uri.href,
|
|
56
|
+
mimeType: "text/markdown",
|
|
57
|
+
text: lines.join("\n"),
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=documents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/resources/documents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/resources/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,QAgDxB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export function registerSearchResource(server, client) {
|
|
3
|
+
server.resource("search", new ResourceTemplate("zerobuild://search/{query}", { list: undefined }), { description: "Search across messages, documents, contacts, and people" }, async (uri, variables) => {
|
|
4
|
+
const query = variables.query;
|
|
5
|
+
const result = await client.search({ q: query, type: "all", limit: 20 });
|
|
6
|
+
const results = result.results || [];
|
|
7
|
+
const lines = [`# Search Results for "${query}"\n`];
|
|
8
|
+
lines.push(`Found ${result.total || results.length} results.\n`);
|
|
9
|
+
if (results.length === 0) {
|
|
10
|
+
lines.push("No results found.");
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
// Group by type
|
|
14
|
+
const grouped = {};
|
|
15
|
+
for (const r of results) {
|
|
16
|
+
const type = r.type || "other";
|
|
17
|
+
if (!grouped[type])
|
|
18
|
+
grouped[type] = [];
|
|
19
|
+
grouped[type].push(r);
|
|
20
|
+
}
|
|
21
|
+
for (const [type, items] of Object.entries(grouped)) {
|
|
22
|
+
lines.push(`## ${type.charAt(0).toUpperCase() + type.slice(1)}s\n`);
|
|
23
|
+
for (const item of items) {
|
|
24
|
+
lines.push(`- **${item.title || item.id}**`);
|
|
25
|
+
if (item.snippet)
|
|
26
|
+
lines.push(` ${item.snippet}`);
|
|
27
|
+
if (item.authorName)
|
|
28
|
+
lines.push(` *by ${item.authorName} at ${new Date(item.timestamp).toLocaleString()}*`);
|
|
29
|
+
lines.push("");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
contents: [
|
|
35
|
+
{
|
|
36
|
+
uri: uri.href,
|
|
37
|
+
mimeType: "text/markdown",
|
|
38
|
+
text: lines.join("\n"),
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/resources/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI3E,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,MAAuB;IAEvB,MAAM,CAAC,QAAQ,CACb,QAAQ,EACR,IAAI,gBAAgB,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EACvE,EAAE,WAAW,EAAE,yDAAyD,EAAE,EAC1E,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAe,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAEzE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,CAAC,yBAAyB,KAAK,KAAK,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;QAEjE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,gBAAgB;YAChB,MAAM,OAAO,GAA0B,EAAE,CAAC;YAC1C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC;YAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACpE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;oBAC7C,IAAI,IAAI,CAAC,OAAO;wBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;oBAClD,IAAI,IAAI,CAAC,UAAU;wBACjB,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;oBAC1F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;iBACvB;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { ZerobuildClient } from "../client.js";
|
|
3
|
+
export declare function registerConversationTools(server: McpServer, client: ZerobuildClient): void;
|
|
4
|
+
//# sourceMappingURL=conversations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../src/tools/conversations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,eAAe,QAoKxB"}
|