tru-mcp 0.5.2 → 0.7.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 (46) hide show
  1. package/README.md +29 -40
  2. package/dist/api-client.d.ts +12 -1
  3. package/dist/api-client.js +16 -2
  4. package/dist/api-client.js.map +1 -1
  5. package/dist/index.js +7 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/init.js +110 -9
  8. package/dist/init.js.map +1 -1
  9. package/dist/server.js +171 -138
  10. package/dist/server.js.map +1 -1
  11. package/dist/tools/add_agent_signup.d.ts +23 -0
  12. package/dist/tools/add_agent_signup.js +60 -0
  13. package/dist/tools/add_agent_signup.js.map +1 -0
  14. package/dist/tools/authenticate.js +1 -1
  15. package/dist/tools/authenticate.js.map +1 -1
  16. package/dist/tools/check_charge_status.js +1 -1
  17. package/dist/tools/check_charge_status.js.map +1 -1
  18. package/dist/tools/check_request_status.js +1 -1
  19. package/dist/tools/check_request_status.js.map +1 -1
  20. package/dist/tools/connect_stripe.js +10 -4
  21. package/dist/tools/connect_stripe.js.map +1 -1
  22. package/dist/tools/create_charge.d.ts +2 -0
  23. package/dist/tools/create_charge.js +76 -18
  24. package/dist/tools/create_charge.js.map +1 -1
  25. package/dist/tools/discover_api.js +16 -14
  26. package/dist/tools/discover_api.js.map +1 -1
  27. package/dist/tools/discover_apps.js +2 -2
  28. package/dist/tools/discover_apps.js.map +1 -1
  29. package/dist/tools/discover_products.d.ts +23 -0
  30. package/dist/tools/discover_products.js +55 -0
  31. package/dist/tools/discover_products.js.map +1 -0
  32. package/dist/tools/get_started.js +125 -54
  33. package/dist/tools/get_started.js.map +1 -1
  34. package/dist/tools/initiate_oauth.js +7 -3
  35. package/dist/tools/initiate_oauth.js.map +1 -1
  36. package/dist/tools/provision_user.js +1 -1
  37. package/dist/tools/provision_user.js.map +1 -1
  38. package/dist/tools/read_skill.js +2 -2
  39. package/dist/tools/read_skill.js.map +1 -1
  40. package/dist/tools/register_app.js +96 -10
  41. package/dist/tools/register_app.js.map +1 -1
  42. package/dist/tools/request_user_data.js +2 -2
  43. package/dist/tools/request_user_data.js.map +1 -1
  44. package/dist/tools/request_virtual_card.js +67 -7
  45. package/dist/tools/request_virtual_card.js.map +1 -1
  46. package/package.json +1 -1
@@ -22,6 +22,7 @@ export declare const createChargeTool: {
22
22
  action: z.ZodOptional<z.ZodString>;
23
23
  app_id: z.ZodOptional<z.ZodString>;
24
24
  source_label: z.ZodOptional<z.ZodString>;
25
+ product_id: z.ZodOptional<z.ZodString>;
25
26
  };
