@peachai/mcp 0.1.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.
@@ -0,0 +1,7 @@
1
+ export declare const client: {
2
+ get<T>(path: string): Promise<T>;
3
+ post<T>(path: string, body: unknown): Promise<T>;
4
+ patch<T>(path: string, body: unknown): Promise<T>;
5
+ delete<T>(path: string): Promise<T>;
6
+ };
7
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AA8CA,eAAO,MAAM,MAAM;QACb,CAAC,QAAQ,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;SAG3B,CAAC,QAAQ,MAAM,QAAQ,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;UAG1C,CAAC,QAAQ,MAAM,QAAQ,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;WAG1C,CAAC,QAAQ,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAGpC,CAAC"}
package/dist/client.js ADDED
@@ -0,0 +1,51 @@
1
+ const BASE_URL = "https://app.trypeach.io";
2
+ function getApiKey() {
3
+ const key = process.env.PEACH_API_KEY;
4
+ if (!key) {
5
+ throw new Error("PEACH_API_KEY environment variable is not set");
6
+ }
7
+ return key;
8
+ }
9
+ async function request(method, path, body) {
10
+ const url = `${BASE_URL}${path}`;
11
+ const headers = {
12
+ Authorization: getApiKey(),
13
+ "Content-Type": "application/json",
14
+ Accept: "application/json",
15
+ };
16
+ const response = await fetch(url, {
17
+ method,
18
+ headers,
19
+ body: body !== undefined ? JSON.stringify(body) : undefined,
20
+ });
21
+ if (!response.ok) {
22
+ let errorMessage = `HTTP ${response.status}: ${response.statusText}`;
23
+ try {
24
+ const errorBody = await response.json();
25
+ errorMessage = JSON.stringify(errorBody);
26
+ }
27
+ catch {
28
+ // ignore parse error, use status message
29
+ }
30
+ throw new Error(errorMessage);
31
+ }
32
+ if (response.status === 204) {
33
+ return undefined;
34
+ }
35
+ return response.json();
36
+ }
37
+ export const client = {
38
+ get(path) {
39
+ return request("GET", path);
40
+ },
41
+ post(path, body) {
42
+ return request("POST", path, body);
43
+ },
44
+ patch(path, body) {
45
+ return request("PATCH", path, body);
46
+ },
47
+ delete(path) {
48
+ return request("DELETE", path);
49
+ },
50
+ };
51
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,yBAAyB,CAAC;AAE3C,SAAS,SAAS;IAChB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACtC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,MAAc,EACd,IAAY,EACZ,IAAc;IAEd,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAC;IACjC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,SAAS,EAAE;QAC1B,cAAc,EAAE,kBAAkB;QAClC,MAAM,EAAE,kBAAkB;KAC3B,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,YAAY,GAAG,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACrE,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,SAAc,CAAC;IACxB,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,CAAI,IAAY;QACjB,OAAO,OAAO,CAAI,KAAK,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,CAAI,IAAY,EAAE,IAAa;QACjC,OAAO,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,CAAI,IAAY,EAAE,IAAa;QAClC,OAAO,OAAO,CAAI,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,CAAI,IAAY;QACpB,OAAO,OAAO,CAAI,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { registerEventTools } from "./tools/events.js";
5
+ import { registerTemplateTools } from "./tools/templates.js";
6
+ import { registerContactTools } from "./tools/contacts.js";
7
+ import { registerMessageTools } from "./tools/messages.js";
8
+ import { registerMediaTools } from "./tools/media.js";
9
+ const server = new McpServer({
10
+ name: "peach",
11
+ version: "0.1.0",
12
+ });
13
+ registerEventTools(server);
14
+ registerTemplateTools(server);
15
+ registerContactTools(server);
16
+ registerMessageTools(server);
17
+ registerMediaTools(server);
18
+ const transport = new StdioServerTransport();
19
+ await server.connect(transport);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAE3B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerContactTools(server: McpServer): void;
3
+ //# sourceMappingURL=contacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/tools/contacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8C5D"}
@@ -0,0 +1,37 @@
1
+ import { z } from "zod";
2
+ import { client } from "../client.js";
3
+ const ContactFields = {
4
+ phone_number: z.string().describe("Phone number in E.164 format (e.g. +14155552671)"),
5
+ name: z.string().optional().describe("Contact's full name"),
6
+ email: z.string().email().optional().describe("Contact's email address"),
7
+ timezone: z.string().optional().describe("Contact's timezone (e.g. America/New_York)"),
8
+ metadata: z.record(z.unknown()).optional().describe("Custom metadata key-value pairs (merged with existing)"),
9
+ };
10
+ export function registerContactTools(server) {
11
+ server.tool("peach_create_contact", "Create or upsert a single contact in the Peach account", ContactFields, async (params) => {
12
+ const result = await client.post("/api/v1/contacts", params);
13
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
14
+ });
15
+ server.tool("peach_create_contacts", "Create or upsert multiple contacts in bulk in the Peach account", {
16
+ contacts: z.array(z.object(ContactFields)).describe("Array of contacts to create or upsert"),
17
+ }, async ({ contacts }) => {
18
+ const result = await client.post("/api/v1/contacts", contacts);
19
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
20
+ });
21
+ server.tool("peach_update_contact", "Update an existing contact identified by their phone number", {
22
+ phone_number: z.string().describe("Phone number of the contact to update in E.164 format (e.g. +14155552671)"),
23
+ name: z.string().optional().describe("Updated full name"),
24
+ email: z.string().email().optional().describe("Updated email address"),
25
+ age: z.number().int().optional().describe("Updated age"),
26
+ gender: z.string().optional().describe("Updated gender"),
27
+ language: z.string().optional().describe("Updated language code (e.g. en)"),
28
+ nickname: z.string().optional().describe("Updated nickname"),
29
+ opted_out: z.boolean().optional().describe("Whether the contact has opted out of messaging"),
30
+ timezone: z.string().optional().describe("Updated timezone (e.g. America/New_York)"),
31
+ metadata: z.record(z.unknown()).optional().describe("Custom metadata to deep-merge with existing"),
32
+ }, async ({ phone_number, ...updates }) => {
33
+ const result = await client.patch(`/api/v1/contacts/${encodeURIComponent(phone_number)}`, updates);
34
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
35
+ });
36
+ }
37
+ //# sourceMappingURL=contacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/tools/contacts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,aAAa,GAAG;IACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IACrF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC3D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACxE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACtF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;CAC9G,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,wDAAwD,EACxD,aAAa,EACb,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,iEAAiE,EACjE;QACE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KAC7F,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC/D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,6DAA6D,EAC7D;QACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2EAA2E,CAAC;QAC9G,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACzD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACtE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QACxD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACxD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC3E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC5D,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QAC5F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACpF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KACnG,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B,oBAAoB,kBAAkB,CAAC,YAAY,CAAC,EAAE,EACtD,OAAO,CACR,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerEventTools(server: McpServer): void;
3
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/tools/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkI1D"}
@@ -0,0 +1,106 @@
1
+ import { z } from "zod";
2
+ import { client } from "../client.js";
3
+ const ContactSchema = z.object({
4
+ phone_number: z.string().describe("Phone number in E.164 format (e.g. +14155552671)"),
5
+ name: z.string().optional().describe("Contact's full name"),
6
+ email: z.string().email().optional().describe("Contact's email address"),
7
+ metadata: z.record(z.unknown()).optional().describe("Custom metadata key-value pairs"),
8
+ });
9
+ export function registerEventTools(server) {
10
+ server.tool("peach_send_template_message", "Send a WhatsApp template message to a contact via the Peach API", {
11
+ contact: ContactSchema.describe("The recipient contact. phone_number is required."),
12
+ template_message: z.object({
13
+ whats_app_template_id: z.string().describe("ID of the WhatsApp template to use"),
14
+ liquid_values: z.record(z.unknown()).optional().describe("Variable values for template placeholders"),
15
+ business_phone_number: z.string().optional().describe("WA ID of the sending phone number to use"),
16
+ }).describe("Template message parameters"),
17
+ }, async ({ contact, template_message }) => {
18
+ const result = await client.post("/api/v1/events?sync=true", {
19
+ event_type: "send_template_message",
20
+ contact,
21
+ template_message,
22
+ });
23
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
24
+ });
25
+ server.tool("peach_launch_broadcast", "Create and launch a broadcast campaign to multiple contacts via the Peach API", {
26
+ broadcast: z.object({
27
+ whats_app_template_id: z.string().describe("ID of the WhatsApp template to use"),
28
+ name: z.string().describe("Name of the broadcast campaign"),
29
+ contacts: z.array(z.object({
30
+ phone_number: z.string().describe("Phone number in E.164 format"),
31
+ name: z.string().optional().describe("Contact name"),
32
+ liquid_values: z.record(z.unknown()).optional().describe("Per-contact template variable values"),
33
+ })).optional().describe("Explicit list of contacts to send to"),
34
+ audience_id: z.string().optional().describe("ID of an existing audience/list to send to"),
35
+ phone_number: z.string().optional().describe("WA ID of the sending phone number to use"),
36
+ delivery_mode: z.enum(["instant", "smart"]).optional().describe("Delivery mode: instant (asap) or smart (gradual)"),
37
+ scheduled_launch_time: z.string().optional().describe("ISO 8601 datetime to schedule the send (e.g. 2024-01-15T10:00:00Z)"),
38
+ liquid_values: z.record(z.unknown()).optional().describe("Global template variable values for all contacts"),
39
+ }).describe("Broadcast parameters"),
40
+ }, async ({ broadcast }) => {
41
+ const result = await client.post("/api/v1/events?sync=true", {
42
+ event_type: "send_broadcast",
43
+ broadcast,
44
+ });
45
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
46
+ });
47
+ server.tool("peach_connect_to_ai_agent", "Send a template message to a contact and connect them to an AI agent for automated follow-up", {
48
+ contact: ContactSchema.describe("The recipient contact. phone_number is required."),
49
+ template_message: z.object({
50
+ whats_app_template_id: z.string().describe("ID of the WhatsApp template to send"),
51
+ liquid_values: z.record(z.unknown()).optional().describe("Variable values for template placeholders"),
52
+ business_phone_number: z.string().optional().describe("WA ID of the sending phone number to use"),
53
+ }).describe("Template message parameters"),
54
+ ai_agent: z.object({
55
+ id: z.string().describe("ID of the AI agent to connect the contact to"),
56
+ }).optional().describe("AI agent to connect the contact to after the template message"),
57
+ }, async ({ contact, template_message, ai_agent }) => {
58
+ const result = await client.post("/api/v1/events?sync=true", {
59
+ event_type: "connect_to_ai_agent",
60
+ contact,
61
+ template_message,
62
+ ai_agent,
63
+ });
64
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
65
+ });
66
+ server.tool("peach_send_app_message", "Trigger a flow or app-initiated message to a contact via the Peach API", {
67
+ contact: ContactSchema.describe("The recipient contact. phone_number is required."),
68
+ flow: z.object({
69
+ id: z.string().describe("ID of the flow to execute"),
70
+ liquid_values: z.record(z.unknown()).optional().describe("Variable values for the flow"),
71
+ whats_app_template_id: z.string().optional().describe("Fallback template ID if the reply window is closed"),
72
+ }).describe("Flow parameters"),
73
+ }, async ({ contact, flow }) => {
74
+ const result = await client.post("/api/v1/events?sync=true", {
75
+ event_type: "send_app_message",
76
+ contact,
77
+ flow,
78
+ });
79
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
80
+ });
81
+ server.tool("peach_get_event_status", "Get the status and details of a specific event by its ID", {
82
+ event_id: z.string().describe("The ID of the event to retrieve"),
83
+ }, async ({ event_id }) => {
84
+ const result = await client.get(`/api/v1/events/${event_id}`);
85
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
86
+ });
87
+ server.tool("peach_list_template_messages", "List template messages sent via the Peach API with optional filters", {
88
+ page: z.number().int().positive().optional().describe("Page number for pagination"),
89
+ per_page: z.number().int().positive().optional().describe("Number of results per page"),
90
+ status: z.string().optional().describe("Filter by message status (e.g. delivered, read, failed)"),
91
+ phone_number: z.string().optional().describe("Filter by recipient phone number in E.164 format"),
92
+ template_name: z.string().optional().describe("Filter by template name"),
93
+ from: z.string().optional().describe("ISO 8601 start datetime for filtering (e.g. 2024-01-01T00:00:00Z)"),
94
+ to: z.string().optional().describe("ISO 8601 end datetime for filtering (e.g. 2024-01-31T23:59:59Z)"),
95
+ }, async (params) => {
96
+ const query = new URLSearchParams();
97
+ for (const [key, value] of Object.entries(params)) {
98
+ if (value !== undefined)
99
+ query.set(key, String(value));
100
+ }
101
+ const qs = query.toString();
102
+ const result = await client.get(`/api/v1/template_messages${qs ? `?${qs}` : ""}`);
103
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
104
+ });
105
+ }
106
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/tools/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerMediaTools(server: McpServer): void;
3
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/tools/media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkD1D"}
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ import { client } from "../client.js";
3
+ export function registerMediaTools(server) {
4
+ server.tool("peach_list_media", "List media files uploaded to the Peach account", {
5
+ page: z.number().int().positive().optional().describe("Page number for pagination"),
6
+ }, async (params) => {
7
+ const query = new URLSearchParams();
8
+ if (params.page !== undefined)
9
+ query.set("page", String(params.page));
10
+ const qs = query.toString();
11
+ const result = await client.get(`/api/v1/medias${qs ? `?${qs}` : ""}`);
12
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
13
+ });
14
+ server.tool("peach_upload_media", "Upload a media file to Peach using base64-encoded file content", {
15
+ data: z.string().describe("Base64-encoded file content"),
16
+ filename: z.string().describe("Filename including extension (e.g. photo.jpg)"),
17
+ content_type: z.string().optional().describe("MIME type of the file (e.g. image/jpeg, video/mp4)"),
18
+ }, async ({ data, filename, content_type }) => {
19
+ const result = await client.post("/api/v1/medias", {
20
+ media: { data, filename, content_type },
21
+ });
22
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
23
+ });
24
+ server.tool("peach_delete_media", "Delete a media file from the Peach account by its ID", {
25
+ media_id: z.string().describe("The ID of the media file to delete"),
26
+ }, async ({ media_id }) => {
27
+ const result = await client.delete(`/api/v1/medias/${media_id}`);
28
+ return {
29
+ content: [
30
+ {
31
+ type: "text",
32
+ text: result !== undefined ? JSON.stringify(result, null, 2) : "Media deleted successfully",
33
+ },
34
+ ],
35
+ };
36
+ });
37
+ }
38
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/tools/media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,gDAAgD,EAChD;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;KACpF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,gEAAgE,EAChE;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACxD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QAC9E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;KACnG,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACjD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE;SACxC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,sDAAsD,EACtD;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KACpE,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QACjE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;iBAC5F;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerMessageTools(server: McpServer): void;
3
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/tools/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoC5D"}
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+ import { client } from "../client.js";
3
+ export function registerMessageTools(server) {
4
+ server.tool("peach_list_messages", "List messages in the Peach account with optional filters", {
5
+ page: z.number().int().positive().optional().describe("Page number for pagination"),
6
+ per_page: z.number().int().positive().optional().describe("Number of results per page"),
7
+ phone_number: z
8
+ .string()
9
+ .optional()
10
+ .describe("Filter by contact phone number in E.164 format"),
11
+ direction: z
12
+ .enum(["inbound", "outbound"])
13
+ .optional()
14
+ .describe("Filter by message direction"),
15
+ from: z
16
+ .string()
17
+ .optional()
18
+ .describe("ISO 8601 start datetime for filtering (e.g. 2024-01-01T00:00:00Z)"),
19
+ to: z
20
+ .string()
21
+ .optional()
22
+ .describe("ISO 8601 end datetime for filtering (e.g. 2024-01-31T23:59:59Z)"),
23
+ }, async (params) => {
24
+ const query = new URLSearchParams();
25
+ for (const [key, value] of Object.entries(params)) {
26
+ if (value !== undefined) {
27
+ query.set(key, String(value));
28
+ }
29
+ }
30
+ const qs = query.toString();
31
+ const result = await client.get(`/api/v1/messages${qs ? `?${qs}` : ""}`);
32
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
33
+ });
34
+ }
35
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/tools/messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,0DAA0D,EAC1D;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACnF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACvF,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,gDAAgD,CAAC;QAC7D,SAAS,EAAE,CAAC;aACT,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;aAC7B,QAAQ,EAAE;aACV,QAAQ,CAAC,6BAA6B,CAAC;QAC1C,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,mEAAmE,CAAC;QAChF,EAAE,EAAE,CAAC;aACF,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,iEAAiE,CAAC;KAC/E,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerTemplateTools(server: McpServer): void;
3
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/tools/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAepE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkH7D"}
@@ -0,0 +1,84 @@
1
+ import { z } from "zod";
2
+ import { client } from "../client.js";
3
+ const ComponentAttributeSchema = z.object({
4
+ component_type: z.enum(["header", "body", "footer", "buttons"]).describe("Component type"),
5
+ sub_type: z.string().optional().describe("Button sub-type (e.g. quick_reply, url, phone_number)"),
6
+ data_type: z.string().optional().describe("Data type for the component (e.g. text, image, video, document)"),
7
+ name: z.string().optional().describe("Button label or component name"),
8
+ value: z.string().optional().describe("Text content or button value/URL"),
9
+ index: z.number().int().optional().describe("Position index of the component"),
10
+ id: z.number().int().optional().describe("Component ID (required when updating existing components)"),
11
+ _destroy: z.boolean().optional().describe("Set to true to remove this component during update"),
12
+ });
13
+ export function registerTemplateTools(server) {
14
+ server.tool("peach_list_templates", "List all WhatsApp templates in the Peach account", {
15
+ page: z.number().int().positive().optional().describe("Page number for pagination"),
16
+ }, async (params) => {
17
+ const query = new URLSearchParams();
18
+ if (params.page !== undefined)
19
+ query.set("page", String(params.page));
20
+ const qs = query.toString();
21
+ const result = await client.get(`/api/v1/whats_app_templates${qs ? `?${qs}` : ""}`);
22
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
23
+ });
24
+ server.tool("peach_get_template", "Get a specific WhatsApp template by its ID or template name", {
25
+ id: z.string().describe("The template ID or template_name"),
26
+ }, async ({ id }) => {
27
+ const result = await client.get(`/api/v1/whats_app_templates/${id}`);
28
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
29
+ });
30
+ server.tool("peach_create_template", "Create a new WhatsApp template in the Peach account. Must include at least a body component in components_attributes.", {
31
+ template_name: z.string().describe("Unique name for the template (lowercase, underscores only, e.g. order_confirmation)"),
32
+ language: z.string().describe("Language code for the template (e.g. en, en_US)"),
33
+ category: z.enum(["MARKETING", "UTILITY", "AUTHENTICATION"]).describe("Template category as required by WhatsApp"),
34
+ components_attributes: z.array(ComponentAttributeSchema).describe("Template components. Must include a body component. Each component has component_type, value, and optional sub_type/data_type/name/index."),
35
+ purpose: z.string().optional().describe("Purpose of the template (e.g. general)"),
36
+ whats_app_business_account_id: z.string().optional().describe("External ID of the WhatsApp Business Account to use (defaults to the account's only WABA if there is one)"),
37
+ folder: z.string().optional().describe("Folder to organise the template into"),
38
+ }, async ({ template_name, language, category, components_attributes, purpose, whats_app_business_account_id, folder }) => {
39
+ const result = await client.post("/api/v1/whats_app_templates", {
40
+ whats_app_template: {
41
+ template_name,
42
+ language,
43
+ category,
44
+ components_attributes,
45
+ purpose,
46
+ whats_app_business_account_id,
47
+ folder,
48
+ },
49
+ });
50
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
51
+ });
52
+ server.tool("peach_update_template", "Update an existing WhatsApp template's components or category", {
53
+ id: z.string().describe("The template ID or template_name"),
54
+ components_attributes: z.array(ComponentAttributeSchema).optional().describe("Updated components. Include id on existing components to update them; set _destroy: true to remove one."),
55
+ category: z.enum(["MARKETING", "UTILITY", "AUTHENTICATION"]).optional().describe("Updated template category"),
56
+ }, async ({ id, components_attributes, category }) => {
57
+ const result = await client.patch(`/api/v1/whats_app_templates/${id}`, {
58
+ whats_app_template: {
59
+ components_attributes,
60
+ category,
61
+ },
62
+ });
63
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
64
+ });
65
+ server.tool("peach_archive_template", "Archive a WhatsApp template (must be approved, rejected, or draft status)", {
66
+ id: z.string().describe("The template ID or template_name"),
67
+ }, async ({ id }) => {
68
+ const result = await client.patch(`/api/v1/whats_app_templates/${id}/archive`, {});
69
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
70
+ });
71
+ server.tool("peach_pause_template", "Pause an approved WhatsApp template to temporarily stop it from being used", {
72
+ id: z.string().describe("The template ID or template_name"),
73
+ }, async ({ id }) => {
74
+ const result = await client.patch(`/api/v1/whats_app_templates/${id}/pause`, {});
75
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
76
+ });
77
+ server.tool("peach_submit_template", "Submit a WhatsApp template for review and approval by Meta", {
78
+ id: z.string().describe("The template ID or template_name"),
79
+ }, async ({ id }) => {
80
+ const result = await client.patch(`/api/v1/whats_app_templates/${id}/submit`, {});
81
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
82
+ });
83
+ }
84
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/tools/templates.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@peachai/mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for the Peach WhatsApp messaging platform",
5
+ "type": "module",
6
+ "bin": {
7
+ "peach-mcp": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsx src/index.ts"
12
+ },
13
+ "engines": {
14
+ "node": ">=18"
15
+ },
16
+ "dependencies": {
17
+ "@modelcontextprotocol/sdk": "^1.0.0",
18
+ "zod": "^3.23.8"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^22.0.0",
22
+ "tsx": "^4.19.0",
23
+ "typescript": "^5.6.0"
24
+ }
25
+ }