@qrlytics/mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +217 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
package/dist/index.d.ts
ADDED
|
@@ -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,217 @@
|
|
|
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 { z } from "zod";
|
|
5
|
+
const API_KEY = process.env.QRLYTICS_API_KEY;
|
|
6
|
+
const BASE_URL = (process.env.QRLYTICS_API_URL ?? "https://qrlytics.app").replace(/\/$/, "");
|
|
7
|
+
if (!API_KEY) {
|
|
8
|
+
process.stderr.write("Error: QRLYTICS_API_KEY environment variable is required.\n" +
|
|
9
|
+
"Get your API key from https://qrlytics.app/dashboard/settings\n");
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
async function apiFetch(path, options = {}) {
|
|
13
|
+
const url = `${BASE_URL}${path}`;
|
|
14
|
+
const res = await fetch(url, {
|
|
15
|
+
...options,
|
|
16
|
+
headers: {
|
|
17
|
+
Authorization: `Bearer ${API_KEY}`,
|
|
18
|
+
"Content-Type": "application/json",
|
|
19
|
+
...options.headers,
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
const text = await res.text();
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
throw new Error(`API error ${res.status}: ${text}`);
|
|
25
|
+
}
|
|
26
|
+
return JSON.parse(text);
|
|
27
|
+
}
|
|
28
|
+
const server = new McpServer({
|
|
29
|
+
name: "qrlytics",
|
|
30
|
+
version: "1.0.0",
|
|
31
|
+
});
|
|
32
|
+
server.tool("list_qr_codes", "List all your QR codes including their scan counts, status, destination URLs, and short scan links.", {}, async () => {
|
|
33
|
+
const data = (await apiFetch("/api/v1/qr-codes"));
|
|
34
|
+
const codes = data.qrCodes ?? [];
|
|
35
|
+
if (codes.length === 0) {
|
|
36
|
+
return {
|
|
37
|
+
content: [
|
|
38
|
+
{
|
|
39
|
+
type: "text",
|
|
40
|
+
text: "You have no QR codes yet. Use create_qr_code to create your first one.",
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const lines = codes.map((qr) => `ID: ${qr.id}\n Name: ${qr.name}\n Destination: ${qr.destinationUrl}\n Status: ${qr.status ?? "active"}\n Scan link: ${BASE_URL}/r/${qr.shortId}`);
|
|
46
|
+
return {
|
|
47
|
+
content: [{ type: "text", text: lines.join("\n\n") }],
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
server.tool("create_qr_code", "Create a new trackable dynamic QR code. Every scan is automatically recorded with device type, approximate location, referrer, and UTM parameters. The QR code redirects through QRlytics so the destination URL can be changed at any time without reprinting.", {
|
|
51
|
+
name: z
|
|
52
|
+
.string()
|
|
53
|
+
.describe("A descriptive name for this QR code (e.g. 'Autumn Campaign Menu')"),
|
|
54
|
+
destinationUrl: z
|
|
55
|
+
.string()
|
|
56
|
+
.url()
|
|
57
|
+
.describe("The URL this QR code should redirect to"),
|
|
58
|
+
label: z
|
|
59
|
+
.string()
|
|
60
|
+
.optional()
|
|
61
|
+
.describe("Optional internal label or note"),
|
|
62
|
+
}, async ({ name, destinationUrl, label }) => {
|
|
63
|
+
const data = (await apiFetch("/api/v1/qr-codes", {
|
|
64
|
+
method: "POST",
|
|
65
|
+
body: JSON.stringify({ name, destinationUrl, label }),
|
|
66
|
+
}));
|
|
67
|
+
return {
|
|
68
|
+
content: [
|
|
69
|
+
{
|
|
70
|
+
type: "text",
|
|
71
|
+
text: [
|
|
72
|
+
"QR code created successfully.",
|
|
73
|
+
`ID: ${data.id}`,
|
|
74
|
+
`Name: ${data.name}`,
|
|
75
|
+
`Destination: ${data.destinationUrl}`,
|
|
76
|
+
`Scan link: ${BASE_URL}/r/${data.shortId}`,
|
|
77
|
+
"",
|
|
78
|
+
"Every scan of this QR code will be recorded in your QRlytics dashboard with device, location, and referrer data.",
|
|
79
|
+
].join("\n"),
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
server.tool("get_qr_code", "Get full details about a specific QR code by its ID.", {
|
|
85
|
+
id: z.string().describe("The QR code ID (from list_qr_codes)"),
|
|
86
|
+
}, async ({ id }) => {
|
|
87
|
+
const data = (await apiFetch(`/api/v1/qr-codes/${id}`));
|
|
88
|
+
return {
|
|
89
|
+
content: [
|
|
90
|
+
{
|
|
91
|
+
type: "text",
|
|
92
|
+
text: [
|
|
93
|
+
`ID: ${data.id}`,
|
|
94
|
+
`Name: ${data.name}`,
|
|
95
|
+
`Destination: ${data.destinationUrl}`,
|
|
96
|
+
`Status: ${data.status ?? "active"}`,
|
|
97
|
+
`Scan link: ${BASE_URL}/r/${data.shortId}`,
|
|
98
|
+
`Created: ${data.createdAt}`,
|
|
99
|
+
].join("\n"),
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
server.tool("update_qr_code", "Update a QR code's destination URL, name, or status. The short scan URL and QR image remain identical — no reprinting needed. Useful for updating a seasonal promotion, fixing a broken link, or temporarily pausing a code.", {
|
|
105
|
+
id: z.string().describe("The QR code ID (from list_qr_codes)"),
|
|
106
|
+
destinationUrl: z
|
|
107
|
+
.string()
|
|
108
|
+
.url()
|
|
109
|
+
.optional()
|
|
110
|
+
.describe("New destination URL"),
|
|
111
|
+
name: z.string().optional().describe("New display name"),
|
|
112
|
+
status: z
|
|
113
|
+
.enum(["active", "paused"])
|
|
114
|
+
.optional()
|
|
115
|
+
.describe("'paused' disables the code temporarily; 'active' re-enables it"),
|
|
116
|
+
}, async ({ id, destinationUrl, name, status }) => {
|
|
117
|
+
const body = {};
|
|
118
|
+
if (destinationUrl !== undefined)
|
|
119
|
+
body.destinationUrl = destinationUrl;
|
|
120
|
+
if (name !== undefined)
|
|
121
|
+
body.name = name;
|
|
122
|
+
if (status !== undefined)
|
|
123
|
+
body.status = status;
|
|
124
|
+
const data = (await apiFetch(`/api/v1/qr-codes/${id}`, {
|
|
125
|
+
method: "PATCH",
|
|
126
|
+
body: JSON.stringify(body),
|
|
127
|
+
}));
|
|
128
|
+
return {
|
|
129
|
+
content: [
|
|
130
|
+
{
|
|
131
|
+
type: "text",
|
|
132
|
+
text: [
|
|
133
|
+
"QR code updated.",
|
|
134
|
+
`ID: ${data.id}`,
|
|
135
|
+
`Name: ${data.name}`,
|
|
136
|
+
`Destination: ${data.destinationUrl}`,
|
|
137
|
+
`Status: ${data.status ?? "active"}`,
|
|
138
|
+
].join("\n"),
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
server.tool("get_qr_analytics", "Get scan analytics for a specific QR code: daily scan counts, top referrer sources, and UTM campaign breakdown.", {
|
|
144
|
+
id: z.string().describe("The QR code ID"),
|
|
145
|
+
days: z
|
|
146
|
+
.number()
|
|
147
|
+
.int()
|
|
148
|
+
.min(1)
|
|
149
|
+
.max(365)
|
|
150
|
+
.optional()
|
|
151
|
+
.default(30)
|
|
152
|
+
.describe("Number of days to look back (default: 30)"),
|
|
153
|
+
}, async ({ id, days }) => {
|
|
154
|
+
const data = (await apiFetch(`/api/v1/qr-codes/${id}/analytics?days=${days}`));
|
|
155
|
+
const total = (data.scansOverTime ?? []).reduce((sum, d) => sum + (d.scans ?? 0), 0);
|
|
156
|
+
const topRefs = (data.referrers ?? [])
|
|
157
|
+
.slice(0, 5)
|
|
158
|
+
.map((r) => ` ${r.referrer ?? "direct"}: ${r.count}`)
|
|
159
|
+
.join("\n");
|
|
160
|
+
return {
|
|
161
|
+
content: [
|
|
162
|
+
{
|
|
163
|
+
type: "text",
|
|
164
|
+
text: [
|
|
165
|
+
`Analytics for: ${data.qrCode?.name ?? id} (last ${days} days)`,
|
|
166
|
+
`Total scans: ${total}`,
|
|
167
|
+
"",
|
|
168
|
+
"Top referrers:",
|
|
169
|
+
topRefs || " (none recorded)",
|
|
170
|
+
].join("\n"),
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
};
|
|
174
|
+
});
|
|
175
|
+
server.tool("get_analytics", "Get aggregate analytics across all your QR codes: total scans, top-performing codes, and device type breakdown.", {
|
|
176
|
+
days: z
|
|
177
|
+
.number()
|
|
178
|
+
.int()
|
|
179
|
+
.min(1)
|
|
180
|
+
.max(365)
|
|
181
|
+
.optional()
|
|
182
|
+
.default(30)
|
|
183
|
+
.describe("Number of days to look back (default: 30)"),
|
|
184
|
+
}, async ({ days }) => {
|
|
185
|
+
const data = (await apiFetch(`/api/v1/analytics?days=${days}`));
|
|
186
|
+
const { stats, topQRCodes, deviceBreakdown } = data;
|
|
187
|
+
const topLines = (topQRCodes ?? [])
|
|
188
|
+
.slice(0, 5)
|
|
189
|
+
.map((qr, i) => ` ${i + 1}. ${qr.name} — ${qr.totalScans} scans`)
|
|
190
|
+
.join("\n");
|
|
191
|
+
const deviceLines = (deviceBreakdown ?? [])
|
|
192
|
+
.map((d) => ` ${d.deviceType ?? "unknown"}: ${d.count}`)
|
|
193
|
+
.join("\n");
|
|
194
|
+
return {
|
|
195
|
+
content: [
|
|
196
|
+
{
|
|
197
|
+
type: "text",
|
|
198
|
+
text: [
|
|
199
|
+
`Analytics summary (last ${days} days)`,
|
|
200
|
+
`Total QR codes: ${stats?.totalQRCodes ?? 0}`,
|
|
201
|
+
`Total scans: ${stats?.totalScans ?? 0}`,
|
|
202
|
+
`Scans today: ${stats?.scansToday ?? 0}`,
|
|
203
|
+
`Scans this week: ${stats?.scansThisWeek ?? 0}`,
|
|
204
|
+
"",
|
|
205
|
+
"Top performing QR codes:",
|
|
206
|
+
topLines || " (none)",
|
|
207
|
+
"",
|
|
208
|
+
"Device breakdown:",
|
|
209
|
+
deviceLines || " (none recorded)",
|
|
210
|
+
].join("\n"),
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
const transport = new StdioServerTransport();
|
|
216
|
+
await server.connect(transport);
|
|
217
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@qrlytics/mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Model Context Protocol server for QRlytics — create and manage trackable QR codes from Claude, Cursor, and any MCP-compatible AI assistant",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"qrlytics-mcp": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"start": "node dist/index.js",
|
|
12
|
+
"dev": "tsc --watch"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@modelcontextprotocol/sdk": "^1.10.2",
|
|
19
|
+
"zod": "^3.22.0"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/node": "^20.0.0",
|
|
23
|
+
"typescript": "^5.4.0"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"mcp",
|
|
27
|
+
"model-context-protocol",
|
|
28
|
+
"qr-code",
|
|
29
|
+
"trackable-qr",
|
|
30
|
+
"qr-analytics",
|
|
31
|
+
"claude",
|
|
32
|
+
"ai-assistant",
|
|
33
|
+
"qrlytics"
|
|
34
|
+
],
|
|
35
|
+
"author": "QRlytics <support@qrlytics.app>",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://qrlytics.app/integrations/mcp",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "git+https://github.com/qrlytics/mcp.git"
|
|
44
|
+
}
|
|
45
|
+
}
|