@agentpickup/mcp 0.4.3 → 0.5.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.
@@ -1,13 +1,14 @@
1
+ import { type QrBits } from "./card.js";
1
2
  export declare const SHARE_META_KEY = "agentpickup/share";
2
3
  export interface ShareCard {
3
4
  v: 1;
4
- /** The add page, maybe for one café (?shop=). */
5
+ /** The add page, maybe for one shop (?shop=). */
5
6
  url: string;
6
7
  /** The add page's share mode: the share sheet and the sticker. */
7
8
  sharePageUrl: string;
8
- /** The QR as SVG, ink on transparent, for the white tile. */
9
- qrSvg: string;
10
- /** A café to name, when the link is for one. */
9
+ /** The QR as a bit grid, for the white tile. */
10
+ qr: QrBits;
11
+ /** A shop to name, when the link is for one. */
11
12
  shopName?: string;
12
13
  }
13
14
  export declare function shareCardHtml(version: string): string;
@@ -2,141 +2,146 @@
2
2
  // The counter sticker as a card: a QR to the add page that a friend scans off the screen, the link to copy, and
3
3
  // buttons that open the add page's share mode (the phone's share sheet, and the printable sticker). Self-contained,
4
4
  // like the pass card: no scripts, fonts or images from anywhere else, and the same small MCP Apps bridge.
5
+ import { QR_PATH_JS } from "./card.js";
5
6
  export const SHARE_META_KEY = "agentpickup/share";
