@agentpickup/mcp 0.3.1 → 0.3.2

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @agentpickup/mcp
2
2
 
3
- An MCP server for [agentPickup](https://github.com/dav3trad3r/agentpickup) shops. It lets an AI agent find
3
+ An MCP server for [agentPickup](https://agentpickup.app) shops. It lets an AI agent find
4
4
  pickup shops near its user, see what they sell, order, pay by card or in USDC over x402, and hand its user the
5
5
  QR they show at the counter to collect.
6
6
 
@@ -10,8 +10,8 @@ QR they show at the counter to collect.
10
10
  |---|---|
11
11
  | `find_shops` | Shops near a point (`lat`/`lng`), in a suburb (`place`) or selling something (`query`), from the agentPickup directory: each one's `shop_url`, address, hours, open now, distance and matching items |
12
12
  | `get_shop` | Items and prices, the pickup location, and how the shop takes payment |
13
- | `create_pickup_order` | Creates an order. Needs the user's email, where the shop sends the receipt and pickup QR. A test shop marks it paid straight away, with no money moving |
14
- | `pay_order` | Pays the order's x402 link from your wallet and returns the pass link. With no wallet set up, returns the price and pay link instead |
13
+ | `create_pickup_order` | Creates an order. Needs the user's email, where the shop sends the receipt and pickup QR. A test shop marks it paid straight away, with no money moving. Where the shop takes cards, `payment: "card"` returns a checkout link for the user to pay on instead |
14
+ | `pay_order` | Pays the order's x402 link from your wallet and returns the pass link. With no wallet set up, returns the price and pay link instead. For a card order, returns its checkout link |
15
15
  | `order_status` | Waiting for payment, paid, ready, collected or expired |
16
16
  | `get_pickup_pass` | Fetches the pass link, pickup code and QR again by signing in as the paying wallet (Sign-In-With-X) |
17
17
  | `start_group_order` | Starts a group order (a coffee run) with a closing time; returns the code to share and a key to close it early |
package/dist/server.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { type Fetch, type Payer } from "./wallet.js";
3
- export declare const VERSION = "0.3.1";
3
+ export declare const VERSION = "0.3.2";
4
4
  export interface PickupMcpOptions {
5
5
  /** The agentPickup shop this server orders from. */
6
6
  shopUrl: string;
package/dist/server.js CHANGED
@@ -4,7 +4,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
5
5
  import { z } from "zod";
6
6
  import { errorOf, usd } from "./wallet.js";
7
- export const VERSION = "0.3.1";
7
+ export const VERSION = "0.3.2";
8
8
  class ToolError extends Error {
9
9
  }
10
10
  const INSTRUCTIONS = `agentPickup lets you buy things online for the user to collect in person.
@@ -74,7 +74,13 @@ export function createPickupMcpServer(opts) {
74
74
  const shopArg = opts.allowOtherShops || opts.directoryUrl
75
75
  ? { shop_url: z.string().optional().describe(`An agentPickup shop's URL, as find_shops returns it. Defaults to ${home}.`) }
76
76
  : {};
77
- const server = new McpServer({ name: "agentpickup", title: "agentPickup", version: VERSION }, { instructions: INSTRUCTIONS });
77
+ const server = new McpServer({
78
+ name: "agentpickup",
79
+ title: "agentPickup",
80
+ version: VERSION,
81
+ websiteUrl: "https://agentpickup.app",
82
+ icons: [{ src: "https://agentpickup.app/logo.png", mimeType: "image/png", sizes: ["1024x1024"] }],
83
+ }, { instructions: INSTRUCTIONS });
78
84
  if (opts.directoryUrl) {
79
85
  const directoryUrl = opts.directoryUrl;
80
86
  server.registerTool("find_shops", {
@@ -90,7 +96,7 @@ export function createPickupMcpServer(opts) {
90
96
  open_now: z.boolean().optional().describe("Only shops open now (shops without listed hours stay in)."),
91
97
  limit: z.number().int().min(1).max(50).optional(),
92
98
  },
93
- annotations: { readOnlyHint: true, openWorldHint: true },
99
+ annotations: { title: "Find pickup shops", readOnlyHint: true, openWorldHint: true },
94
100
  }, guarded(async (args) => {
95
101
  if ((args.lat === undefined) !== (args.lng === undefined))
96
102
  throw new ToolError("Send lat and lng together.");
@@ -141,7 +147,7 @@ export function createPickupMcpServer(opts) {
141
147
  title: "See what a shop sells",
142
148
  description: "What the shop sells (item ids and prices), where to collect, and which payments it takes.",
143
149
  inputSchema: { ...shopArg },
144
- annotations: { readOnlyHint: true, openWorldHint: true },
150
+ annotations: { title: "See what a shop sells", readOnlyHint: true, openWorldHint: true },
145
151
  }, guarded(async (args) => {
146
152
  const shop = await shopFor(args.shop_url);
147
153
  const data = await call(shop, "/api/catalog");
@@ -184,7 +190,7 @@ export function createPickupMcpServer(opts) {
184
190
  .describe("Who pays: agent (USDC over x402, or a test payment at a test shop) or card (the user pays on a checkout link). Default: agent where the shop takes it, else card."),
185
191
  ...shopArg,
186
192
  },
187
- annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
193
+ annotations: { title: "Order for pickup", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
188
194
  }, guarded(async (args) => {
189
195
  const shop = await shopFor(args.shop_url);
190
196
  // The agent pays over x402 where the shop takes it, a test shop marks the order paid straight away, and a
@@ -219,7 +225,7 @@ export function createPickupMcpServer(opts) {
219
225
  ? `Pay an order in USDC over x402 from wallet ${opts.payer.address}. This spends money: confirm the items and total with the user first. Returns the pickup pass link.`
220
226
  : "No wallet is set up here, so this returns the price and pay link for another x402 client to pay.",
221
227
  inputSchema: { order_id: z.string(), ...shopArg },
222
- annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
228
+ annotations: { title: "Pay for an order", readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
223
229
  }, guarded(async (args) => {
224
230
  const shop = await shopFor(args.shop_url);
225
231
  const status = (await call(shop, `/api/orders/${encodeURIComponent(args.order_id)}`));
@@ -253,7 +259,7 @@ export function createPickupMcpServer(opts) {
253
259
  title: "Check an order",
254
260
  description: "Whether an order is waiting for payment, paid, ready to collect, collected or expired.",
255
261
  inputSchema: { order_id: z.string(), ...shopArg },
256
- annotations: { readOnlyHint: true, openWorldHint: true },
262
+ annotations: { title: "Check an order", readOnlyHint: true, openWorldHint: true },
257
263
  }, guarded(async (args) => {
258
264
  const shop = await shopFor(args.shop_url);
259
265
  const { order } = (await call(shop, `/api/orders/${encodeURIComponent(args.order_id)}`));
@@ -271,7 +277,7 @@ export function createPickupMcpServer(opts) {
271
277
  title: "Get the pickup pass",
272
278
  description: "The pass link, pickup code and QR content for an order this wallet paid, by signing in with the wallet (Sign-In-With-X).",
273
279
  inputSchema: { order_id: z.string(), ...shopArg },
274
- annotations: { readOnlyHint: true, openWorldHint: true },
280
+ annotations: { title: "Get the pickup pass", readOnlyHint: true, openWorldHint: true },
275
281
  }, guarded(async (args) => {
276
282
  if (!opts.payer)
277
283
  throw new ToolError("No wallet is set up here. The pass was emailed to the buyer when the order was paid.");
@@ -301,7 +307,7 @@ export function createPickupMcpServer(opts) {
301
307
  closes_in_minutes: z.number().int().min(5).max(240).optional().describe("Default 15"),
302
308
  ...shopArg,
303
309
  },
304
- annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
310
+ annotations: { title: "Start a group order", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
305
311
  }, guarded(async (args) => {
306
312
  const shop = await shopFor(args.shop_url);
307
313
  const data = (await call(shop, "/api/groups", {
@@ -323,7 +329,7 @@ export function createPickupMcpServer(opts) {
323
329
  name: z.string().min(1).max(60).describe("The user's name, shown to staff on their items"),
324
330
  ...shopArg,
325
331
  },
326
- annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
332
+ annotations: { title: "Join a group order", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
327
333
  }, guarded(async (args) => {
328
334
  const shop = await shopFor(args.shop_url);
329
335
  const { payments } = (await call(shop, "/api/catalog"));
@@ -344,7 +350,7 @@ export function createPickupMcpServer(opts) {
344
350
  title: "Check a group order",
345
351
  description: "Who's in a group order, what they ordered, who has paid, and whether it has closed and been collected.",
346
352
  inputSchema: { code: z.string().min(4).max(12), ...shopArg },
347
- annotations: { readOnlyHint: true, openWorldHint: true },
353
+ annotations: { title: "Check a group order", readOnlyHint: true, openWorldHint: true },
348
354
  }, guarded(async (args) => {
349
355
  const shop = await shopFor(args.shop_url);
350
356
  const { group } = (await call(shop, `/api/groups/${encodeURIComponent(args.code)}`));
@@ -354,7 +360,7 @@ export function createPickupMcpServer(opts) {
354
360
  title: "Close a group order now",
355
361
  description: "Close a group order early, as its organiser. Unpaid shares are left out; the shop gets the rest as one order.",
356
362
  inputSchema: { code: z.string().min(4).max(12), organiser_key: z.string().min(8), ...shopArg },
357
- annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
363
+ annotations: { title: "Close a group order now", readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
358
364
  }, guarded(async (args) => {
359
365
  const shop = await shopFor(args.shop_url);
360
366
  const { group } = (await call(shop, `/api/groups/${encodeURIComponent(args.code)}/close`, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentpickup/mcp",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
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
5
  "mcpName": "io.github.dav3trad3r/agentpickup",
6
6
  "type": "module",
@@ -39,12 +39,12 @@
39
39
  ],
40
40
  "repository": {
41
41
  "type": "git",
42
- "url": "git+https://github.com/dav3trad3r/agentpickup.git",
42
+ "url": "git+https://github.com/Tokenise-au/agentpickup-sdk.git",
43
43
  "directory": "packages/mcp"
44
44
  },
45
45
  "homepage": "https://agentpickup.app",
46
46
  "bugs": {
47
- "url": "https://github.com/dav3trad3r/agentpickup/issues"
47
+ "url": "https://github.com/Tokenise-au/agentpickup-sdk/issues"
48
48
  },
49
49
  "author": "Dave Hallett",
50
50
  "license": "FSL-1.1-ALv2",