@linkforty/mcp-server 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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -0
  3. package/dist/client.d.ts +20 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +76 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/config.d.ts +9 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +14 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +95 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/tools/analytics.d.ts +7 -0
  16. package/dist/tools/analytics.d.ts.map +1 -0
  17. package/dist/tools/analytics.js +78 -0
  18. package/dist/tools/analytics.js.map +1 -0
  19. package/dist/tools/index.d.ts +7 -0
  20. package/dist/tools/index.d.ts.map +1 -0
  21. package/dist/tools/index.js +18 -0
  22. package/dist/tools/index.js.map +1 -0
  23. package/dist/tools/links.d.ts +8 -0
  24. package/dist/tools/links.d.ts.map +1 -0
  25. package/dist/tools/links.js +131 -0
  26. package/dist/tools/links.js.map +1 -0
  27. package/dist/tools/projects.d.ts +4 -0
  28. package/dist/tools/projects.d.ts.map +1 -0
  29. package/dist/tools/projects.js +26 -0
  30. package/dist/tools/projects.js.map +1 -0
  31. package/dist/tools/sdk.d.ts +3 -0
  32. package/dist/tools/sdk.d.ts.map +1 -0
  33. package/dist/tools/sdk.js +190 -0
  34. package/dist/tools/sdk.js.map +1 -0
  35. package/dist/tools/shared.d.ts +26 -0
  36. package/dist/tools/shared.d.ts.map +1 -0
  37. package/dist/tools/shared.js +25 -0
  38. package/dist/tools/shared.js.map +1 -0
  39. package/dist/tools/templates.d.ts +5 -0
  40. package/dist/tools/templates.d.ts.map +1 -0
  41. package/dist/tools/templates.js +65 -0
  42. package/dist/tools/templates.js.map +1 -0
  43. package/dist/tools/workspaces.d.ts +5 -0
  44. package/dist/tools/workspaces.d.ts.map +1 -0
  45. package/dist/tools/workspaces.js +44 -0
  46. package/dist/tools/workspaces.js.map +1 -0
  47. package/dist/tools/zod-to-json-schema.d.ts +26 -0
  48. package/dist/tools/zod-to-json-schema.d.ts.map +1 -0
  49. package/dist/tools/zod-to-json-schema.js +101 -0
  50. package/dist/tools/zod-to-json-schema.js.map +1 -0
  51. package/package.json +51 -0
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Link management tools.
3
+ */
4
+ import { z } from 'zod';
5
+ import { defineTool } from './shared.js';
6
+ const utmSchema = z
7
+ .object({
8
+ source: z.string().optional(),
9
+ medium: z.string().optional(),
10
+ campaign: z.string().optional(),
11
+ term: z.string().optional(),
12
+ content: z.string().optional(),
13
+ })
14
+ .optional();
15
+ const targetingSchema = z
16
+ .object({
17
+ countries: z.array(z.string()).optional(),
18
+ devices: z.array(z.enum(['ios', 'android', 'web'])).optional(),
19
+ languages: z.array(z.string()).optional(),
20
+ })
21
+ .optional();
22
+ const linkInputSchema = z.object({
23
+ title: z.string().optional(),
24
+ description: z.string().optional(),
25
+ iosUrl: z.string().url().optional(),
26
+ androidUrl: z.string().url().optional(),
27
+ webFallbackUrl: z.string().url().optional(),
28
+ customSchemeUrl: z.string().optional(),
29
+ customCode: z.string().optional(),
30
+ projectId: z.string().uuid().optional(),
31
+ templateId: z.string().uuid().optional(),
32
+ templateSlug: z.string().optional(),
33
+ utmParameters: utmSchema,
34
+ targetingRules: targetingSchema,
35
+ deepLinkParameters: z.record(z.any()).optional(),
36
+ attributionWindowHours: z.number().int().min(1).max(2160).optional(),
37
+ expiresAt: z.string().datetime().optional(),
38
+ });
39
+ export const createLinkTool = defineTool({
40
+ name: 'create_link',
41
+ description: 'Create a new deep link in LinkForty. Supports device-specific URLs (iOS App Store, Google Play, web fallback), UTM parameters, targeting rules, custom short codes, deep link parameters, attribution window, and expiration. Returns the created link with its short URL.',
42
+ schema: linkInputSchema,
43
+ handler: async (args, client) => {
44
+ return client.post('/links', args);
45
+ },
46
+ });
47
+ export const listLinksTool = defineTool({
48
+ name: 'list_links',
49
+ description: 'List deep links in the current workspace. Supports filtering by status (active/inactive), source (dashboard/sdk/bulk/migration), project, search query (title/description/short code), and date range. Returns a paginated list with click counts.',
50
+ schema: z.object({
51
+ page: z.number().int().min(1).optional(),
52
+ limit: z.number().int().min(1).max(100).optional(),
53
+ search: z.string().optional(),
54
+ status: z.enum(['active', 'inactive']).optional(),
55
+ source: z.enum(['dashboard', 'sdk', 'bulk', 'migration']).optional(),
56
+ projectId: z.string().uuid().optional(),
57
+ createdAfter: z.string().datetime().optional(),
58
+ createdBefore: z.string().datetime().optional(),
59
+ }),
60
+ handler: async (args, client) => {
61
+ return client.get('/links', args);
62
+ },
63
+ });
64
+ export const getLinkTool = defineTool({
65
+ name: 'get_link',
66
+ description: 'Get a single deep link by ID or short code. Use this to inspect a specific link\'s configuration, destinations, UTM parameters, and stats.',
67
+ schema: z.object({
68
+ id: z.string().uuid().optional().describe('Link UUID. Use this OR shortCode.'),
69
+ shortCode: z.string().optional().describe('Link short code (e.g. "abc123"). Use this OR id.'),
70
+ }),
71
+ handler: async (args, client) => {
72
+ if (args.id)
73
+ return client.get(`/links/${args.id}`);
74
+ if (args.shortCode)
75
+ return client.get(`/links/discover/${args.shortCode}`);
76
+ throw new Error('Either id or shortCode must be provided');
77
+ },
78
+ });
79
+ export const updateLinkTool = defineTool({
80
+ name: 'update_link',
81
+ description: 'Update an existing deep link. All fields are optional — only provided fields are updated. Use this to change destinations, UTM parameters, targeting rules, status (active/inactive), or expiration.',
82
+ schema: z.object({
83
+ id: z.string().uuid().describe('Link UUID to update'),
84
+ title: z.string().optional(),
85
+ description: z.string().optional(),
86
+ iosUrl: z.string().url().optional(),
87
+ androidUrl: z.string().url().optional(),
88
+ webFallbackUrl: z.string().url().optional(),
89
+ customSchemeUrl: z.string().optional(),
90
+ projectId: z.string().uuid().optional(),
91
+ utmParameters: utmSchema,
92
+ targetingRules: targetingSchema,
93
+ deepLinkParameters: z.record(z.any()).optional(),
94
+ attributionWindowHours: z.number().int().min(1).max(2160).optional(),
95
+ expiresAt: z.string().datetime().optional(),
96
+ isActive: z.boolean().optional(),
97
+ }),
98
+ handler: async (args, client) => {
99
+ const { id, ...body } = args;
100
+ return client.put(`/links/${id}`, body);
101
+ },
102
+ });
103
+ export const deleteLinkTool = defineTool({
104
+ name: 'delete_link',
105
+ description: 'Permanently delete a deep link by ID. This action cannot be undone — historical click events for the link are also removed.',
106
+ schema: z.object({
107
+ id: z.string().uuid().describe('Link UUID to delete'),
108
+ }),
109
+ handler: async (args, client) => {
110
+ return client.delete(`/links/${args.id}`);
111
+ },
112
+ });
113
+ export const bulkCreateLinksTool = defineTool({
114
+ name: 'bulk_create_links',
115
+ description: 'Create up to 100 deep links in a single request. Each link in the array uses the same shape as create_link. Returns the count and the array of created links. Useful for importing campaigns or generating links in bulk.',
116
+ schema: z.object({
117
+ links: z.array(linkInputSchema).min(1).max(100),
118
+ }),
119
+ handler: async (args, client) => {
120
+ return client.post('/links/bulk-create', args);
121
+ },
122
+ });
123
+ export const linkTools = [
124
+ createLinkTool,
125
+ listLinksTool,
126
+ getLinkTool,
127
+ updateLinkTool,
128
+ deleteLinkTool,
129
+ bulkCreateLinksTool,
130
+ ];
131
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/tools/links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const listProjectsTool: import("./shared.js").ToolDefinition;
2
+ export declare const createProjectTool: import("./shared.js").ToolDefinition;
3
+ export declare const projectTools: import("./shared.js").ToolDefinition[];
4
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB,sCAQ3B,CAAC;AAEH,eAAO,MAAM,iBAAiB,sCAW5B,CAAC;AAEH,eAAO,MAAM,YAAY,wCAAwC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Project tools — for grouping links.
3
+ */
4
+ import { z } from 'zod';
5
+ import { defineTool } from './shared.js';
6
+ export const listProjectsTool = defineTool({
7
+ name: 'list_projects',
8
+ description: 'List all projects in the current workspace. Projects are containers for organizing related deep links — for example, by campaign, product, or feature.',
9
+ schema: z.object({}),
10
+ handler: async (_args, client) => {
11
+ return client.get('/projects');
12
+ },
13
+ });
14
+ export const createProjectTool = defineTool({
15
+ name: 'create_project',
16
+ description: 'Create a new project to group related links. Returns the created project. Use the project ID when creating links to associate them with this project.',
17
+ schema: z.object({
18
+ name: z.string().min(1).max(255),
19
+ description: z.string().optional(),
20
+ }),
21
+ handler: async (args, client) => {
22
+ return client.post('/projects', args);
23
+ },
24
+ });
25
+ export const projectTools = [listProjectsTool, createProjectTool];
26
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;IACzC,IAAI,EAAE,eAAe;IACrB,WAAW,EACT,wJAAwJ;IAC1J,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC/B,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;IAC1C,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,uJAAuJ;IACzJ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACnC,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const getSdkInstallSnippetTool: import("./shared.js").ToolDefinition;
2
+ export declare const sdkTools: import("./shared.js").ToolDefinition[];
3
+ //# sourceMappingURL=sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/tools/sdk.ts"],"names":[],"mappings":"AAmLA,eAAO,MAAM,wBAAwB,sCAiCnC,CAAC;AAEH,eAAO,MAAM,QAAQ,wCAA6B,CAAC"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * SDK helper tool — generates ready-to-paste init code for any platform
3
+ * using the user's API key and current workspace context.
4
+ */
5
+ import { z } from 'zod';
6
+ import { defineTool } from './shared.js';
7
+ function reactNativeSnippet(ctx) {
8
+ return `// 1. Install the SDK
9
+ // npm install @linkforty/mobile-sdk-react-native
10
+ //
11
+ // 2. Initialize once at app startup (e.g. in App.tsx)
12
+ import LinkForty from '@linkforty/mobile-sdk-react-native';
13
+
14
+ LinkForty.init({
15
+ apiKey: '${ctx.apiKey}',
16
+ baseUrl: '${ctx.baseUrl}',
17
+ });
18
+
19
+ // 3. Listen for deep links
20
+ LinkForty.onDeepLink((data) => {
21
+ console.log('Deep link data:', data);
22
+ // Navigate based on data.deepLinkParameters
23
+ });
24
+
25
+ // 4. (Optional) Listen for deferred deep links — fires once on first launch
26
+ LinkForty.onDeferredDeepLink((data) => {
27
+ if (data) console.log('Install attributed to:', data);
28
+ });`;
29
+ }
30
+ function expoSnippet(ctx) {
31
+ return `// 1. Install the SDK
32
+ // npx expo install @linkforty/mobile-sdk-expo
33
+ //
34
+ // 2. Initialize once at app startup (e.g. in app/_layout.tsx)
35
+ import LinkForty from '@linkforty/mobile-sdk-expo';
36
+ import { useEffect } from 'react';
37
+
38
+ export default function RootLayout() {
39
+ useEffect(() => {
40
+ LinkForty.init({
41
+ apiKey: '${ctx.apiKey}',
42
+ baseUrl: '${ctx.baseUrl}',
43
+ });
44
+
45
+ LinkForty.onDeepLink((data) => {
46
+ console.log('Deep link data:', data);
47
+ });
48
+
49
+ LinkForty.onDeferredDeepLink((data) => {
50
+ if (data) console.log('Install attributed to:', data);
51
+ });
52
+ }, []);
53
+
54
+ return /* your app */;
55
+ }`;
56
+ }
57
+ function iosSnippet(ctx) {
58
+ return `// 1. Add the LinkForty SDK via Swift Package Manager:
59
+ // https://github.com/linkforty/mobile-sdk-ios
60
+ //
61
+ // 2. In your AppDelegate or App struct:
62
+ import LinkForty
63
+
64
+ @main
65
+ struct YourApp: App {
66
+ init() {
67
+ LinkForty.shared.initialize(
68
+ apiKey: "${ctx.apiKey}",
69
+ baseURL: "${ctx.baseUrl}"
70
+ )
71
+
72
+ LinkForty.shared.onDeepLink { data in
73
+ print("Deep link: \\(data)")
74
+ }
75
+
76
+ LinkForty.shared.onDeferredDeepLink { data in
77
+ if let data = data {
78
+ print("Install attributed to: \\(data)")
79
+ }
80
+ }
81
+ }
82
+
83
+ var body: some Scene {
84
+ WindowGroup { ContentView() }
85
+ }
86
+ }
87
+
88
+ // Bundle ID: ${ctx.appConfig.iosBundleId ?? '(not configured)'}
89
+ // Universal Link domain: ${ctx.appConfig.iosUniversalLinkDomain ?? '(not configured)'}`;
90
+ }
91
+ function androidSnippet(ctx) {
92
+ return `// 1. Add to your build.gradle:
93
+ // implementation 'com.linkforty:mobile-sdk-android:1.0.0'
94
+ //
95
+ // 2. Initialize in your Application class:
96
+ import com.linkforty.LinkForty
97
+
98
+ class MyApp : Application() {
99
+ override fun onCreate() {
100
+ super.onCreate()
101
+
102
+ LinkForty.init(
103
+ context = this,
104
+ apiKey = "${ctx.apiKey}",
105
+ baseUrl = "${ctx.baseUrl}"
106
+ )
107
+
108
+ LinkForty.onDeepLink { data ->
109
+ Log.d("LinkForty", "Deep link: $data")
110
+ }
111
+
112
+ LinkForty.onDeferredDeepLink { data ->
113
+ if (data != null) {
114
+ Log.d("LinkForty", "Install attributed to: $data")
115
+ }
116
+ }
117
+ }
118
+ }
119
+
120
+ // Package name: ${ctx.appConfig.androidPackageName ?? '(not configured)'}
121
+ // App Link domain: ${ctx.appConfig.androidAppLinkDomain ?? '(not configured)'}`;
122
+ }
123
+ function flutterSnippet(ctx) {
124
+ return `// 1. Add to pubspec.yaml:
125
+ // dependencies:
126
+ // linkforty: ^1.0.0
127
+ //
128
+ // 2. Initialize in main.dart:
129
+ import 'package:linkforty/linkforty.dart';
130
+ import 'package:flutter/material.dart';
131
+
132
+ void main() async {
133
+ WidgetsFlutterBinding.ensureInitialized();
134
+
135
+ await LinkForty.init(
136
+ apiKey: '${ctx.apiKey}',
137
+ baseUrl: '${ctx.baseUrl}',
138
+ );
139
+
140
+ LinkForty.onDeepLink((data) {
141
+ print('Deep link: $data');
142
+ });
143
+
144
+ LinkForty.onDeferredDeepLink((data) {
145
+ if (data != null) print('Install attributed to: $data');
146
+ });
147
+
148
+ runApp(const MyApp());
149
+ }`;
150
+ }
151
+ const snippetGenerators = {
152
+ 'react-native': reactNativeSnippet,
153
+ expo: expoSnippet,
154
+ ios: iosSnippet,
155
+ android: androidSnippet,
156
+ flutter: flutterSnippet,
157
+ };
158
+ export const getSdkInstallSnippetTool = defineTool({
159
+ name: 'get_sdk_install_snippet',
160
+ description: 'Generate a ready-to-paste SDK initialization snippet for a specific mobile platform. The snippet is pre-filled with the user\'s API key, base URL, and app config (bundle IDs, schemes, link domains) from the current workspace. Supported platforms: react-native, expo, ios, android, flutter. Use this to help a developer integrate LinkForty into their mobile app in under a minute.',
161
+ schema: z.object({
162
+ platform: z.enum(['react-native', 'expo', 'ios', 'android', 'flutter']),
163
+ }),
164
+ handler: async (args, client) => {
165
+ // Pull current workspace and app config so the snippet is fully filled in
166
+ const workspaces = await client.get('/workspaces');
167
+ if (!workspaces?.length) {
168
+ throw new Error('No workspaces accessible by this API key');
169
+ }
170
+ const wsId = workspaces[0].id;
171
+ const appConfig = await client.get(`/workspaces/${wsId}/app-config`).catch(() => ({}));
172
+ // The MCP server doesn't have direct access to the user's API key string
173
+ // because it lives in process.env. Pull it from the env via the client config.
174
+ // We re-read process.env here since the client doesn't expose the key directly.
175
+ const apiKey = process.env.LINKFORTY_API_KEY ?? 'YOUR_API_KEY';
176
+ const baseUrl = (process.env.LINKFORTY_BASE_URL || 'https://app.linkforty.com/api')
177
+ .replace(/\/api\/?$/, '');
178
+ const generator = snippetGenerators[args.platform];
179
+ if (!generator)
180
+ throw new Error(`Unsupported platform: ${args.platform}`);
181
+ return {
182
+ platform: args.platform,
183
+ snippet: generator({ apiKey, baseUrl, appConfig }),
184
+ appConfig,
185
+ docs: `https://docs.linkforty.com/sdks/${args.platform}`,
186
+ };
187
+ },
188
+ });
189
+ export const sdkTools = [getSdkInstallSnippetTool];
190
+ //# sourceMappingURL=sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/tools/sdk.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiBzC,SAAS,kBAAkB,CAAC,GAAmB;IAC7C,OAAO;;;;;;;aAOI,GAAG,CAAC,MAAM;cACT,GAAG,CAAC,OAAO;;;;;;;;;;;;IAYrB,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,GAAmB;IACtC,OAAO;;;;;;;;;;iBAUQ,GAAG,CAAC,MAAM;kBACT,GAAG,CAAC,OAAO;;;;;;;;;;;;;EAa3B,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAmB;IACrC,OAAO;;;;;;;;;;iBAUQ,GAAG,CAAC,MAAM;kBACT,GAAG,CAAC,OAAO;;;;;;;;;;;;;;;;;;;gBAmBb,GAAG,CAAC,SAAS,CAAC,WAAW,IAAI,kBAAkB;4BACnC,GAAG,CAAC,SAAS,CAAC,sBAAsB,IAAI,kBAAkB,EAAE,CAAC;AACzF,CAAC;AAED,SAAS,cAAc,CAAC,GAAmB;IACzC,OAAO;;;;;;;;;;;;kBAYS,GAAG,CAAC,MAAM;mBACT,GAAG,CAAC,OAAO;;;;;;;;;;;;;;;mBAeX,GAAG,CAAC,SAAS,CAAC,kBAAkB,IAAI,kBAAkB;sBACnD,GAAG,CAAC,SAAS,CAAC,oBAAoB,IAAI,kBAAkB,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,cAAc,CAAC,GAAmB;IACzC,OAAO;;;;;;;;;;;;eAYM,GAAG,CAAC,MAAM;gBACT,GAAG,CAAC,OAAO;;;;;;;;;;;;EAYzB,CAAC;AACH,CAAC;AAED,MAAM,iBAAiB,GAAoD;IACzE,cAAc,EAAE,kBAAkB;IAClC,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,UAAU;IACf,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,cAAc;CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAAC;IACjD,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EACT,6XAA6X;IAC/X,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;KACxE,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAC9B,0EAA0E;QAC1E,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,GAAG,CAAwB,aAAa,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAY,eAAe,IAAI,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAElG,yEAAyE;QACzE,+EAA+E;QAC/E,gFAAgF;QAChF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,cAAc,CAAC;QAC/D,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,+BAA+B,CAAC;aAChF,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAE5B,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE1E,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YAClD,SAAS;YACT,IAAI,EAAE,mCAAmC,IAAI,CAAC,QAAQ,EAAE;SACzD,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared helpers for tool definitions.
3
+ */
4
+ import { z } from 'zod';
5
+ import type { LinkFortyClient } from '../client.js';
6
+ export interface ToolDefinition {
7
+ name: string;
8
+ description: string;
9
+ inputSchema: Record<string, unknown>;
10
+ handler: (args: any, client: LinkFortyClient) => Promise<unknown>;
11
+ }
12
+ /**
13
+ * Creates a tool definition from a Zod schema. The schema is converted to
14
+ * JSON Schema for the MCP tool listing, and used to validate inputs at call time.
15
+ */
16
+ export declare function defineTool<TSchema extends z.ZodTypeAny>(opts: {
17
+ name: string;
18
+ description: string;
19
+ schema: TSchema;
20
+ handler: (args: z.infer<TSchema>, client: LinkFortyClient) => Promise<unknown>;
21
+ }): ToolDefinition;
22
+ /**
23
+ * Format any value as a JSON string suitable for an MCP text content block.
24
+ */
25
+ export declare function asText(value: unknown): string;
26
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAErC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACnE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChF,GAAG,cAAc,CAUjB;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG7C"}
@@ -0,0 +1,25 @@
1
+ import { zodToJsonSchema } from './zod-to-json-schema.js';
2
+ /**
3
+ * Creates a tool definition from a Zod schema. The schema is converted to
4
+ * JSON Schema for the MCP tool listing, and used to validate inputs at call time.
5
+ */
6
+ export function defineTool(opts) {
7
+ return {
8
+ name: opts.name,
9
+ description: opts.description,
10
+ inputSchema: zodToJsonSchema(opts.schema),
11
+ handler: async (args, client) => {
12
+ const parsed = opts.schema.parse(args ?? {});
13
+ return opts.handler(parsed, client);
14
+ },
15
+ };
16
+ }
17
+ /**
18
+ * Format any value as a JSON string suitable for an MCP text content block.
19
+ */
20
+ export function asText(value) {
21
+ if (typeof value === 'string')
22
+ return value;
23
+ return JSON.stringify(value, null, 2);
24
+ }
25
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAW1D;;;GAGG;AACH,MAAM,UAAU,UAAU,CAA+B,IAKxD;IACC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAA4B;QACpE,OAAO,EAAE,KAAK,EAAE,IAAa,EAAE,MAAuB,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const listTemplatesTool: import("./shared.js").ToolDefinition;
2
+ export declare const createTemplateTool: import("./shared.js").ToolDefinition;
3
+ export declare const setDefaultTemplateTool: import("./shared.js").ToolDefinition;
4
+ export declare const templateTools: import("./shared.js").ToolDefinition[];
5
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/tools/templates.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,iBAAiB,sCAQ5B,CAAC;AAEH,eAAO,MAAM,kBAAkB,sCAa7B,CAAC;AAEH,eAAO,MAAM,sBAAsB,sCAUjC,CAAC;AAEH,eAAO,MAAM,aAAa,wCAAkE,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Link template tools.
3
+ */
4
+ import { z } from 'zod';
5
+ import { defineTool } from './shared.js';
6
+ const utmSchema = z
7
+ .object({
8
+ source: z.string().optional(),
9
+ medium: z.string().optional(),
10
+ campaign: z.string().optional(),
11
+ term: z.string().optional(),
12
+ content: z.string().optional(),
13
+ })
14
+ .optional();
15
+ const targetingSchema = z
16
+ .object({
17
+ countries: z.array(z.string()).optional(),
18
+ devices: z.array(z.enum(['ios', 'android', 'web'])).optional(),
19
+ languages: z.array(z.string()).optional(),
20
+ })
21
+ .optional();
22
+ const templateSettingsSchema = z
23
+ .object({
24
+ defaultIosUrl: z.string().url().optional(),
25
+ defaultAndroidUrl: z.string().url().optional(),
26
+ defaultWebFallbackUrl: z.string().url().optional(),
27
+ defaultAttributionWindowHours: z.number().int().min(1).max(2160).optional(),
28
+ utmParameters: utmSchema,
29
+ targetingRules: targetingSchema,
30
+ expiresAfterDays: z.number().int().min(1).optional(),
31
+ })
32
+ .optional();
33
+ export const listTemplatesTool = defineTool({
34
+ name: 'list_templates',
35
+ description: 'List all link templates in the current workspace. Templates define default destinations, UTM parameters, and targeting rules that new links can inherit. Each template has a slug used for URL routing.',
36
+ schema: z.object({}),
37
+ handler: async (_args, client) => {
38
+ return client.get('/templates');
39
+ },
40
+ });
41
+ export const createTemplateTool = defineTool({
42
+ name: 'create_template',
43
+ description: 'Create a new link template. Templates let you define default destinations (iOS/Android/web), UTM parameters, targeting rules, and attribution windows that new links inherit. Useful for ensuring consistency across campaigns.',
44
+ schema: z.object({
45
+ name: z.string().min(1).max(255),
46
+ description: z.string().optional(),
47
+ isDefault: z.boolean().optional(),
48
+ settings: templateSettingsSchema,
49
+ }),
50
+ handler: async (args, client) => {
51
+ return client.post('/templates', args);
52
+ },
53
+ });
54
+ export const setDefaultTemplateTool = defineTool({
55
+ name: 'set_default_template',
56
+ description: 'Mark a template as the default for the workspace. The default template is used by the SDK when creating links from mobile apps without specifying a template.',
57
+ schema: z.object({
58
+ id: z.string().uuid().describe('Template UUID to set as default'),
59
+ }),
60
+ handler: async (args, client) => {
61
+ return client.put(`/templates/${args.id}/set-default`, {});
62
+ },
63
+ });
64
+ export const templateTools = [listTemplatesTool, createTemplateTool, setDefaultTemplateTool];
65
+ //# 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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"}
@@ -0,0 +1,5 @@
1
+ export declare const listWorkspacesTool: import("./shared.js").ToolDefinition;
2
+ export declare const getCurrentWorkspaceTool: import("./shared.js").ToolDefinition;
3
+ export declare const getAppConfigTool: import("./shared.js").ToolDefinition;
4
+ export declare const workspaceTools: import("./shared.js").ToolDefinition[];
5
+ //# sourceMappingURL=workspaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../src/tools/workspaces.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,kBAAkB,sCAQ7B,CAAC;AAEH,eAAO,MAAM,uBAAuB,sCAalC,CAAC;AAEH,eAAO,MAAM,gBAAgB,sCAY3B,CAAC;AAEH,eAAO,MAAM,cAAc,wCAAkE,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Workspace (organization) tools.
3
+ *
4
+ * Note: an API key is scoped to a single workspace, so list_workspaces always
5
+ * returns just the workspace the key belongs to. The other tools operate on
6
+ * the current workspace implicitly.
7
+ */
8
+ import { z } from 'zod';
9
+ import { defineTool } from './shared.js';
10
+ export const listWorkspacesTool = defineTool({
11
+ name: 'list_workspaces',
12
+ description: 'List all workspaces accessible by the current API key. Note: API keys are scoped to a single workspace, so this typically returns one workspace. Use this to confirm which workspace the AI is connected to.',
13
+ schema: z.object({}),
14
+ handler: async (_args, client) => {
15
+ return client.get('/workspaces');
16
+ },
17
+ });
18
+ export const getCurrentWorkspaceTool = defineTool({
19
+ name: 'get_current_workspace',
20
+ description: 'Get details about the current workspace including subscription tier, member count, link count, project count, and settings. Returns the workspace bound to the active API key.',
21
+ schema: z.object({}),
22
+ handler: async (_args, client) => {
23
+ // List returns just one workspace for an API key — pick the first
24
+ const workspaces = await client.get('/workspaces');
25
+ if (!workspaces?.length) {
26
+ throw new Error('No workspaces accessible by this API key');
27
+ }
28
+ return client.get(`/workspaces/${workspaces[0].id}`);
29
+ },
30
+ });
31
+ export const getAppConfigTool = defineTool({
32
+ name: 'get_app_config',
33
+ description: 'Get the iOS/Android app configuration for the current workspace, including app scheme, bundle IDs, package name, Universal Link/App Link domains, app store URLs, and SHA256 fingerprints. Use this to know how to integrate the SDK or build deep link URLs that open the right app.',
34
+ schema: z.object({}),
35
+ handler: async (_args, client) => {
36
+ const workspaces = await client.get('/workspaces');
37
+ if (!workspaces?.length) {
38
+ throw new Error('No workspaces accessible by this API key');
39
+ }
40
+ return client.get(`/workspaces/${workspaces[0].id}/app-config`);
41
+ },
42
+ });
43
+ export const workspaceTools = [listWorkspacesTool, getCurrentWorkspaceTool, getAppConfigTool];
44
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../src/tools/workspaces.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;IAC3C,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,8MAA8M;IAChN,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC/B,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC;IAChD,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EACT,gLAAgL;IAClL,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC/B,kEAAkE;QAClE,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,GAAG,CAAwB,aAAa,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;IACzC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,uRAAuR;IACzR,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC/B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,GAAG,CAAwB,aAAa,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAClE,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,kBAAkB,EAAE,uBAAuB,EAAE,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Minimal Zod → JSON Schema converter for our tool input schemas.
3
+ *
4
+ * Supports the subset we actually use: object, string, number, boolean, enum,
5
+ * array, optional, default, nullable. Anything else degrades to `{}`.
6
+ *
7
+ * Avoids pulling in the full `zod-to-json-schema` package to keep the bundle small.
8
+ */
9
+ import { ZodTypeAny } from 'zod';
10
+ interface JsonSchema {
11
+ type?: string;
12
+ description?: string;
13
+ enum?: unknown[];
14
+ items?: JsonSchema;
15
+ properties?: Record<string, JsonSchema>;
16
+ required?: string[];
17
+ additionalProperties?: boolean;
18
+ default?: unknown;
19
+ minimum?: number;
20
+ maximum?: number;
21
+ format?: string;
22
+ nullable?: boolean;
23
+ }
24
+ export declare function zodToJsonSchema(schema: ZodTypeAny): JsonSchema;
25
+ export {};
26
+ //# sourceMappingURL=zod-to-json-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-to-json-schema.d.ts","sourceRoot":"","sources":["../../src/tools/zod-to-json-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AAEpC,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE9D"}