26
27
  handler: (args: {
27
28
  email: string;
@@ -34,6 +35,7 @@ export declare const createChargeTool: {
34
35
  action?: string;
35
36
  app_id?: string;
36
37
  source_label?: string;
38
+ product_id?: string;
37
39
  }) => Promise<{
38
40
  content: {
39
41
  type: "text";
@@ -1,14 +1,29 @@
1
1
  import { z } from "zod";
2
- import { createCharge } from "../api-client.js";
2
+ import { exec } from "child_process";
3
+ import { createCharge, getChargeStatus } from "../api-client.js";
3
4
  import { getSourceLabel, saveSourceLabel, getSuggestedLabel } from "../server.js";
5
+ const BASE_URL = process.env.TRU_API_URL || "https://tru.so";
6
+ function sleep(ms) {
7
+ return new Promise((resolve) => setTimeout(resolve, ms));
8
+ }
9
+ function openBrowser(url) {
10
+ const platform = process.platform;
11
+ const cmd = platform === "darwin" ? "open" :
12
+ platform === "win32" ? "start" :
13
+ "xdg-open";
14
+ exec(`${cmd} "${url}"`);
15
+ }
4
16
  export const createChargeTool = {
5
- name: "create_charge",
17
+ name: "pay",
6
18
  description: "Create a direct charge or subscription on behalf of a user. " +
7
- "Unlike request_virtual_card, this charges the user's payment method directly " +
19
+ "Unlike get_card, this charges the user's payment method directly " +
8
20
  "or creates a recurring subscription. " +
9
21
  "The charge goes through the user's agent rules: auto-approved if within limits, " +
10
22
  "left pending for manual approval if escalated, or auto-rejected if denied. " +
11
- "For recurring subscriptions, set type to 'recurring' and specify the interval.",
23
+ "For recurring subscriptions, set type to 'recurring' and specify the interval. " +
24
+ "NOTE: For client-side billing in web apps, consider using amount-based buttons instead — " +
25
+ "<tru-pay-button amount=\"499\" description=\"Pro plan\"> or tru.pay({ amount: 499, description: 'Pro plan' }). " +
26
+ "This eliminates the need for a server-side charge endpoint. This tool is for server-to-server charges.",
12
27
  inputSchema: {
13
28
  email: z.string().describe("Email address of the tru user who will be charged"),
14
29
  amount_cents: z
@@ -48,6 +63,10 @@ export const createChargeTool = {
48
63
  .string()
49
64
  .optional()
50
65
  .describe("Label identifying the source of this personal charge (e.g. 'Claude Code — David's MacBook Pro'). Required for personal charges without an app_id. On first use, omit this to get a suggested label."),
66
+ product_id: z
67
+ .string()
68
+ .optional()
69
+ .describe("The app product ID to link this charge to (from discover_products). Links the purchase to a specific product for provisioning."),
51
70
  },
52
71
  handler: async (args) => {
53
72
  try {
@@ -88,7 +107,7 @@ export const createChargeTool = {
88
107
  }
89
108
  }
90
109
  }
91
- const result = await createCharge(args.email, args.amount_cents, args.description, args.type, args.interval, args.currency, args.payment_mode, args.action, args.app_id, sourceLabel);
110
+ const result = await createCharge(args.email, args.amount_cents, args.description, args.type, args.interval, args.currency, args.payment_mode, args.action, args.app_id, sourceLabel, args.product_id);
92
111
  const amount = (args.amount_cents / 100).toFixed(2);
93
112
  const currencyLabel = (args.currency || "usd").toUpperCase();
94
113
  const chargeType = args.type === "recurring"
@@ -111,27 +130,66 @@ export const createChargeTool = {
111
130
  };
112
131
  }
113
132
  // Charge is pending (escalated or no auto-approve rule matched)
133
+ // Open the approval page in the browser and poll until resolved
114
134
  if (result.status === "pending") {
115
- const escalated = result.rule_evaluation?.action === "escalate";
135
+ const approveUrl = `${BASE_URL}/billing/approve/${result.id}`;
136
+ openBrowser(approveUrl);
137
+ // Poll for approval (every 2s, up to 5 min)
138
+ const maxAttempts = 150;
139
+ let attempts = 0;
140
+ while (attempts < maxAttempts) {
141
+ await sleep(2000);
142
+ attempts++;
143
+ try {
144
+ const status = await getChargeStatus(result.id);
145
+ if (status.status === "completed" || status.status === "approved") {
146
+ return {
147
+ content: [
148
+ {
149
+ type: "text",
150
+ text: [
151
+ `Charge approved.`,
152
+ `Amount: $${amount} ${currencyLabel} (${chargeType})`,
153
+ `Charge request ID: ${result.id}`,
154
+ result.description ? `Description: ${result.description}` : null,
155
+ ]
156
+ .filter(Boolean)
157
+ .join("\n"),
158
+ },
159
+ ],
160
+ };
161
+ }
162
+ if (status.status === "rejected" || status.status === "cancelled") {
163
+ return {
164
+ content: [
165
+ {
166
+ type: "text",
167
+ text: [
168
+ `Charge ${status.status} by user.`,
169
+ `Amount: $${amount} ${currencyLabel} (${chargeType})`,
170
+ `Charge request ID: ${result.id}`,
171
+ ].join("\n"),
172
+ },
173
+ ],
174
+ };
175
+ }
176
+ }
177
+ catch {
178
+ // Keep polling
179
+ }
180
+ }
181
+ // Timed out waiting
116
182
  return {
117
183
  content: [
118
184
  {
119
185
  type: "text",
120
186
  text: [
121
- escalated
122
- ? `Escalated: This charge requires user approval.`
123
- : `Pending: The charge has been created and is awaiting user approval.`,
187
+ `Charge is still pending after 5 minutes.`,
124
188
  `Amount: $${amount} ${currencyLabel} (${chargeType})`,
125
- escalated
126
- ? `Reason: ${result.rule_evaluation?.reason || "Exceeds spending limits"}`
127
- : null,
128
189
  `Charge request ID: ${result.id}`,
129
- ``,
130
- `The user needs to approve this in their tru dashboard.`,
131
- `You can poll the status using the check_charge_status tool with this ID.`,
132
- ]
133
- .filter(Boolean)
134
- .join("\n"),
190
+ `Approval page: ${approveUrl}`,
191
+ `You can check the status later with the check_payment_status tool.`,
192
+ ].join("\n"),
135
193
  },
136
194
  ],
137
195
  };
@@ -1 +1 @@
1
- {"version":3,"file":"create_charge.js","sourceRoot":"","sources":["../../src/tools/create_charge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAElF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,eAAe;IACrB,WAAW,EACT,8DAA8D;QAC9D,+EAA+E;QAC/E,uCAAuC;QACvC,kFAAkF;QAClF,6EAA6E;QAC7E,gFAAgF;IAClF,WAAW,EAAE;QACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QAC/E,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,QAAQ,CAAC,wCAAwC,CAAC;QACrD,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,6CAA6C,CAAC;QAC1D,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;aAC/B,QAAQ,EAAE;aACV,QAAQ,CAAC,oEAAoE,CAAC;QACjF,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;aACvB,QAAQ,EAAE;aACV,QAAQ,CAAC,2DAA2D,CAAC;QACxE,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,gCAAgC,CAAC;QAC7C,YAAY,EAAE,CAAC;aACZ,IAAI,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;aAChC,QAAQ,EAAE;aACV,QAAQ,CAAC,yGAAyG,CAAC;QACtH,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,yHAAyH,CAAC;QACtI,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,kEAAkE,CAAC;QAC/E,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,qMAAqM,CAAC;KACnN;IACD,OAAO,EAAE,KAAK,EAAE,IAWf,EAAE,EAAE;QACH,IAAI,CAAC;YACH,wDAAwD;YACxD,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,IAAI,WAAW,EAAE,CAAC;oBAChB,kDAAkD;oBAClD,eAAe,CAAC,WAAW,CAAC,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,yBAAyB;oBACzB,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;oBAChC,IAAI,MAAM,EAAE,CAAC;wBACX,WAAW,GAAG,MAAM,CAAC;oBACvB,CAAC;yBAAM,CAAC;wBACN,yCAAyC;wBACzC,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;wBACtC,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAe;oCACrB,IAAI,EAAE;wCACJ,0EAA0E;wCAC1E,gBAAgB,SAAS,IAAI;wCAC7B,EAAE;wCACF,oFAAoF;wCACpF,0CAA0C;wCAC1C,EAAE;wCACF,6IAA6I;wCAC7I,EAAE;wCACF,8EAA8E;qCAC/E,CAAC,IAAI,CAAC,IAAI,CAAC;iCACb;6BACF;yBACF,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,EACX,WAAW,CACZ,CAAC;YAEF,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,WAAW;gBAC1C,CAAC,CAAC,cAAc,IAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;gBAC3C,CAAC,CAAC,UAAU,CAAC;YAEf,0CAA0C;YAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjC,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE;gCACJ,0DAA0D;gCAC1D,YAAY,MAAM,IAAI,aAAa,KAAK,UAAU,GAAG;gCACrD,WAAW,MAAM,CAAC,eAAe,EAAE,MAAM,IAAI,2BAA2B,EAAE;gCAC1E,sBAAsB,MAAM,CAAC,EAAE,EAAE;6BAClC,CAAC,IAAI,CAAC,IAAI,CAAC;yBACb;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,gEAAgE;YAChE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,EAAE,MAAM,KAAK,UAAU,CAAC;gBAChE,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE;gCACJ,SAAS;oCACP,CAAC,CAAC,gDAAgD;oCAClD,CAAC,CAAC,qEAAqE;gCACzE,YAAY,MAAM,IAAI,aAAa,KAAK,UAAU,GAAG;gCACrD,SAAS;oCACP,CAAC,CAAC,WAAW,MAAM,CAAC,eAAe,EAAE,MAAM,IAAI,yBAAyB,EAAE;oCAC1E,CAAC,CAAC,IAAI;gCACR,sBAAsB,MAAM,CAAC,EAAE,EAAE;gCACjC,EAAE;gCACF,wDAAwD;gCACxD,0EAA0E;6BAC3E;iCACE,MAAM,CAAC,OAAO,CAAC;iCACf,IAAI,CAAC,IAAI,CAAC;yBACd;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,2BAA2B;YAC3B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,8BAA8B;4BAC9B,YAAY,MAAM,IAAI,aAAa,KAAK,UAAU,GAAG;4BACrD,WAAW,MAAM,CAAC,MAAM,EAAE;4BAC1B,sBAAsB,MAAM,CAAC,EAAE,EAAE;4BACjC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;yBACjE;6BACE,MAAM,CAAC,OAAO,CAAC;6BACf,IAAI,CAAC,IAAI,CAAC;qBACd;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEjE,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC1C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,+FAA+F;yBACtG;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,0BAA0B,OAAO,EAAE;qBAC1C;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"create_charge.js","sourceRoot":"","sources":["../../src/tools/create_charge.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { z } from "zod";
2
2
  import { discoverApi, lookupAppByServiceName, updateAppWebsite } from "../api-client.js";
3
3
  import { getStoredApp } from "../config.js";
4
4
  export const discoverApiTool = {
5
- name: "discover_api",
5
+ name: "dev_generate_skill",
6
6
  description: "Crawl a registered app's website to discover its API endpoints, documentation, and developer guides. " +
7
7
  "Generates an agent skill (SKILL.md) that teaches AI agents how to use the app. " +
8
8
  "Uses the app's API key already configured in .mcp.json — no additional auth needed. " +
@@ -12,7 +12,7 @@ export const discoverApiTool = {
12
12
  service_name: z
13
13
  .string()
14
14
  .optional()
15
- .describe("The service_name of the app to discover. If omitted, uses the app from ~/.tru/config.json (set by register_app)."),
15
+ .describe("The service_name of the app to discover. If omitted, uses the app from ~/.tru/config.json (set by dev_register_app)."),
16
16
  url: z
17
17
  .string()
18
18
  .optional()
@@ -22,7 +22,7 @@ export const discoverApiTool = {
22
22
  const serviceName = args.service_name || getStoredApp()?.service_name;
23
23
  if (!serviceName) {
24
24
  return {
25
- content: [{ type: "text", text: "No service_name provided and no app found in ~/.tru/config.json. Run register_app first." }],
25
+ content: [{ type: "text", text: "No service_name provided and no app found in ~/.tru/config.json. Run dev_register_app first." }],
26
26
  isError: true,
27
27
  };
28
28
  }
@@ -34,7 +34,7 @@ export const discoverApiTool = {
34
34
  content: [
35
35
  {
36
36
  type: "text",
37
- text: `App "${serviceName}" not found. Use register_app to create it first.`,
37
+ text: `App "${serviceName}" not found. Use dev_register_app to create it first.`,
38
38
  },
39
39
  ],
40
40
  };
@@ -52,18 +52,20 @@ export const discoverApiTool = {
52
52
  ``,
53
53
  `## Next: Write agent.md and llms.txt into the project`,
54
54
  ``,
55
- `Use the read_skill tool to get the generated content:`,
56
- ` read_skill(service_name: "${serviceName}")`,
55
+ `Do NOT stop here you must finish this step:`,
57
56
  ``,
58
- `Then write it into the project as \`agent.md\` (in the public/static directory so it's served at the site root).`,
59
- `This file is the app's agent skill — it explains how to use the app through tru, including OAuth auth, provisioning, billing, and all API endpoints.`,
57
+ `1. Use the lookup_skill tool to get the generated content:`,
58
+ ` lookup_skill(service_name: "${serviceName}")`,
60
59
  ``,
61
- `Also create a \`llms.txt\` file (following https://llmstxt.org) in the same directory with:`,
62
- `- H1: app name`,
63
- `- Blockquote: one-line description`,
64
- `- Links to /agent.md and key API endpoints`,
60
+ `2. Write it into the project as \`agent.md\` (in the public/static directory so it's served at the site root).`,
61
+ ` This file is the app's agent skill — it explains how to use the app through tru, including OAuth auth, provisioning, billing, and all API endpoints.`,
65
62
  ``,
66
- `Finally, add a Link header to all HTTP responses: \`Link: </llms.txt>; rel="llms-txt"\``,
63
+ `3. Create a \`llms.txt\` file (following https://llmstxt.org) in the same directory with:`,
64
+ ` - H1: app name`,
65
+ ` - Blockquote: one-line description`,
66
+ ` - Links to /agent.md and key API endpoints`,
67
+ ``,
68
+ `4. Add a Link header to all HTTP responses: \`Link: </llms.txt>; rel="llms-txt"\``,
67
69
  ``,
68
70
  `These files make the app discoverable to AI agents using the llms.txt standard — the same pattern used by tru itself.`,
69
71
  ];
@@ -81,7 +83,7 @@ export const discoverApiTool = {
81
83
  content: [
82
84
  {
83
85
  type: "text",
84
- text: `App "${serviceName}" doesn't have a website URL set. Run discover_api again with the url parameter, e.g.:\n\ndiscover_api(url: "https://your-domain.com")\n\nThis works with localhost URLs too for local development.`,
86
+ text: `App "${serviceName}" doesn't have a website URL set. Run dev_generate_skill again with the url parameter, e.g.:\n\ndev_generate_skill(url: "https://your-domain.com")\n\nThis works with localhost URLs too for local development.`,
85
87
  },
86
88
  ],
87
89
  isError: true,
@@ -1 +1 @@
1
- {"version":3,"file":"discover_api.js","sourceRoot":"","sources":["../../src/tools/discover_api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discover_api.js","sourceRoot":"","sources":["../../src/tools/discover_api.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  const BASE_URL = process.env.TRU_API_URL || "https://tru.so";
2
2
  export const discoverAppsTool = {
3
- name: "discover_apps",
3
+ name: "browse_apps",
4
4
  description: "List all apps in the tru directory. Returns active apps with their service names, " +
5
5
  "descriptions, and SKILL.md URLs. Use this to find services an agent can interact with.",
6
6
  inputSchema: {},
@@ -34,7 +34,7 @@ export const discoverAppsTool = {
34
34
  lines.push(`SKILL.md: ${app.skill_url}`);
35
35
  lines.push("");
36
36
  }
37
- lines.push("Use the read_skill tool with a service_name to learn how to interact with an app.");
37
+ lines.push("Use the lookup_skill tool with a service_name to learn how to interact with an app.");
38
38
  return {
39
39
  content: [{ type: "text", text: lines.join("\n") }],
40
40
  };
@@ -1 +1 @@
1
- {"version":3,"file":"discover_apps.js","sourceRoot":"","sources":["../../src/tools/discover_apps.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,gBAAgB,CAAC;AAW7D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,eAAe;IACrB,WAAW,EACT,oFAAoF;QACpF,wFAAwF;IAC1F,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,qBAAqB,CAAC,CAAC;YAE1D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA6B,CAAC;YAE5D,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,wDAAwD;yBAC/D;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG;gBACZ,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,iCAAiC;aAC3D,CAAC;YAEF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;gBAC3D,IAAI,GAAG,CAAC,WAAW;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACjD,IAAI,GAAG,CAAC,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvD,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YAED,KAAK,CAAC,IAAI,CACR,mFAAmF,CACpF,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aAC7D,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B,OAAO,EAAE;qBAC3C;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"discover_apps.js","sourceRoot":"","sources":["../../src/tools/discover_apps.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,gBAAgB,CAAC;AAW7D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,oFAAoF;QACpF,wFAAwF;IAC1F,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,qBAAqB,CAAC,CAAC;YAE1D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA6B,CAAC;YAE5D,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,wDAAwD;yBAC/D;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG;gBACZ,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,iCAAiC;aAC3D,CAAC;YAEF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;gBAC3D,IAAI,GAAG,CAAC,WAAW;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACjD,IAAI,GAAG,CAAC,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvD,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YAED,KAAK,CAAC,IAAI,CACR,qFAAqF,CACtF,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aAC7D,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B,OAAO,EAAE;qBAC3C;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ export declare const discoverProductsTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ app: z.ZodString;
7
+ };
8
+ handler: (args: {
9
+ app: string;
10
+ }) => Promise<{
11
+ content: {
12
+ type: "text";
13
+ text: string;
14
+ }[];
15
+ isError?: undefined;
16
+ } | {
17
+ content: {
18
+ type: "text";
19
+ text: string;
20
+ }[];
21
+ isError: boolean;
22
+ }>;
23
+ };
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ import { getAppProducts } from "../api-client.js";
3
+ function formatPrice(amountCents, currency) {
4
+ if (amountCents === null)
5
+ return "Custom pricing";
6
+ const amount = (amountCents / 100).toFixed(2);
7
+ return `${currency.toUpperCase()} $${amount}`;
8
+ }
9
+ function formatType(type, interval) {
10
+ if (type === "recurring" && interval)
11
+ return `${interval}ly subscription`;
12
+ return "one-time";
13
+ }
14
+ export const discoverProductsTool = {
15
+ name: "discover_products",
16
+ description: "List products and pricing available from an app. " +
17
+ "Returns the product catalog that the app has made visible to agents, " +
18
+ "including names, descriptions, prices, and billing types.",
19
+ inputSchema: {
20
+ app: z.string().describe("The app's service_name (e.g. 'my-app') or UUID"),
21
+ },
22
+ handler: async (args) => {
23
+ try {
24
+ const products = await getAppProducts(args.app);
25
+ if (products.length === 0) {
26
+ return {
27
+ content: [{
28
+ type: "text",
29
+ text: `No products found for "${args.app}". The app may not have any products configured, or none are visible to agents.`,
30
+ }],
31
+ };
32
+ }
33
+ const lines = products.map((p) => {
34
+ const price = formatPrice(p.amount_cents, p.currency);
35
+ const billing = formatType(p.type, p.interval);
36
+ const desc = p.description ? `\n ${p.description}` : "";
37
+ return `• **${p.name}** (id: ${p.id}) — ${price} (${billing})${desc}`;
38
+ });
39
+ return {
40
+ content: [{
41
+ type: "text",
42
+ text: `Products from "${args.app}":\n\n${lines.join("\n\n")}`,
43
+ }],
44
+ };
45
+ }
46
+ catch (err) {
47
+ const message = err instanceof Error ? err.message : String(err);
48
+ return {
49
+ content: [{ type: "text", text: `Error discovering products: ${message}` }],
50
+ isError: true,
51
+ };
52
+ }
53
+ },
54
+ };
55
+ //# sourceMappingURL=discover_products.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover_products.js","sourceRoot":"","sources":["../../src/tools/discover_products.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AAEnE,SAAS,WAAW,CAAC,WAA0B,EAAE,QAAgB;IAC/D,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,gBAAgB,CAAC;IAClD,MAAM,MAAM,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,QAAuB;IACvD,IAAI,IAAI,KAAK,WAAW,IAAI,QAAQ;QAAE,OAAO,GAAG,QAAQ,iBAAiB,CAAC;IAC1E,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,mDAAmD;QACnD,uEAAuE;QACvE,2DAA2D;IAC7D,WAAW,EAAE;QACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;KAC3E;IACD,OAAO,EAAE,KAAK,EAAE,IAAqB,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEhD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,0BAA0B,IAAI,CAAC,GAAG,iFAAiF;yBAC1H,CAAC;iBACH,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAa,EAAE,EAAE;gBAC3C,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACtD,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,OAAO,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,OAAO,KAAK,KAAK,OAAO,IAAI,IAAI,EAAE,CAAC;YACxE,CAAC,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,kBAAkB,IAAI,CAAC,GAAG,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;qBAC9D,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,+BAA+B,OAAO,EAAE,EAAE,CAAC;gBACpF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}