@line-harness/mcp-server 0.1.1 → 0.2.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.
Files changed (55) hide show
  1. package/dist/index.js +1067 -11
  2. package/package.json +2 -3
  3. package/dist/client.d.ts +0 -2
  4. package/dist/client.js +0 -22
  5. package/dist/client.js.map +0 -1
  6. package/dist/index.d.ts +0 -2
  7. package/dist/index.js.map +0 -1
  8. package/dist/resources/index.d.ts +0 -2
  9. package/dist/resources/index.js +0 -48
  10. package/dist/resources/index.js.map +0 -1
  11. package/dist/tools/account-summary.d.ts +0 -2
  12. package/dist/tools/account-summary.js +0 -47
  13. package/dist/tools/account-summary.js.map +0 -1
  14. package/dist/tools/broadcast.d.ts +0 -2
  15. package/dist/tools/broadcast.js +0 -80
  16. package/dist/tools/broadcast.js.map +0 -1
  17. package/dist/tools/create-form.d.ts +0 -2
  18. package/dist/tools/create-form.js +0 -32
  19. package/dist/tools/create-form.js.map +0 -1
  20. package/dist/tools/create-rich-menu.d.ts +0 -2
  21. package/dist/tools/create-rich-menu.js +0 -36
  22. package/dist/tools/create-rich-menu.js.map +0 -1
  23. package/dist/tools/create-scenario.d.ts +0 -2
  24. package/dist/tools/create-scenario.js +0 -78
  25. package/dist/tools/create-scenario.js.map +0 -1
  26. package/dist/tools/create-tracked-link.d.ts +0 -2
  27. package/dist/tools/create-tracked-link.js +0 -22
  28. package/dist/tools/create-tracked-link.js.map +0 -1
  29. package/dist/tools/enroll-scenario.d.ts +0 -2
  30. package/dist/tools/enroll-scenario.js +0 -23
  31. package/dist/tools/enroll-scenario.js.map +0 -1
  32. package/dist/tools/get-form-submissions.d.ts +0 -2
  33. package/dist/tools/get-form-submissions.js +0 -19
  34. package/dist/tools/get-form-submissions.js.map +0 -1
  35. package/dist/tools/get-friend-detail.d.ts +0 -2
  36. package/dist/tools/get-friend-detail.js +0 -19
  37. package/dist/tools/get-friend-detail.js.map +0 -1
  38. package/dist/tools/get-link-clicks.d.ts +0 -2
  39. package/dist/tools/get-link-clicks.js +0 -19
  40. package/dist/tools/get-link-clicks.js.map +0 -1
  41. package/dist/tools/index.d.ts +0 -2
  42. package/dist/tools/index.js +0 -31
  43. package/dist/tools/index.js.map +0 -1
  44. package/dist/tools/list-crm-objects.d.ts +0 -2
  45. package/dist/tools/list-crm-objects.js +0 -40
  46. package/dist/tools/list-crm-objects.js.map +0 -1
  47. package/dist/tools/list-friends.d.ts +0 -2
  48. package/dist/tools/list-friends.js +0 -30
  49. package/dist/tools/list-friends.js.map +0 -1
  50. package/dist/tools/manage-tags.d.ts +0 -2
  51. package/dist/tools/manage-tags.js +0 -44
  52. package/dist/tools/manage-tags.js.map +0 -1
  53. package/dist/tools/send-message.d.ts +0 -2
  54. package/dist/tools/send-message.js +0 -24
  55. package/dist/tools/send-message.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@line-harness/mcp-server",
3
- "version": "0.1.1",
3
+ "version": "0.2.1",
4
4
  "description": "MCP Server for LINE Harness — operate LINE official accounts from any AI tool",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -8,7 +8,7 @@
8
8
  "line-harness-mcp": "./dist/index.js"
9
9
  },
10
10
  "scripts": {
11
- "build": "tsc && chmod 755 dist/index.js",
11
+ "build": "npx esbuild src/index.ts --bundle --platform=node --format=esm --outfile=dist/index.js --external:@modelcontextprotocol/sdk --external:zod && chmod 755 dist/index.js",
12
12
  "dev": "tsc --watch",
13
13
  "start": "node dist/index.js"
14
14
  },
@@ -28,7 +28,6 @@
28
28
  ],