6
- const PAGE = String.raw `<!doctype html>
7
- <html lang="en">
8
- <head>
9
- <meta charset="utf-8">
10
- <meta name="viewport" content="width=device-width,initial-scale=1">
11
- <title>Share agentPickup</title>
12
- <style>
13
- :root{--bg:#0a0b0d;--text:#eef0f3;--muted:#b7bdc6;--dim:#8b929c;--line:#2a2f36;--lime:#b5f23d;--ink:#0a0b0d}
14
- html,body{margin:0;padding:0;background:transparent}
15
- body{font-family:var(--font-sans,ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif);padding:2px;-webkit-font-smoothing:antialiased}
16
- .card{box-sizing:border-box;max-width:420px;margin:0 auto;background:var(--bg);color:var(--text);border-radius:18px;padding:20px 20px 16px}
17
- .top{display:flex;align-items:center;gap:8px;font-weight:700;font-size:15px}
18
- .top svg{width:22px;height:22px;border-radius:5px}
19
- .top .dim{color:var(--dim)}
20
- h1{margin:14px 0 0;font-size:34px;line-height:.95;font-weight:850;letter-spacing:-.02em;text-transform:uppercase}
21
- h1 em{font-style:normal;color:var(--lime)}
22
- .sub{margin:8px 0 0;color:var(--muted);font-size:15px}
23
- .row{display:flex;gap:16px;align-items:flex-end;margin-top:16px}
24
- .tile{background:#fff;border-radius:14px;padding:12px;width:156px;height:156px;flex:none;box-sizing:border-box}
25
- .tile svg{display:block;width:100%;height:100%}
26
- ol{list-style:none;margin:0;padding:0;counter-reset:n;color:var(--muted);font-size:15px}
27
- li{counter-increment:n;margin:0 0 8px;display:flex;align-items:center;gap:8px}
28
- li::before{content:counter(n);width:22px;height:22px;border-radius:50%;border:1.5px solid var(--line);display:inline-flex;align-items:center;justify-content:center;font:600 12px ui-monospace,Menlo,monospace;color:var(--lime);flex:none}
29
- .link{margin-top:14px;display:flex;gap:8px;align-items:center}
30
- .link code{flex:1;min-width:0;overflow-wrap:anywhere;font:13px ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--text);background:#16191d;border:1px solid var(--line);border-radius:10px;padding:9px 10px;user-select:all;-webkit-user-select:all}
31
- button{font-weight:600;font-size:14px;font-family:inherit;border-radius:10px;padding:10px 14px;cursor:pointer;border:1px solid var(--line);background:transparent;color:var(--text);white-space:nowrap}
32
- button.lime{background:var(--lime);color:var(--ink);border-color:var(--lime)}
33
- .actions{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}
34
- .actions button{flex:1}
35
- .note{margin:10px 0 0;font-size:12px;color:var(--dim)}
36
- @media (max-width:360px){.row{flex-direction:column;align-items:flex-start}}
37
- </style>
38
- </head>
39
- <body>
40
- <div id="root"></div>
41
- <script>
42
- (function () {
43
- var VERSION = "__VERSION__";
44
- var root = document.getElementById("root");
45
- var state = null, canOpen = false, nextId = 1, pending = {}, lastHeight = -1;
46
- var host = window.parent;
47
- function send(msg) { try { host.postMessage(msg, "*"); } catch (e) {} }
48
- function request(method, params) {
49
- var id = nextId++;
50
- send({ jsonrpc: "2.0", id: id, method: method, params: params });
51
- return new Promise(function (resolve, reject) {
52
- pending[id] = { resolve: resolve, reject: reject };
53
- setTimeout(function () { if (pending[id]) { delete pending[id]; reject(new Error("timed out")); } }, 30000);
54
- });
55
- }
56
- function notify(method, params) { send({ jsonrpc: "2.0", method: method, params: params }); }
57
- window.addEventListener("message", function (e) {
58
- if (host !== window && e.source !== host) return;
59
- var m = e.data;
60
- if (!m || m.jsonrpc !== "2.0") return;
61
- if (m.id != null && !m.method) {
62
- var p = pending[m.id];
63
- if (p) { delete pending[m.id]; if (m.error) p.reject(m.error); else p.resolve(m.result); }
64
- return;
65
- }
66
- if (m.method === "ui/notifications/tool-result") return onResult(m.params);
67
- if (m.method === "ui/notifications/host-context-changed") { applyContext(m.params || {}); return; }
68
- if (m.method === "ui/resource-teardown" && m.id != null) return send({ jsonrpc: "2.0", id: m.id, result: {} });
69
- if (m.method === "ping" && m.id != null) return send({ jsonrpc: "2.0", id: m.id, result: {} });
70
- if (m.id != null && m.method && m.method.indexOf("ui/notifications/") !== 0) send({ jsonrpc: "2.0", id: m.id, error: { code: -32601, message: "Method not found" } });
71
- });
72
- function applyContext(ctx) {
73
- var vars = ctx.styles && ctx.styles.variables;
74
- if (vars && typeof vars["--font-sans"] === "string") document.documentElement.style.setProperty("--font-sans", vars["--font-sans"]);
75
- }
76
- function openLink(url) {
77
- if (!url) return;
78
- if (canOpen) request("ui/open-link", { url: url }).catch(function () { window.open(url, "_blank", "noopener"); });
79
- else window.open(url, "_blank", "noopener");
80
- }
81
- function onResult(result) {
82
- var data = result && result._meta && result._meta["agentpickup/share"];
83
- if (data && data.url) state = data;
84
- render();
85
- }
86
- function esc(s) { return String(s == null ? "" : s).replace(/[&<>"']/g, function (c) { return { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }[c]; }); }
87
- function safeSvg(svg) { return typeof svg === "string" && /^<svg[\s>]/.test(svg) && !/<script|<foreignObject|\son[a-z]+=/i.test(svg) ? svg : ""; }
88
- function copy(text, button) {
89
- var done = function () { button.textContent = "Copied"; setTimeout(function () { button.textContent = "Copy"; }, 1600); };
90
- try {
91
- if (navigator.clipboard && navigator.clipboard.writeText) return navigator.clipboard.writeText(text).then(done, function () { select(); });
92
- } catch (e) {}
93
- select();
94
- }
95
- function select() {
96
- var code = document.getElementById("url");
97
- if (!code || !window.getSelection) return;
98
- var range = document.createRange();
99
- range.selectNodeContents(code);
100
- var sel = window.getSelection();
101
- sel.removeAllRanges();
102
- sel.addRange(range);
103
- }
104
- function render() {
105
- if (!state) { root.innerHTML = ""; return reportSize(); }
106
- var svg = safeSvg(state.qrSvg);
107
- var shown = state.url.replace(/^https?:\/\//, "");
108
- root.innerHTML =
109
- '<div class="card">' +
110
- '<div class="top"><svg viewBox="0 0 32 32" aria-hidden="true"><rect width="32" height="32" fill="#16191d"/><rect x="7" y="7" width="7" height="7" rx="1.5" fill="#fff"/><rect x="18" y="7" width="7" height="7" rx="1.5" fill="#fff"/><rect x="7" y="18" width="7" height="7" rx="1.5" fill="#fff"/><path d="M18.5 21.5l2.5 2.5 4.5-5" fill="none" stroke="#b5f23d" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/></svg><span><span class="dim">agent</span>Pickup</span></div>' +
111
- "<h1>" + (state.shopName ? "Order from " + esc(state.shopName) + "<br>with your <em>AI</em>" : "Order ahead<br>from your <em>AI</em>") + "</h1>" +
112
- '<p class="sub">Claude, ChatGPT or Grok</p>' +
113
- '<div class="row">' + (svg ? '<div class="tile">' + svg.replace("<svg", '<svg role="img" aria-label="QR code to add agentPickup"') + "</div>" : "") +
114
- "<ol><li>Scan</li><li>Add agentPickup</li><li>Ask for your usual</li></ol></div>" +
115
- '<div class="link"><code id="url">' + esc(shown) + '</code><button type="button" id="copy">Copy</button></div>' +
116
- '<div class="actions"><button class="lime" type="button" id="share">Share</button><button type="button" id="sticker">Get the sticker</button></div>' +
117
- '<p class="note">A friend scans the QR off your screen, or you send them the link.</p>' +
118
- "</div>";
119
- document.getElementById("copy").addEventListener("click", function (e) { copy(state.url, e.currentTarget); });
120
- document.getElementById("share").addEventListener("click", function () { openLink(state.sharePageUrl); });
121
- document.getElementById("sticker").addEventListener("click", function () { openLink(state.sharePageUrl + (state.sharePageUrl.indexOf("?") >= 0 ? "&" : "?") + "sticker=1"); });
122
- reportSize();
123
- }
124
- function reportSize() {
125
- var height = Math.ceil(document.body.getBoundingClientRect().height);
126
- if (height !== lastHeight) { lastHeight = height; notify("ui/notifications/size-changed", { height: height }); }
127
- }
128
- if (window.ResizeObserver) new ResizeObserver(reportSize).observe(document.body);
129
- request("ui/initialize", { appInfo: { name: "agentpickup-share", version: VERSION }, appCapabilities: {}, protocolVersion: "2026-01-26" })
130
- .then(function (r) {
131
- canOpen = Boolean(r && r.hostCapabilities && r.hostCapabilities.openLinks);
132
- applyContext((r && r.hostContext) || {});
133
- notify("ui/notifications/initialized", {});
134
- render();
135
- }, function () { render(); });
136
- })();
137
- </script>
138
- </body>
7
+ const PAGE = String.raw `<!doctype html>
8
+ <html lang="en">
9
+ <head>
10
+ <meta charset="utf-8">
11
+ <meta name="viewport" content="width=device-width,initial-scale=1">
12
+ <title>Share agentPickup</title>
13
+ <style>
14
+ :root{--bg:#0a0b0d;--text:#eef0f3;--muted:#b7bdc6;--dim:#8b929c;--line:#2a2f36;--lime:#b5f23d;--ink:#0a0b0d}
15
+ html,body{margin:0;padding:0;background:transparent}
16
+ body{font-family:var(--font-sans,ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif);padding:2px;-webkit-font-smoothing:antialiased}
17
+ .card{box-sizing:border-box;max-width:420px;margin:0 auto;background:var(--bg);color:var(--text);border-radius:18px;padding:20px 20px 16px}
18
+ .top{display:flex;align-items:center;gap:8px;font-weight:700;font-size:15px}
19
+ .top svg{width:22px;height:22px;border-radius:5px}
20
+ .top .dim{color:var(--dim)}
21
+ h1{margin:14px 0 0;font-size:34px;line-height:.95;font-weight:850;letter-spacing:-.02em;text-transform:uppercase}
22
+ h1 em{font-style:normal;color:var(--lime)}
23
+ .sub{margin:8px 0 0;color:var(--muted);font-size:15px}
24
+ .row{display:flex;gap:16px;align-items:flex-end;margin-top:16px}
25
+ .tile{background:#fff;border-radius:14px;padding:12px;width:156px;height:156px;flex:none;box-sizing:border-box}
26
+ .tile svg{display:block;width:100%;height:100%}
27
+ ol{list-style:none;margin:0;padding:0;counter-reset:n;color:var(--muted);font-size:15px}
28
+ li{counter-increment:n;margin:0 0 8px;display:flex;align-items:center;gap:8px}
29
+ li::before{content:counter(n);width:22px;height:22px;border-radius:50%;border:1.5px solid var(--line);display:inline-flex;align-items:center;justify-content:center;font:600 12px ui-monospace,Menlo,monospace;color:var(--lime);flex:none}
30
+ .link{margin-top:14px;display:flex;gap:8px;align-items:center}
31
+ .link code{flex:1;min-width:0;overflow-wrap:anywhere;font:13px ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--text);background:#16191d;border:1px solid var(--line);border-radius:10px;padding:9px 10px;user-select:all;-webkit-user-select:all}
32
+ button{font-weight:600;font-size:14px;font-family:inherit;border-radius:10px;padding:10px 14px;cursor:pointer;border:1px solid var(--line);background:transparent;color:var(--text);white-space:nowrap}
33
+ button.lime{background:var(--lime);color:var(--ink);border-color:var(--lime)}
34
+ .actions{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}
35
+ .actions button{flex:1}
36
+ .note{margin:10px 0 0;font-size:12px;color:var(--dim)}
37
+ @media (max-width:360px){.row{flex-direction:column;align-items:flex-start}}
38
+ </style>
39
+ </head>
40
+ <body>
41
+ <div id="root"></div>
42
+ <script>
43
+ (function () {
44
+ var VERSION = "__VERSION__";
45
+ var root = document.getElementById("root");
46
+ var state = null, canOpen = false, nextId = 1, pending = {}, lastHeight = -1;
47
+ var qrPathFromBits = __QR_PATH__;
48
+ var host = window.parent;
49
+ function send(msg) { try { host.postMessage(msg, "*"); } catch (e) {} }
50
+ function request(method, params) {
51
+ var id = nextId++;
52
+ send({ jsonrpc: "2.0", id: id, method: method, params: params });
53
+ return new Promise(function (resolve, reject) {
54
+ pending[id] = { resolve: resolve, reject: reject };
55
+ setTimeout(function () { if (pending[id]) { delete pending[id]; reject(new Error("timed out")); } }, 30000);
56
+ });
57
+ }
58
+ function notify(method, params) { send({ jsonrpc: "2.0", method: method, params: params }); }
59
+ window.addEventListener("message", function (e) {
60
+ if (host !== window && e.source !== host) return;
61
+ var m = e.data;
62
+ if (!m || m.jsonrpc !== "2.0") return;
63
+ if (m.id != null && !m.method) {
64
+ var p = pending[m.id];
65
+ if (p) { delete pending[m.id]; if (m.error) p.reject(m.error); else p.resolve(m.result); }
66
+ return;
67
+ }
68
+ if (m.method === "ui/notifications/tool-result") return onResult(m.params);
69
+ if (m.method === "ui/notifications/host-context-changed") { applyContext(m.params || {}); return; }
70
+ if (m.method === "ui/resource-teardown" && m.id != null) return send({ jsonrpc: "2.0", id: m.id, result: {} });
71
+ if (m.method === "ping" && m.id != null) return send({ jsonrpc: "2.0", id: m.id, result: {} });
72
+ if (m.id != null && m.method && m.method.indexOf("ui/notifications/") !== 0) send({ jsonrpc: "2.0", id: m.id, error: { code: -32601, message: "Method not found" } });
73
+ });
74
+ function applyContext(ctx) {
75
+ var vars = ctx.styles && ctx.styles.variables;
76
+ if (vars && typeof vars["--font-sans"] === "string") document.documentElement.style.setProperty("--font-sans", vars["--font-sans"]);
77
+ }
78
+ function openLink(url) {
79
+ if (!url) return;
80
+ if (canOpen) request("ui/open-link", { url: url }).catch(function () { window.open(url, "_blank", "noopener"); });
81
+ else window.open(url, "_blank", "noopener");
82
+ }
83
+ function onResult(result) {
84
+ var data = (result && result.structuredContent && result.structuredContent.share) || (result && result._meta && result._meta["agentpickup/share"]);
85
+ if (data && data.url) state = data;
86
+ render();
87
+ }
88
+ function esc(s) { return String(s == null ? "" : s).replace(/[&<>"']/g, function (c) { return { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }[c]; }); }
89
+ function qrSvg(qr) {
90
+ if (!qr || typeof qr.bits !== "string" || !(qr.size > 0 && qr.size < 200)) return "";
91
+ try { return '<svg viewBox="0 0 ' + qr.size + " " + qr.size + '" shape-rendering="crispEdges" role="img" aria-label="QR code to add agentPickup"><path fill="#0a0b0d" d="' + qrPathFromBits(qr) + '"/></svg>'; } catch (e) { return ""; }
92
+ }
93
+ function copy(text, button) {
94
+ var done = function () { button.textContent = "Copied"; setTimeout(function () { button.textContent = "Copy"; }, 1600); };
95
+ try {
96
+ if (navigator.clipboard && navigator.clipboard.writeText) return navigator.clipboard.writeText(text).then(done, function () { select(); });
97
+ } catch (e) {}
98
+ select();
99
+ }
100
+ function select() {
101
+ var code = document.getElementById("url");
102
+ if (!code || !window.getSelection) return;
103
+ var range = document.createRange();
104
+ range.selectNodeContents(code);
105
+ var sel = window.getSelection();
106
+ sel.removeAllRanges();
107
+ sel.addRange(range);
108
+ }
109
+ function render() {
110
+ if (!state) { root.innerHTML = ""; return reportSize(); }
111
+ var svg = qrSvg(state.qr);
112
+ var shown = state.url.replace(/^https?:\/\//, "");
113
+ root.innerHTML =
114
+ '<div class="card">' +
115
+ '<div class="top"><svg viewBox="0 0 32 32" aria-hidden="true"><rect width="32" height="32" fill="#16191d"/><rect x="7" y="7" width="7" height="7" rx="1.5" fill="#fff"/><rect x="18" y="7" width="7" height="7" rx="1.5" fill="#fff"/><rect x="7" y="18" width="7" height="7" rx="1.5" fill="#fff"/><path d="M18.5 21.5l2.5 2.5 4.5-5" fill="none" stroke="#b5f23d" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/></svg><span><span class="dim">agent</span>Pickup</span></div>' +
116
+ "<h1>" + (state.shopName ? "Order from " + esc(state.shopName) + "<br>with your <em>AI</em>" : "Order ahead<br>from your <em>AI</em>") + "</h1>" +
117
+ '<p class="sub">Claude, ChatGPT or Grok</p>' +
118
+ '<div class="row">' + (svg ? '<div class="tile">' + svg + "</div>" : "") +
119
+ "<ol><li>Scan</li><li>Add agentPickup</li><li>Ask for your usual</li></ol></div>" +
120
+ '<div class="link"><code id="url">' + esc(shown) + '</code><button type="button" id="copy">Copy</button></div>' +
121
+ '<div class="actions"><button class="lime" type="button" id="share">Share</button><button type="button" id="sticker">Get the sticker</button></div>' +
122
+ '<p class="note">A friend scans the QR off your screen, or you send them the link.</p>' +
123
+ "</div>";
124
+ document.getElementById("copy").addEventListener("click", function (e) { copy(state.url, e.currentTarget); });
125
+ document.getElementById("share").addEventListener("click", function () { openLink(state.sharePageUrl); });
126
+ document.getElementById("sticker").addEventListener("click", function () { openLink(state.sharePageUrl + (state.sharePageUrl.indexOf("?") >= 0 ? "&" : "?") + "sticker=1"); });
127
+ reportSize();
128
+ }
129
+ function reportSize() {
130
+ var height = Math.ceil(document.body.getBoundingClientRect().height);
131
+ if (height !== lastHeight) { lastHeight = height; notify("ui/notifications/size-changed", { height: height }); }
132
+ }
133
+ if (window.ResizeObserver) new ResizeObserver(reportSize).observe(document.body);
134
+ request("ui/initialize", { appInfo: { name: "agentpickup-share", version: VERSION }, appCapabilities: {}, protocolVersion: "2026-01-26" })
135
+ .then(function (r) {
136
+ canOpen = Boolean(r && r.hostCapabilities && r.hostCapabilities.openLinks);
137
+ applyContext((r && r.hostContext) || {});
138
+ notify("ui/notifications/initialized", {});
139
+ render();
140
+ }, function () { render(); });
141
+ })();
142
+ </script>
143
+ </body>
139
144
  </html>`;
140
145
  export function shareCardHtml(version) {
141
- return PAGE.replace("__VERSION__", version);
146
+ return PAGE.replace("__VERSION__", version).replace("__QR_PATH__", QR_PATH_JS);
142
147
  }
package/package.json CHANGED
@@ -1,63 +1,66 @@
1
- {
2
- "name": "@agentpickup/mcp",
3
- "version": "0.4.3",
4
- "description": "MCP server for agentPickup: let an AI agent find pickup shops near its user, order, pay by card or in USDC over x402, and hand its user the QR to collect in person.",
5
- "mcpName": "io.github.dav3trad3r/agentpickup",
6
- "type": "module",
7
- "main": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "bin": {
10
- "agentpickup-mcp": "dist/cli.js"
11
- },
12
- "exports": {
13
- ".": {
14
- "source": "./src/index.ts",
15
- "types": "./dist/index.d.ts",
16
- "default": "./dist/index.js"
17
- }
18
- },
19
- "files": [
20
- "dist",
21
- "LICENSE.md",
22
- "README.md"
23
- ],
24
- "scripts": {
25
- "build": "tsc -p tsconfig.build.json",
26
- "prepublishOnly": "npm run build"
27
- },
28
- "engines": {
29
- "node": ">=22.13"
30
- },
31
- "keywords": [
32
- "mcp",
33
- "model-context-protocol",
34
- "x402",
35
- "agentic-commerce",
36
- "agent-payments",
37
- "click-and-collect",
38
- "pickup"
39
- ],
40
- "repository": {
41
- "type": "git",
42
- "url": "git+https://github.com/Tokenise-au/agentpickup-sdk.git",
43
- "directory": "packages/mcp"
44
- },
45
- "homepage": "https://agentpickup.app",
46
- "bugs": {
47
- "url": "https://github.com/Tokenise-au/agentpickup-sdk/issues"
48
- },
49
- "author": "Dave Hallett",
50
- "license": "FSL-1.1-ALv2",
51
- "publishConfig": {
52
- "access": "public"
53
- },
54
- "dependencies": {
55
- "@modelcontextprotocol/sdk": "^1.32.2",
56
- "@x402/core": "2.29.0",
57
- "@x402/evm": "2.29.0",
58
- "@x402/extensions": "2.29.0",
59
- "qrcode": "^1.5.4",
60
- "viem": "^2.57.14",
61
- "zod": "^4.6.7"
62
- }
63
- }
1
+ {
2
+ "name": "@agentpickup/mcp",
3
+ "version": "0.5.0",
4
+ "description": "MCP server for agentPickup: people order from real shops through their AI assistant, pay by card on the shop's own checkout (or USDC over x402), and collect in person with a QR.",
5
+ "mcpName": "io.github.dav3trad3r/agentpickup",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "bin": {
10
+ "agentpickup-mcp": "dist/cli.js"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "source": "./src/index.ts",
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "LICENSE.md",
22
+ "README.md"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc -p tsconfig.build.json",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "engines": {
29
+ "node": ">=22.13"
30
+ },
31
+ "keywords": [
32
+ "mcp",
33
+ "model-context-protocol",
34
+ "x402",
35
+ "agentic-commerce",
36
+ "agent-payments",
37
+ "click-and-collect",
38
+ "pickup",
39
+ "local-shops",
40
+ "pos",
41
+ "ordering"
42
+ ],
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "git+https://github.com/Tokenise-au/agentpickup-sdk.git",
46
+ "directory": "packages/mcp"
47
+ },
48
+ "homepage": "https://agentpickup.app",
49
+ "bugs": {
50
+ "url": "https://github.com/Tokenise-au/agentpickup-sdk/issues"
51
+ },
52
+ "author": "Dave Hallett",
53
+ "license": "FSL-1.1-ALv2",
54
+ "publishConfig": {
55
+ "access": "public"
56
+ },
57
+ "dependencies": {
58
+ "@modelcontextprotocol/sdk": "^1.32.2",
59
+ "@x402/core": "2.29.0",
60
+ "@x402/evm": "2.29.0",
61
+ "@x402/extensions": "2.29.0",
62
+ "qrcode": "^1.5.4",
63
+ "viem": "^2.57.14",
64
+ "zod": "^4.6.7"
65
+ }
66
+ }