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.
- package/README.md +29 -40
- package/dist/api-client.d.ts +12 -1
- package/dist/api-client.js +16 -2
- package/dist/api-client.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/init.js +110 -9
- package/dist/init.js.map +1 -1
- package/dist/server.js +171 -138
- package/dist/server.js.map +1 -1
- package/dist/tools/add_agent_signup.d.ts +23 -0
- package/dist/tools/add_agent_signup.js +60 -0
- package/dist/tools/add_agent_signup.js.map +1 -0
- package/dist/tools/authenticate.js +1 -1
- package/dist/tools/authenticate.js.map +1 -1
- package/dist/tools/check_charge_status.js +1 -1
- package/dist/tools/check_charge_status.js.map +1 -1
- package/dist/tools/check_request_status.js +1 -1
- package/dist/tools/check_request_status.js.map +1 -1
- package/dist/tools/connect_stripe.js +10 -4
- package/dist/tools/connect_stripe.js.map +1 -1
- package/dist/tools/create_charge.d.ts +2 -0
- package/dist/tools/create_charge.js +76 -18
- package/dist/tools/create_charge.js.map +1 -1
- package/dist/tools/discover_api.js +16 -14
- package/dist/tools/discover_api.js.map +1 -1
- package/dist/tools/discover_apps.js +2 -2
- package/dist/tools/discover_apps.js.map +1 -1
- package/dist/tools/discover_products.d.ts +23 -0
- package/dist/tools/discover_products.js +55 -0
- package/dist/tools/discover_products.js.map +1 -0
- package/dist/tools/get_started.js +125 -54
- package/dist/tools/get_started.js.map +1 -1
- package/dist/tools/initiate_oauth.js +7 -3
- package/dist/tools/initiate_oauth.js.map +1 -1
- package/dist/tools/provision_user.js +1 -1
- package/dist/tools/provision_user.js.map +1 -1
- package/dist/tools/read_skill.js +2 -2
- package/dist/tools/read_skill.js.map +1 -1
- package/dist/tools/register_app.js +96 -10
- package/dist/tools/register_app.js.map +1 -1
- package/dist/tools/request_user_data.js +2 -2
- package/dist/tools/request_user_data.js.map +1 -1
- package/dist/tools/request_virtual_card.js +67 -7
- package/dist/tools/request_virtual_card.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# tru MCP Server
|
|
2
2
|
|
|
3
|
-
MCP server for [tru](https://tru
|
|
3
|
+
MCP server for [tru](https://tru.so) — auth and billing API in one. Verify identity, charge users, issue virtual cards, and get risk signals on every user. Payments flow to your existing Stripe account.
|
|
4
4
|
|
|
5
5
|
## Quick Setup
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ npx tru-mcp init
|
|
|
10
10
|
|
|
11
11
|
No API key needed. This detects your MCP client (Claude Code, Claude Desktop, Cursor) and writes the config automatically. Then tell your agent:
|
|
12
12
|
|
|
13
|
-
> "Run
|
|
13
|
+
> "Run dev_setup to set up tru"
|
|
14
14
|
|
|
15
15
|
Your agent will register your app, get you an API key, connect Stripe, and discover your API — all in one conversation.
|
|
16
16
|
|
|
@@ -31,7 +31,7 @@ Add to your `.mcp.json` (Claude Code) or equivalent:
|
|
|
31
31
|
"command": "npx",
|
|
32
32
|
"args": ["-y", "tru-mcp"],
|
|
33
33
|
"env": {
|
|
34
|
-
"TRU_API_URL": "https://tru
|
|
34
|
+
"TRU_API_URL": "https://tru.so"
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -42,16 +42,16 @@ Add to your `.mcp.json` (Claude Code) or equivalent:
|
|
|
42
42
|
|
|
43
43
|
| Variable | Required | Description |
|
|
44
44
|
|----------|----------|-------------|
|
|
45
|
-
| `TRU_API_KEY` | No | Your tru API key (starts with `tru_ak_`). Not needed for initial setup — `
|
|
46
|
-
| `TRU_API_URL` | No | tru server URL (default: `https://tru
|
|
45
|
+
| `TRU_API_KEY` | No | Your tru API key (starts with `tru_ak_`). Not needed for initial setup — `dev_register_app` will create one. |
|
|
46
|
+
| `TRU_API_URL` | No | tru server URL (default: `https://tru.so`) |
|
|
47
47
|
|
|
48
48
|
## Getting Started
|
|
49
49
|
|
|
50
50
|
The MCP tools walk you through setup step by step:
|
|
51
51
|
|
|
52
|
-
1. **`
|
|
53
|
-
2. **`
|
|
54
|
-
3. **`
|
|
52
|
+
1. **`dev_setup`** — Full guide: what tru is, why it matters, risk signals, setup walkthrough
|
|
53
|
+
2. **`dev_register_app`** — Create your app, get an API key
|
|
54
|
+
3. **`dev_connect_stripe`** — Link your Stripe account to receive payments
|
|
55
55
|
|
|
56
56
|
After that, you're live. All the tools below work immediately.
|
|
57
57
|
|
|
@@ -59,25 +59,20 @@ After that, you're live. All the tools below work immediately.
|
|
|
59
59
|
|
|
60
60
|
| Tool | Description |
|
|
61
61
|
|------|-------------|
|
|
62
|
-
| **
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
|
|
|
68
|
-
| `
|
|
69
|
-
|
|
|
70
|
-
| `
|
|
71
|
-
|
|
|
72
|
-
| `
|
|
73
|
-
| `
|
|
74
|
-
| `
|
|
75
|
-
|
|
|
76
|
-
| `provision_user` | Auto-create a user account on a third-party app |
|
|
77
|
-
| **Discovery** | |
|
|
78
|
-
| `discover_apps` | Browse registered apps on the tru platform |
|
|
79
|
-
| `read_skill` | Read an app's agent skill guide |
|
|
80
|
-
| `initiate_oauth` | Start an OAuth login flow with a tru-registered app |
|
|
62
|
+
| **User Tools** | |
|
|
63
|
+
| `login` | Authenticate a user with tru |
|
|
64
|
+
| `pay` | Create a direct charge or subscription |
|
|
65
|
+
| `check_payment_status` | Check the status of a charge request |
|
|
66
|
+
| `get_card` | Issue a single-use virtual card for agent purchases |
|
|
67
|
+
| `browse_apps` | Browse registered apps on the tru platform |
|
|
68
|
+
| `lookup_skill` | Read an app's agent skill guide |
|
|
69
|
+
| **Developer Tools** | |
|
|
70
|
+
| `dev_setup` | Full setup guide — what tru is, how to integrate, risk signals explained |
|
|
71
|
+
| `dev_register_app` | Register a new app on tru and get an API key |
|
|
72
|
+
| `dev_connect_stripe` | Link your existing Stripe account to receive payments |
|
|
73
|
+
| `dev_configure_login` | Start an OAuth login flow with a tru-registered app |
|
|
74
|
+
| `dev_generate_skill` | Crawl your site and generate an agent skill (SKILL.md) |
|
|
75
|
+
| `dev_provision_user` | Auto-create a user account on a third-party app |
|
|
81
76
|
|
|
82
77
|
## Why tru?
|
|
83
78
|
|
|
@@ -91,15 +86,15 @@ After that, you're live. All the tools below work immediately.
|
|
|
91
86
|
```
|
|
92
87
|
Developer: I want to integrate tru into my app
|
|
93
88
|
|
|
94
|
-
Agent: →
|
|
89
|
+
Agent: → dev_setup()
|
|
95
90
|
Here's how tru works...
|
|
96
91
|
|
|
97
92
|
Agent: Let's register your app.
|
|
98
|
-
→
|
|
93
|
+
→ dev_register_app(service_name: "my-app", display_name: "My App", owner_email: "dev@example.com")
|
|
99
94
|
✓ App created — API key: tru_ak_...
|
|
100
95
|
|
|
101
96
|
Agent: Now let's connect your Stripe account.
|
|
102
|
-
→
|
|
97
|
+
→ dev_connect_stripe(service_name: "my-app")
|
|
103
98
|
Open this URL to authorize: https://connect.stripe.com/oauth/authorize?...
|
|
104
99
|
|
|
105
100
|
Agent: You're live. Charges approved by tru users will flow to your Stripe account.
|
|
@@ -110,10 +105,10 @@ Agent: You're live. Charges approved by tru users will flow to your Stripe accou
|
|
|
110
105
|
```
|
|
111
106
|
User: Sign me up for clayking
|
|
112
107
|
|
|
113
|
-
Agent: →
|
|
108
|
+
Agent: → login(email: "user@example.com")
|
|
114
109
|
✓ Verified — risk: low
|
|
115
110
|
|
|
116
|
-
Agent: →
|
|
111
|
+
Agent: → dev_provision_user(email: "user@example.com", service_name: "clayking")
|
|
117
112
|
✓ Provisioned — got API key and account ID
|
|
118
113
|
|
|
119
114
|
Agent: Now using clayking API on behalf of user...
|
|
@@ -124,16 +119,10 @@ Agent: Now using clayking API on behalf of user...
|
|
|
124
119
|
```
|
|
125
120
|
User: Sign me up for that new service
|
|
126
121
|
|
|
127
|
-
Agent: →
|
|
122
|
+
Agent: → login(email: "user@example.com")
|
|
128
123
|
✓ Verified — risk: low, score: 12, debit card, US
|
|
129
124
|
|
|
130
|
-
Agent: →
|
|
131
|
-
⏳ Pending — approve on your tru dashboard
|
|
132
|
-
|
|
133
|
-
Agent: → check_request_status(request_id: "req_abc123")
|
|
134
|
-
✓ Approved — got name and email
|
|
135
|
-
|
|
136
|
-
Agent: → create_charge(email: "user@example.com", amount_cents: 999, description: "Monthly plan")
|
|
125
|
+
Agent: → pay(email: "user@example.com", amount_cents: 999, description: "Monthly plan")
|
|
137
126
|
✓ Auto-approved by spending rules
|
|
138
127
|
```
|
|
139
128
|
|
package/dist/api-client.d.ts
CHANGED
|
@@ -41,7 +41,7 @@ export interface ChargeResponse {
|
|
|
41
41
|
};
|
|
42
42
|
[key: string]: unknown;
|
|
43
43
|
}
|
|
44
|
-
export declare function createCharge(email: string, amountCents: number, description?: string, type?: string, interval?: string, currency?: string, paymentMode?: string, action?: string, appId?: string, sourceLabel?: string): Promise<ChargeResponse>;
|
|
44
|
+
export declare function createCharge(email: string, amountCents: number, description?: string, type?: string, interval?: string, currency?: string, paymentMode?: string, action?: string, appId?: string, sourceLabel?: string, productId?: string): Promise<ChargeResponse>;
|
|
45
45
|
export interface AgentCardResponse {
|
|
46
46
|
status: "issued" | "escalated";
|
|
47
47
|
charge_request_id: string;
|
|
@@ -90,6 +90,7 @@ export interface RegisterAppResponse {
|
|
|
90
90
|
status: string;
|
|
91
91
|
};
|
|
92
92
|
api_key: string;
|
|
93
|
+
app_secret: string;
|
|
93
94
|
}
|
|
94
95
|
export declare function registerApp(params: RegisterAppParams): Promise<RegisterAppResponse>;
|
|
95
96
|
export interface ChargeStatusResponse {
|
|
@@ -153,5 +154,15 @@ export declare function verifyAuth(token: string): Promise<{
|
|
|
153
154
|
email: string;
|
|
154
155
|
name: string;
|
|
155
156
|
}>;
|
|
157
|
+
export interface AppProduct {
|
|
158
|
+
id: string;
|
|
159
|
+
name: string;
|
|
160
|
+
description: string;
|
|
161
|
+
amount_cents: number | null;
|
|
162
|
+
currency: string;
|
|
163
|
+
type: string;
|
|
164
|
+
interval: string | null;
|
|
165
|
+
}
|
|
166
|
+
export declare function getAppProducts(appIdOrServiceName: string): Promise<AppProduct[]>;
|
|
156
167
|
export declare function registerAppAuthenticated(params: Omit<RegisterAppParams, "owner_email">, token: string): Promise<RegisterAppResponse>;
|
|
157
168
|
export {};
|
package/dist/api-client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const BASE_URL = process.env.TRU_API_URL || "https://tru.so";
|
|
2
|
-
// API key is read dynamically so
|
|
2
|
+
// API key is read dynamically so dev_register_app can set it at runtime
|
|
3
3
|
function getApiKey() {
|
|
4
4
|
return process.env.TRU_API_KEY || "";
|
|
5
5
|
}
|
|
@@ -35,7 +35,7 @@ export async function requestCredentials(email, service, fields) {
|
|
|
35
35
|
export async function getRequestStatus(id) {
|
|
36
36
|
return (await request(`/api/credentials/${encodeURIComponent(id)}`));
|
|
37
37
|
}
|
|
38
|
-
export async function createCharge(email, amountCents, description, type, interval, currency, paymentMode, action, appId, sourceLabel) {
|
|
38
|
+
export async function createCharge(email, amountCents, description, type, interval, currency, paymentMode, action, appId, sourceLabel, productId) {
|
|
39
39
|
return (await request("/api/billing/charges", {
|
|
40
40
|
method: "POST",
|
|
41
41
|
body: JSON.stringify({
|
|
@@ -49,6 +49,7 @@ export async function createCharge(email, amountCents, description, type, interv
|
|
|
49
49
|
action,
|
|
50
50
|
app_id: appId,
|
|
51
51
|
source_label: sourceLabel,
|
|
52
|
+
product_id: productId,
|
|
52
53
|
}),
|
|
53
54
|
}));
|
|
54
55
|
}
|
|
@@ -156,6 +157,19 @@ export async function verifyAuth(token) {
|
|
|
156
157
|
}
|
|
157
158
|
return res.json();
|
|
158
159
|
}
|
|
160
|
+
export async function getAppProducts(appIdOrServiceName) {
|
|
161
|
+
// If it looks like a UUID, use directly; otherwise resolve service name
|
|
162
|
+
const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(appIdOrServiceName);
|
|
163
|
+
let appId = appIdOrServiceName;
|
|
164
|
+
if (!isUuid) {
|
|
165
|
+
const lookup = await lookupAppByServiceName(appIdOrServiceName);
|
|
166
|
+
if (lookup.status !== 'registered' || !lookup.app) {
|
|
167
|
+
throw new Error(`App "${appIdOrServiceName}" not found`);
|
|
168
|
+
}
|
|
169
|
+
appId = lookup.app.id;
|
|
170
|
+
}
|
|
171
|
+
return (await request(`/api/apps/${encodeURIComponent(appId)}/products/agent`));
|
|
172
|
+
}
|
|
159
173
|
export async function registerAppAuthenticated(params, token) {
|
|
160
174
|
const url = `${BASE_URL}/api/apps`;
|
|
161
175
|
const res = await fetch(url, {
|
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,gBAAgB,CAAC;AAE7D,
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
if (process.argv[2] === "init") {
|
|
4
4
|
await import("./init.js");
|
|
5
5
|
}
|
|
6
|
+
else if (process.stdin.isTTY) {
|
|
7
|
+
// Running directly in a terminal — show help instead of hanging
|
|
8
|
+
console.log("\n tru MCP server\n");
|
|
9
|
+
console.log(" Usage:");
|
|
10
|
+
console.log(" npx tru-mcp init Set up .mcp.json for your MCP client");
|
|
11
|
+
console.log(" /tru:dev-setup Run inside Claude Code to start setup\n");
|
|
12
|
+
}
|
|
6
13
|
else {
|
|
7
14
|
const { run } = await import("./server.js");
|
|
8
15
|
await run();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,2CAA2C;AAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;IAC/B,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5B,CAAC;KAAM,CAAC;IACN,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAC5C,MAAM,GAAG,EAAE,CAAC;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,2CAA2C;AAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;IAC/B,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5B,CAAC;KAAM,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC/B,gEAAgE;IAChE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;AACnF,CAAC;KAAM,CAAC;IACN,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAC5C,MAAM,GAAG,EAAE,CAAC;AACd,CAAC"}
|
package/dist/init.js
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
import { readFile, writeFile, access, mkdir } from "node:fs/promises";
|
|
3
3
|
import { join, dirname } from "node:path";
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
|
+
import { createInterface } from "node:readline";
|
|
6
|
+
import { exec } from "node:child_process";
|
|
7
|
+
import { createMcpSession, pollMcpSession, verifyAuth } from "./api-client.js";
|
|
8
|
+
import { getStoredAuth, saveAuth } from "./config.js";
|
|
5
9
|
function detectTargets() {
|
|
6
10
|
const targets = [];
|
|
7
11
|
const cwd = process.cwd();
|
|
@@ -47,33 +51,56 @@ async function readJsonFile(p) {
|
|
|
47
51
|
return {};
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
|
-
function buildEntry(apiKey) {
|
|
54
|
+
function buildEntry(apiKey, apiUrl) {
|
|
51
55
|
const entry = {
|
|
52
56
|
command: "npx",
|
|
53
57
|
args: ["-y", "tru-mcp"],
|
|
54
58
|
};
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
59
|
+
const env = {};
|
|
60
|
+
if (apiKey)
|
|
61
|
+
env.TRU_API_KEY = apiKey;
|
|
62
|
+
if (apiUrl)
|
|
63
|
+
env.TRU_API_URL = apiUrl;
|
|
64
|
+
if (Object.keys(env).length > 0)
|
|
65
|
+
entry.env = env;
|
|
58
66
|
return entry;
|
|
59
67
|
}
|
|
60
68
|
function parseArgs() {
|
|
61
69
|
const args = process.argv.slice(2).filter((a) => a !== "init");
|
|
62
70
|
let key;
|
|
71
|
+
let url;
|
|
63
72
|
for (let i = 0; i < args.length; i++) {
|
|
64
73
|
if (args[i] === "--key" && args[i + 1]) {
|
|
65
74
|
key = args[i + 1];
|
|
66
75
|
i++;
|
|
67
76
|
}
|
|
77
|
+
else if (args[i] === "--url" && args[i + 1]) {
|
|
78
|
+
url = args[i + 1];
|
|
79
|
+
i++;
|
|
80
|
+
}
|
|
68
81
|
}
|
|
69
|
-
return { key };
|
|
82
|
+
return { key, url };
|
|
70
83
|
}
|
|
71
84
|
async function main() {
|
|
72
|
-
const { key } = parseArgs();
|
|
73
|
-
|
|
85
|
+
const { key, url } = parseArgs();
|
|
86
|
+
// Set TRU_API_URL so api-client uses the right server during init
|
|
87
|
+
if (url) {
|
|
88
|
+
process.env.TRU_API_URL = url;
|
|
89
|
+
}
|
|
90
|
+
console.log(`
|
|
91
|
+
tru — auth, billing, and identity for your app
|
|
92
|
+
|
|
93
|
+
tru lets your app verify users, charge them, and issue
|
|
94
|
+
virtual cards — all through one API. Users sign in with
|
|
95
|
+
Stripe Link (100M+ accounts), and agents discover your
|
|
96
|
+
app via a published SKILL.md.
|
|
97
|
+
|
|
98
|
+
This will configure the tru MCP server so your AI coding
|
|
99
|
+
agent can walk you through the full setup.
|
|
100
|
+
`);
|
|
74
101
|
const targets = detectTargets();
|
|
75
102
|
const written = [];
|
|
76
|
-
const entry = buildEntry(key);
|
|
103
|
+
const entry = buildEntry(key, url);
|
|
77
104
|
for (const t of targets) {
|
|
78
105
|
// Write to existing config files, or create .mcp.json for Claude Code
|
|
79
106
|
const exists = await fileExists(t.path);
|
|
@@ -93,10 +120,84 @@ async function main() {
|
|
|
93
120
|
console.log(JSON.stringify({ mcpServers: { tru: entry } }, null, 2) + "\n");
|
|
94
121
|
return;
|
|
95
122
|
}
|
|
123
|
+
console.log(" Configured:");
|
|
96
124
|
for (const name of written) {
|
|
97
125
|
console.log(` ✓ ${name}`);
|
|
98
126
|
}
|
|
99
|
-
console.log("
|
|
127
|
+
console.log("");
|
|
128
|
+
await authenticate();
|
|
129
|
+
console.log(`
|
|
130
|
+
Done! Restart your MCP client, then ask your agent:
|
|
131
|
+
|
|
132
|
+
"Get set up with tru"
|
|
133
|
+
|
|
134
|
+
Or use the slash command: /tru:dev-setup
|
|
135
|
+
`);
|
|
136
|
+
}
|
|
137
|
+
function openBrowser(url) {
|
|
138
|
+
const platform = process.platform;
|
|
139
|
+
const cmd = platform === "darwin" ? "open" :
|
|
140
|
+
platform === "win32" ? "start" :
|
|
141
|
+
"xdg-open";
|
|
142
|
+
exec(`${cmd} "${url}"`);
|
|
143
|
+
}
|
|
144
|
+
function sleep(ms) {
|
|
145
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
146
|
+
}
|
|
147
|
+
async function authenticate() {
|
|
148
|
+
// Check for existing valid auth
|
|
149
|
+
const stored = getStoredAuth();
|
|
150
|
+
if (stored) {
|
|
151
|
+
try {
|
|
152
|
+
const user = await verifyAuth(stored.token);
|
|
153
|
+
console.log(` ✓ Logged in as ${user.email}`);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Token expired or invalid, continue to prompt
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
161
|
+
console.log(" To register your app, you'll need a tru account.");
|
|
162
|
+
console.log(" This opens your browser to sign in with Stripe Link.\n");
|
|
163
|
+
const answer = await new Promise((resolve) => {
|
|
164
|
+
rl.question(" Sign in now? [Y/n] ", (ans) => {
|
|
165
|
+
rl.close();
|
|
166
|
+
resolve(ans.trim().toLowerCase());
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
if (answer === "n" || answer === "no") {
|
|
170
|
+
console.log(" Skipped. Run `login` tool later to authenticate.");
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
const session = await createMcpSession();
|
|
175
|
+
openBrowser(session.login_url);
|
|
176
|
+
console.log(" Waiting for browser login");
|
|
177
|
+
const maxAttempts = 150; // 5 min at 2s intervals
|
|
178
|
+
let attempts = 0;
|
|
179
|
+
while (attempts < maxAttempts) {
|
|
180
|
+
await sleep(2000);
|
|
181
|
+
attempts++;
|
|
182
|
+
process.stdout.write(".");
|
|
183
|
+
try {
|
|
184
|
+
const status = await pollMcpSession(session.code);
|
|
185
|
+
if (status.status === "complete" && status.token && status.user) {
|
|
186
|
+
saveAuth(status.token, status.user.email);
|
|
187
|
+
console.log(`\n ✓ Authenticated as ${status.user.email}`);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// Keep polling
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
console.log(`\n Timed out. Visit: ${session.login_url}`);
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
199
|
+
console.log(` Auth error: ${message}`);
|
|
200
|
+
}
|
|
100
201
|
}
|
|
101
202
|
main().catch((err) => {
|
|
102
203
|
console.error("Error:", err);
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|