29
29
  "dependencies": {
30
30
  "@modelcontextprotocol/sdk": "^1.0.0",
31
- "@line-harness/sdk": "^0.1.0",
32
31
  "zod": "^3.23.0"
33
32
  },
34
33
  "devDependencies": {
package/dist/client.d.ts DELETED
@@ -1,2 +0,0 @@
1
- import { LineHarness } from "@line-harness/sdk";
2
- export declare function getClient(): LineHarness;
package/dist/client.js DELETED
@@ -1,22 +0,0 @@
1
- import { LineHarness } from "@line-harness/sdk";
2
- let clientInstance = null;
3
- export function getClient() {
4
- if (clientInstance)
5
- return clientInstance;
6
- const apiUrl = process.env.LINE_HARNESS_API_URL;
7
- const apiKey = process.env.LINE_HARNESS_API_KEY;
8
- const accountId = process.env.LINE_HARNESS_ACCOUNT_ID;
9
- if (!apiUrl) {
10
- throw new Error("LINE_HARNESS_API_URL environment variable is required");
11
- }
12
- if (!apiKey) {
13
- throw new Error("LINE_HARNESS_API_KEY environment variable is required");
14
- }
15
- clientInstance = new LineHarness({
16
- apiUrl,
17
- apiKey,
18
- lineAccountId: accountId,
19
- });
20
- return clientInstance;
21
- }
22
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,IAAI,cAAc,GAAuB,IAAI,CAAC;AAE9C,MAAM,UAAU,SAAS;IACvB,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAEtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,cAAc,GAAG,IAAI,WAAW,CAAC;QAC/B,MAAM;QACN,MAAM;QACN,aAAa,EAAE,SAAS;KACzB,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC"}
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAE7B,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC5D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerAllResources(server: McpServer): void;
@@ -1,48 +0,0 @@
1
- import { getClient } from "../client.js";
2
- export function registerAllResources(server) {
3
- server.resource("Account Summary", "line-harness://account/summary", async (uri) => {
4
- const client = getClient();
5
- const [friendCount, scenarios, tags] = await Promise.all([
6
- client.friends.count(),
7
- client.scenarios.list(),
8
- client.tags.list(),
9
- ]);
10
- const summary = {
11
- friends: friendCount,
12
- activeScenarios: scenarios.filter((s) => s.isActive).length,
13
- totalScenarios: scenarios.length,
14
- tags: tags.map((t) => ({ id: t.id, name: t.name })),
15
- };
16
- return {
17
- contents: [{
18
- uri: "line-harness://account/summary",
19
- mimeType: "application/json",
20
- text: JSON.stringify(summary, null, 2),
21
- }],
22
- };
23
- });
24
- server.resource("Active Scenarios", "line-harness://scenarios/active", async (uri) => {
25
- const client = getClient();
26
- const scenarios = await client.scenarios.list();
27
- const active = scenarios.filter((s) => s.isActive);
28
- return {
29
- contents: [{
30
- uri: "line-harness://scenarios/active",
31
- mimeType: "application/json",
32
- text: JSON.stringify(active, null, 2),
33
- }],
34
- };
35
- });
36
- server.resource("Tags List", "line-harness://tags/list", async (uri) => {
37
- const client = getClient();
38
- const tags = await client.tags.list();
39
- return {
40
- contents: [{
41
- uri: "line-harness://tags/list",
42
- mimeType: "application/json",
43
- text: JSON.stringify(tags, null, 2),
44
- }],
45
- };
46
- });
47
- }
48
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,QAAQ,CACb,iBAAiB,EACjB,gCAAgC,EAChC,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvD,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;YACtB,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;YACvB,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;SACnB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,WAAW;YACpB,eAAe,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM;YAChE,cAAc,EAAE,SAAS,CAAC,MAAM;YAChC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SACzD,CAAC;QAEF,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,gCAAgC;oBACrC,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvC,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,QAAQ,CACb,kBAAkB,EAClB,iCAAiC,EACjC,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACxD,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,iCAAiC;oBACtC,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,QAAQ,CACb,WAAW,EACX,0BAA0B,EAC1B,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,0BAA0B;oBAC/B,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerAccountSummary(server: McpServer): void;
@@ -1,47 +0,0 @@
1
- import { z } from "zod";
2
- import { getClient } from "../client.js";
3
- export function registerAccountSummary(server) {
4
- server.tool("account_summary", "Get a high-level summary of the LINE account: friend count, active scenarios, recent broadcasts, tags, and forms. Use this to understand the current state before making changes.", {
5
- accountId: z.string().optional().describe("LINE account ID (uses default if omitted)"),
6
- }, async ({ accountId }) => {
7
- try {
8
- const client = getClient();
9
- const [friendCount, scenarios, broadcasts, tags, forms] = await Promise.all([
10
- client.friends.count({ accountId }),
11
- client.scenarios.list({ accountId }),
12
- client.broadcasts.list({ accountId }),
13
- client.tags.list(),
14
- client.forms.list(),
15
- ]);
16
- const activeScenarios = scenarios.filter((s) => s.isActive);
17
- const recentBroadcasts = broadcasts.slice(0, 5);
18
- const summary = {
19
- friends: { total: friendCount },
20
- scenarios: {
21
- total: scenarios.length,
22
- active: activeScenarios.length,
23
- activeList: activeScenarios.map((s) => ({ id: s.id, name: s.name, triggerType: s.triggerType })),
24
- },
25
- broadcasts: {
26
- total: broadcasts.length,
27
- recent: recentBroadcasts.map((b) => ({ id: b.id, title: b.title, status: b.status, sentAt: b.sentAt })),
28
- },
29
- tags: {
30
- total: tags.length,
31
- list: tags.map((t) => ({ id: t.id, name: t.name })),
32
- },
33
- forms: {
34
- total: forms.length,
35
- list: forms.map((f) => ({ id: f.id, name: f.name })),
36
- },
37
- };
38
- return {
39
- content: [{ type: "text", text: JSON.stringify(summary, null, 2) }],
40
- };
41
- }
42
- catch (error) {
43
- return { content: [{ type: "text", text: JSON.stringify({ success: false, error: String(error) }, null, 2) }], isError: true };
44
- }
45
- });
46
- }
47
- //# sourceMappingURL=account-summary.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"account-summary.js","sourceRoot":"","sources":["../../src/tools/account-summary.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerBroadcast(server: McpServer): void;
@@ -1,80 +0,0 @@
1
- import { z } from "zod";
2
- import { getClient } from "../client.js";
3
- export function registerBroadcast(server) {
4
- server.tool("broadcast", "Send a broadcast message to all friends, a specific tag group, or a filtered segment. Creates and immediately sends the broadcast.", {
5
- title: z.string().describe("Internal title for this broadcast (not shown to users)"),
6
- messageType: z.enum(["text", "flex"]).describe("Message type"),
7
- messageContent: z.string().describe("Message content. For text: plain string. For flex: JSON string."),
8
- targetType: z.enum(["all", "tag", "segment"]).default("all").describe("Target audience: 'all' for everyone, 'tag' for a tag group, 'segment' for filtered conditions"),
9
- targetTagId: z.string().optional().describe("Tag ID when targetType is 'tag'"),
10
- segmentConditions: z.string().optional().describe("JSON string of segment conditions when targetType is 'segment'. Format: { operator: 'AND'|'OR', rules: [{ type: 'tag_exists'|'tag_not_exists'|'metadata_equals'|'metadata_not_equals'|'ref_code'|'is_following', value: string|boolean|{key,value} }] }"),
11
- scheduledAt: z.string().optional().describe("ISO 8601 datetime to schedule. Omit to send immediately."),
12
- accountId: z.string().optional().describe("LINE account ID (uses default if omitted)"),
13
- }, async ({ title, messageType, messageContent, targetType, targetTagId, segmentConditions, scheduledAt, accountId }) => {
14
- try {
15
- const client = getClient();
16
- // Validate segment broadcasts require segmentConditions
17
- if (targetType === "segment" && !segmentConditions) {
18
- return {
19
- content: [{ type: "text", text: JSON.stringify({ success: false, error: "segmentConditions is required when targetType is 'segment'" }, null, 2) }],
20
- isError: true,
21
- };
22
- }
23
- // Block scheduled segment broadcasts — the worker scheduler cannot apply segment filters after persistence
24
- if (targetType === "segment" && scheduledAt) {
25
- return {
26
- content: [{ type: "text", text: JSON.stringify({ success: false, error: "Scheduled segment broadcasts are not supported. Use scheduledAt only with targetType 'all' or 'tag'." }, null, 2) }],
27
- isError: true,
28
- };
29
- }
30
- // Segment broadcasts: validate JSON first, then create and sendToSegment
31
- if (targetType === "segment" && segmentConditions) {
32
- let parsedConditions;
33
- try {
34
- parsedConditions = JSON.parse(segmentConditions);
35
- }
36
- catch {
37
- return {
38
- content: [{ type: "text", text: JSON.stringify({ success: false, error: "segmentConditions must be valid JSON" }, null, 2) }],
39
- isError: true,
40
- };
41
- }
42
- // Segment broadcasts are stored with targetType "all" because the DB schema
43
- // does not have a segment type. Prefix the title so the audit trail clearly
44
- // identifies them as segment sends, not all-audience blasts.
45
- const broadcast = await client.broadcasts.create({
46
- title: `[SEGMENT] ${title}`,
47
- messageType,
48
- messageContent,
49
- targetType: "all",
50
- lineAccountId: accountId,
51
- });
52
- try {
53
- const result = await client.broadcasts.sendToSegment(broadcast.id, parsedConditions);
54
- return { content: [{ type: "text", text: JSON.stringify({ success: true, broadcast: result }, null, 2) }] };
55
- }
56
- catch (sendError) {
57
- // Clean up the draft broadcast so it cannot be accidentally sent later
58
- await client.broadcasts.delete(broadcast.id).catch(() => { });
59
- throw sendError;
60
- }
61
- }
62
- // Tag and all-audience broadcasts
63
- const broadcast = await client.broadcasts.create({
64
- title,
65
- messageType,
66
- messageContent,
67
- targetType: targetType,
68
- targetTagId,
69
- scheduledAt,
70
- lineAccountId: accountId,
71
- });
72
- const result = scheduledAt ? broadcast : await client.broadcasts.send(broadcast.id);
73
- return { content: [{ type: "text", text: JSON.stringify({ success: true, broadcast: result }, null, 2) }] };
74
- }
75
- catch (error) {
76
- return { content: [{ type: "text", text: JSON.stringify({ success: false, error: String(error) }, null, 2) }], isError: true };
77
- }
78
- });
79
- }
80
- //# sourceMappingURL=broadcast.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../src/tools/broadcast.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerCreateForm(server: McpServer): void;
@@ -1,32 +0,0 @@
1
- import { z } from "zod";
2
- import { getClient } from "../client.js";
3
- export function registerCreateForm(server) {
4
- server.tool("create_form", "Create a form for collecting user responses. Can auto-tag responders and enroll them in scenarios.", {
5
- name: z.string().describe("Form name"),
6
- description: z.string().optional().describe("Form description shown to users"),
7
- fields: z.string().describe("JSON string of form fields. Format: [{ name: string, label: string, type: 'text'|'email'|'tel'|'number'|'textarea'|'select'|'radio'|'checkbox'|'date', required?: boolean, options?: string[], placeholder?: string }]"),
8
- onSubmitTagId: z.string().optional().describe("Tag ID to auto-apply when form is submitted"),
9
- onSubmitScenarioId: z.string().optional().describe("Scenario ID to auto-enroll when form is submitted"),
10
- saveToMetadata: z.boolean().default(true).describe("Save form responses to friend metadata"),
11
- accountId: z.string().optional().describe("LINE account ID (uses default if omitted)"),
12
- }, async ({ name, description, fields, onSubmitTagId, onSubmitScenarioId, saveToMetadata, accountId }) => {
13
- try {
14
- const client = getClient();
15
- const form = await client.forms.create({
16
- name,
17
- description,
18
- fields: JSON.parse(fields),
19
- onSubmitTagId,
20
- onSubmitScenarioId,
21
- saveToMetadata,
22
- });
23
- return {
24
- content: [{ type: "text", text: JSON.stringify({ success: true, form }, null, 2) }],
25
- };
26
- }
27
- catch (error) {
28
- return { content: [{ type: "text", text: JSON.stringify({ success: false, error: String(error) }, null, 2) }], isError: true };
29
- }
30
- });
31
- }
32
- //# sourceMappingURL=create-form.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-form.js","sourceRoot":"","sources":["../../src/tools/create-form.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,oGAAoG,EACpG;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC9E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wNAAwN,CAAC;QACrP,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAC5F,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QACvG,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QAC5F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;KACvF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,EAAE;QACpG,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;gBACrC,IAAI;gBACJ,WAAW;gBACX,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC1B,aAAa;gBACb,kBAAkB;gBAClB,cAAc;aACf,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACpF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjI,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerCreateRichMenu(server: McpServer): void;
@@ -1,36 +0,0 @@
1
- import { z } from "zod";
2
- import { getClient } from "../client.js";
3
- export function registerCreateRichMenu(server) {
4
- server.tool("create_rich_menu", "Create a LINE rich menu (the persistent menu at the bottom of the chat). Image must be uploaded separately via LINE Developers Console. This creates the menu structure and button areas.", {
5
- name: z.string().describe("Rich menu name"),
6
- chatBarText: z.string().default("メニュー").describe("Text shown on the chat bar button"),
7
- size: z.object({
8
- width: z.number().default(2500).describe("Menu width in pixels (2500 for full-width)"),
9
- height: z.number().default(1686).describe("Menu height: 1686 for full, 843 for half"),
10
- }).default({ width: 2500, height: 1686 }).describe("Menu size in pixels"),
11
- selected: z.boolean().default(false).describe("Whether the rich menu is displayed by default"),
12
- areas: z.string().describe("JSON string of menu button areas. Format: [{ bounds: { x, y, width, height }, action: { type: 'uri'|'message'|'postback', uri?, text?, data? } }]"),
13
- setAsDefault: z.boolean().default(false).describe("Set this as the default rich menu for all friends"),
14
- }, async ({ name, chatBarText, size, selected, areas, setAsDefault }) => {
15
- try {
16
- const client = getClient();
17
- const menu = await client.richMenus.create({
18
- name,
19
- chatBarText,
20
- size,
21
- selected,
22
- areas: JSON.parse(areas),
23
- });
24
- if (setAsDefault) {
25
- await client.richMenus.setDefault(menu.richMenuId);
26
- }
27
- return {
28
- content: [{ type: "text", text: JSON.stringify({ success: true, richMenuId: menu.richMenuId, isDefault: setAsDefault }, null, 2) }],
29
- };
30
- }
31
- catch (error) {
32
- return { content: [{ type: "text", text: JSON.stringify({ success: false, error: String(error) }, null, 2) }], isError: true };
33
- }
34
- });
35
- }
36
- //# sourceMappingURL=create-rich-menu.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-rich-menu.js","sourceRoot":"","sources":["../../src/tools/create-rich-menu.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,2LAA2L,EAC3L;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACrF,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACb,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YACtF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC;SACtF,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACzE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QAC9F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mJAAmJ,CAAC;QAC/K,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KACvG,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE;QACnE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;gBACzC,IAAI;gBACJ,WAAW;gBACX,IAAI;gBACJ,QAAQ;gBACR,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;aACzB,CAAC,CAAC;YACH,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACrD,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACpI,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjI,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerCreateScenario(server: McpServer): void;
@@ -1,78 +0,0 @@
1
- import { z } from "zod";
2
- import { getClient } from "../client.js";
3
- import { parseDelay } from "@line-harness/sdk";
4
- export function registerCreateScenario(server) {
5
- server.tool("create_scenario", "Create a step delivery scenario with multiple message steps. Each step has a delay and message content. Scenarios auto-trigger on friend_add, tag_added, or manual enrollment.", {
6
- name: z.string().describe("Scenario name"),
7
- triggerType: z.enum(["friend_add", "tag_added", "manual"]).describe("When to start: 'friend_add' on new friends, 'tag_added' when a tag is applied, 'manual' for explicit enrollment"),
8
- triggerTagId: z.string().optional().describe("Required when triggerType is 'tag_added': the tag ID that triggers this scenario"),
9
- steps: z.array(z.object({
10
- delay: z.string().describe("Delay before sending. Format: '0m' for immediate, '30m' for 30 minutes, '24h' for 24 hours"),
11
- type: z.enum(["text", "flex"]).describe("Message type"),
12
- content: z.string().describe("Message content"),
13
- })).describe("Ordered list of message steps"),
14
- accountId: z.string().optional().describe("LINE account ID (uses default if omitted)"),
15
- }, async ({ name, triggerType, triggerTagId, steps, accountId }) => {
16
- try {
17
- // Enforce triggerTagId when triggerType is tag_added
18
- if (triggerType === "tag_added" && !triggerTagId) {
19
- return {
20
- content: [{ type: "text", text: JSON.stringify({ success: false, error: "triggerTagId is required when triggerType is 'tag_added'" }, null, 2) }],
21
- isError: true,
22
- };
23
- }
24
- // Pre-validate all step delays before creating any resources
25
- const parsedSteps = [];
26
- for (let i = 0; i < steps.length; i++) {
27
- const step = steps[i];
28
- let delayMinutes;
29
- try {
30
- delayMinutes = parseDelay(step.delay);
31
- }
32
- catch {
33
- return {
34
- content: [{ type: "text", text: JSON.stringify({ success: false, error: `Invalid delay format at step ${i + 1}: "${step.delay}". Use formats like '0m', '30m', '24h'.` }, null, 2) }],
35
- isError: true,
36
- };
37
- }
38
- parsedSteps.push({ delayMinutes, type: step.type, content: step.content });
39
- }
40
- const client = getClient();
41
- // Create the scenario
42
- const scenario = await client.scenarios.create({
43
- name,
44
- triggerType,
45
- triggerTagId,
46
- lineAccountId: accountId,
47
- });
48
- // Add all steps — if any fail, clean up the scenario to avoid partial automation
49
- try {
50
- for (let i = 0; i < parsedSteps.length; i++) {
51
- const step = parsedSteps[i];
52
- await client.scenarios.addStep(scenario.id, {
53
- stepOrder: i + 1,
54
- delayMinutes: step.delayMinutes,
55
- messageType: step.type,
56
- messageContent: step.content,
57
- });
58
- }
59
- }
60
- catch (stepError) {
61
- // Delete the partially-created scenario to prevent incomplete automations from running
62
- await client.scenarios.delete(scenario.id).catch(() => { });
63
- throw stepError;
64
- }
65
- const scenarioWithSteps = await client.scenarios.get(scenario.id);
66
- return {
67
- content: [{
68
- type: "text",
69
- text: JSON.stringify({ success: true, scenario: scenarioWithSteps }, null, 2),
70
- }],
71
- };
72
- }
73
- catch (error) {
74
- return { content: [{ type: "text", text: JSON.stringify({ success: false, error: String(error) }, null, 2) }], isError: true };
75
- }
76
- });
77
- }
78
- //# sourceMappingURL=create-scenario.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-scenario.js","sourceRoot":"","sources":["../../src/tools/create-scenario.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerCreateTrackedLink(server: McpServer): void;
@@ -1,22 +0,0 @@
1
- import { z } from "zod";
2
- import { getClient } from "../client.js";
3
- export function registerCreateTrackedLink(server) {
4
- server.tool("create_tracked_link", "Create a click-tracking link. When clicked, can auto-tag the user and enroll them in a scenario.", {
5
- name: z.string().describe("Link name (internal label)"),
6
- originalUrl: z.string().describe("The destination URL to redirect to"),
7
- tagId: z.string().optional().describe("Tag ID to auto-apply on click"),
8
- scenarioId: z.string().optional().describe("Scenario ID to auto-enroll on click"),
9
- }, async ({ name, originalUrl, tagId, scenarioId }) => {
10
- try {
11
- const client = getClient();
12
- const link = await client.trackedLinks.create({ name, originalUrl, tagId, scenarioId });
13
- return {
14
- content: [{ type: "text", text: JSON.stringify({ success: true, link }, null, 2) }],
15
- };
16
- }
17
- catch (error) {
18
- return { content: [{ type: "text", text: JSON.stringify({ success: false, error: String(error) }, null, 2) }], isError: true };
19
- }
20
- });
21
- }
22
- //# sourceMappingURL=create-tracked-link.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-tracked-link.js","sourceRoot":"","sources":["../../src/tools/create-tracked-link.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,kGAAkG,EAClG;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACtE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QACtE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KAClF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YACxF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACpF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjI,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerEnrollScenario(server: McpServer): void;
@@ -1,23 +0,0 @@
1
- import { z } from "zod";
2
- import { getClient } from "../client.js";
3
- export function registerEnrollScenario(server) {
4
- server.tool("enroll_in_scenario", "Enroll a friend into a scenario. The friend will start receiving the scenario's step messages from step 1.", {
5
- scenarioId: z.string().describe("The scenario ID to enroll the friend in"),
6
- friendId: z.string().describe("The friend's ID to enroll"),
7
- }, async ({ scenarioId, friendId }) => {
8
- try {
9
- const client = getClient();
10
- const enrollment = await client.scenarios.enroll(scenarioId, friendId);
11
- return {
12
- content: [{
13
- type: "text",
14
- text: JSON.stringify({ success: true, enrollment }, null, 2),
15
- }],
16
- };
17
- }
18
- catch (error) {
19
- return { content: [{ type: "text", text: JSON.stringify({ success: false, error: String(error) }, null, 2) }], isError: true };
20
- }
21
- });
22
- }
23
- //# sourceMappingURL=enroll-scenario.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enroll-scenario.js","sourceRoot":"","sources":["../../src/tools/enroll-scenario.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,4GAA4G,EAC5G;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QAC1E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KAC3D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACvE,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC7D,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjI,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerGetFormSubmissions(server: McpServer): void;
@@ -1,19 +0,0 @@
1
- import { z } from "zod";
2
- import { getClient } from "../client.js";
3
- export function registerGetFormSubmissions(server) {
4
- server.tool("get_form_submissions", "Get all submissions for a specific form. Returns response data with timestamps and friend IDs.", {
5
- formId: z.string().describe("The form ID to get submissions for"),
6
- }, async ({ formId }) => {
7
- try {
8
- const client = getClient();
9
- const submissions = await client.forms.getSubmissions(formId);
10
- return {
11
- content: [{ type: "text", text: JSON.stringify({ success: true, submissions }, null, 2) }],
12
- };
13
- }
14
- catch (error) {
15
- return { content: [{ type: "text", text: JSON.stringify({ success: false, error: String(error) }, null, 2) }], isError: true };
16
- }
17
- });
18
- }
19
- //# sourceMappingURL=get-form-submissions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-form-submissions.js","sourceRoot":"","sources":["../../src/tools/get-form-submissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,gGAAgG,EAChG;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KAClE,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC9D,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC3F,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjI,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerGetFriendDetail(server: McpServer): void;
@@ -1,19 +0,0 @@
1
- import { z } from "zod";
2
- import { getClient } from "../client.js";
3
- export function registerGetFriendDetail(server) {
4
- server.tool("get_friend_detail", "Get detailed information about a specific friend including tags, metadata, and profile.", {
5
- friendId: z.string().describe("The friend's ID"),
6
- }, async ({ friendId }) => {
7
- try {
8
- const client = getClient();
9
- const friend = await client.friends.get(friendId);
10
- return {
11
- content: [{ type: "text", text: JSON.stringify({ success: true, friend }, null, 2) }],
12
- };
13
- }
14
- catch (error) {
15
- return { content: [{ type: "text", text: JSON.stringify({ success: false, error: String(error) }, null, 2) }], isError: true };
16
- }
17
- });
18
- }
19
- //# sourceMappingURL=get-friend-detail.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-friend-detail.js","sourceRoot":"","sources":["../../src/tools/get-friend-detail.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,yFAAyF,EACzF;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;KACjD,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACtF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjI,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerGetLinkClicks(server: McpServer): void;
@@ -1,19 +0,0 @@
1
- import { z } from "zod";
2
- import { getClient } from "../client.js";
3
- export function registerGetLinkClicks(server) {
4
- server.tool("get_link_clicks", "Get click analytics for a tracked link including total clicks and per-friend click history.", {
5
- linkId: z.string().describe("The tracked link ID"),
6
- }, async ({ linkId }) => {
7
- try {
8
- const client = getClient();
9
- const link = await client.trackedLinks.get(linkId);
10
- return {
11
- content: [{ type: "text", text: JSON.stringify({ success: true, link }, null, 2) }],
12
- };
13
- }
14
- catch (error) {
15
- return { content: [{ type: "text", text: JSON.stringify({ success: false, error: String(error) }, null, 2) }], isError: true };
16
- }
17
- });
18
- }
19
- //# sourceMappingURL=get-link-clicks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-link-clicks.js","sourceRoot":"","sources":["../../src/tools/get-link-clicks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,6FAA6F,EAC7F;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KACnD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACnD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACpF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjI,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}