@trusty-squire/mcp 0.1.17 → 0.2.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/bin.js +2 -2
- package/dist/bin.js.map +1 -1
- package/dist/bot/agent.d.ts +7 -1
- package/dist/bot/agent.d.ts.map +1 -1
- package/dist/bot/agent.js +396 -39
- package/dist/bot/agent.js.map +1 -1
- package/dist/bot/browser.d.ts +15 -3
- package/dist/bot/browser.d.ts.map +1 -1
- package/dist/bot/browser.js +273 -56
- package/dist/bot/browser.js.map +1 -1
- package/dist/bot/google-login.d.ts +18 -0
- package/dist/bot/google-login.d.ts.map +1 -0
- package/dist/bot/google-login.js +379 -0
- package/dist/bot/google-login.js.map +1 -0
- package/dist/bot/index.d.ts +5 -0
- package/dist/bot/index.d.ts.map +1 -1
- package/dist/bot/index.js +14 -0
- package/dist/bot/index.js.map +1 -1
- package/dist/bot/llm-client.d.ts.map +1 -1
- package/dist/bot/llm-client.js +19 -12
- package/dist/bot/llm-client.js.map +1 -1
- package/dist/bot/oauth-lock.d.ts +2 -0
- package/dist/bot/oauth-lock.d.ts.map +1 -0
- package/dist/bot/oauth-lock.js +28 -0
- package/dist/bot/oauth-lock.js.map +1 -0
- package/dist/bot/oauth-providers.d.ts +16 -0
- package/dist/bot/oauth-providers.d.ts.map +1 -0
- package/dist/bot/oauth-providers.js +100 -0
- package/dist/bot/oauth-providers.js.map +1 -0
- package/dist/bot/oauth-thin-slice.d.ts +2 -0
- package/dist/bot/oauth-thin-slice.d.ts.map +1 -0
- package/dist/bot/oauth-thin-slice.js +203 -0
- package/dist/bot/oauth-thin-slice.js.map +1 -0
- package/dist/bot/profile.d.ts +2 -0
- package/dist/bot/profile.d.ts.map +1 -0
- package/dist/bot/profile.js +11 -0
- package/dist/bot/profile.js.map +1 -0
- package/dist/install/cli.d.ts +4 -1
- package/dist/install/cli.d.ts.map +1 -1
- package/dist/install/cli.js +41 -1
- package/dist/install/cli.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/provision-any.d.ts +50 -46
- package/dist/tools/provision-any.d.ts.map +1 -1
- package/dist/tools/provision-any.js +266 -107
- package/dist/tools/provision-any.js.map +1 -1
- package/package.json +3 -1
|
@@ -5,10 +5,15 @@
|
|
|
5
5
|
// pipeline (see apps/api/src/routes/ses-webhook.ts) can deliver
|
|
6
6
|
// verification emails.
|
|
7
7
|
//
|
|
8
|
+
// ASYNC MODEL: a real signup takes 3-8 minutes — well past the ~60s hard
|
|
9
|
+
// timeout Claude Code (and most MCP hosts) put on a single tool call. So
|
|
10
|
+
// `provision_any_service` does NOT block: it starts the run in the
|
|
11
|
+
// background inside this server process, returns a run_id immediately,
|
|
12
|
+
// and the caller polls `check_provision_status` until the run leaves the
|
|
13
|
+
// "running" state.
|
|
14
|
+
//
|
|
8
15
|
// Auth model: Tier 0 machine token from the session file. No account or
|
|
9
|
-
// mandate required for free-tier signups.
|
|
10
|
-
// the API returns a structured quota_exceeded response and we tell Claude
|
|
11
|
-
// to surface a pairing CTA.
|
|
16
|
+
// mandate required for free-tier signups.
|
|
12
17
|
import { randomBytes } from "crypto";
|
|
13
18
|
import { z } from "zod";
|
|
14
19
|
import { UniversalSignupBot, InboxClient, ProxyLLMClient, detectAsn, } from "../bot/index.js";
|
|
@@ -16,49 +21,90 @@ import { openSessionStorage } from "../session.js";
|
|
|
16
21
|
export const provisionAnyInputSchema = z.object({
|
|
17
22
|
service: z.string().describe("Name of the service to sign up for (e.g., 'Postmark', 'Mailgun')"),
|
|
18
23
|
signup_url: z.string().optional().describe("Direct URL to signup page (optional, will search if not provided)"),
|
|
24
|
+
oauth_provider: z
|
|
25
|
+
.enum(["google", "github"])
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("Prefer OAuth signup with this provider: if the page has a 'Sign in with Google/GitHub' button, sign up through it using the bot's saved session instead of filling a form. Requires a one-time `npx @trusty-squire/mcp login [--provider=github]` first."),
|
|
28
|
+
});
|
|
29
|
+
export const checkProvisionStatusInputSchema = z.object({
|
|
30
|
+
run_id: z.string().describe("The run_id returned by provision_any_service."),
|
|
19
31
|
});
|
|
20
32
|
// JSON Schema for MCP `tools/list`. The SDK forwards `inputSchema` verbatim
|
|
21
|
-
// to the host agent
|
|
22
|
-
//
|
|
23
|
-
// must mirror `provisionAnyInputSchema` above.
|
|
33
|
+
// to the host agent; a zod object stringifies to `{}` and leaves the LLM
|
|
34
|
+
// blind to required parameters, so these mirror the zod schemas above.
|
|
24
35
|
const PROVISION_ANY_JSON_SCHEMA = {
|
|
25
36
|
type: "object",
|
|
26
37
|
required: ["service"],
|
|
27
38
|
properties: {
|
|
28
39
|
service: {
|
|
29
40
|
type: "string",
|
|
30
|
-
description: "Name of the service to sign up for (e.g., 'Postmark', 'Mailgun', 'IPInfo')",
|
|
41
|
+
description: "Name of the service to sign up for (e.g., 'Postmark', 'Mailgun', 'IPInfo').",
|
|
31
42
|
},
|
|
32
43
|
signup_url: {
|
|
33
44
|
type: "string",
|
|
34
45
|
description: "Direct URL to the service's signup page. Optional — the bot will navigate from the service name if omitted.",
|
|
35
46
|
},
|
|
47
|
+
oauth_provider: {
|
|
48
|
+
type: "string",
|
|
49
|
+
enum: ["google", "github"],
|
|
50
|
+
description: "Prefer OAuth signup with this provider. When set and the page has a matching 'Sign in with Google/GitHub' affordance, the bot signs up through it (using the session established by `npx @trusty-squire/mcp login [--provider=github]`) instead of filling a form.",
|
|
51
|
+
},
|
|
36
52
|
},
|
|
37
53
|
};
|
|
38
|
-
const
|
|
54
|
+
const CHECK_STATUS_JSON_SCHEMA = {
|
|
55
|
+
type: "object",
|
|
56
|
+
required: ["run_id"],
|
|
57
|
+
properties: {
|
|
58
|
+
run_id: {
|
|
59
|
+
type: "string",
|
|
60
|
+
description: "The run_id returned by provision_any_service.",
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
const runStore = new Map();
|
|
65
|
+
// Cap so a long session cannot leak memory; oldest run evicted first.
|
|
66
|
+
const MAX_RUNS = 50;
|
|
67
|
+
const PROVISION_DESCRIPTION = `Start signing up for any free API service using browser automation.
|
|
68
|
+
|
|
69
|
+
ASYNC — IMPORTANT: a signup takes several minutes, longer than a single
|
|
70
|
+
tool call may stay open. This tool does NOT wait for the signup. It
|
|
71
|
+
starts the run and returns immediately with a run_id and status="started".
|
|
72
|
+
You MUST then poll check_provision_status with that run_id (about once a
|
|
73
|
+
minute) until its status is no longer "running".
|
|
39
74
|
|
|
40
75
|
WHEN TO CALL THIS TOOL:
|
|
41
|
-
- The user wants an account for a service Trusty Squire
|
|
42
|
-
-
|
|
43
|
-
- Best for free-tier developer services with traditional email/password signup
|
|
76
|
+
- The user wants an account for a service Trusty Squire has no native adapter for.
|
|
77
|
+
- Best for free-tier developer services with email/password signup.
|
|
44
78
|
|
|
45
|
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
|
|
79
|
+
IMMEDIATE RESPONSES (no run started):
|
|
80
|
+
- status="started" + run_id → poll check_provision_status next.
|
|
81
|
+
- status="quota_exceeded" + cta_pair_url → tell the user to run \`npx @trusty-squire/mcp pair\`.
|
|
82
|
+
- status="not_installed" → Trusty Squire isn't installed; tell the user to run the installer.
|
|
83
|
+
- status="error" → could not reach the API to set up the signup.`;
|
|
84
|
+
const CHECK_DESCRIPTION = `Check the status of a signup started by provision_any_service.
|
|
51
85
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
- status="
|
|
57
|
-
|
|
58
|
-
- status="
|
|
86
|
+
Pass the run_id from provision_any_service. Poll about once a minute
|
|
87
|
+
until status is no longer "running".
|
|
88
|
+
|
|
89
|
+
RESPONSES:
|
|
90
|
+
- status="running" → still working; poll again in ~60s.
|
|
91
|
+
- status="success" + credentials → signup done; show the credentials to the user.
|
|
92
|
+
- status="verification_not_sent" → submitted, but the service sent no verification
|
|
93
|
+
email (anti-abuse withholding, or it needs manual signup).
|
|
94
|
+
- status="captcha_blocked" → the site uses a captcha the bot can't pass; manual signup.
|
|
95
|
+
- status="oauth_required" → the service only offers OAuth signup; manual signup.
|
|
96
|
+
- status="needs_login" → an OAuth signup needs the bot's one-time Google login;
|
|
97
|
+
tell the user to run \`npx @trusty-squire/mcp login\`, then retry.
|
|
98
|
+
- status="oauth_consent_needs_review" → the Google consent screen asked for more than
|
|
99
|
+
basic profile access; the user must complete the OAuth signup manually.
|
|
100
|
+
- status="onboarding_blocked" → signed in via Google, but the API key is behind a
|
|
101
|
+
billing/payment wall; the user must add a payment method.
|
|
102
|
+
- status="failed" → the form filled but yielded no credentials; show steps[].
|
|
103
|
+
- status="error" → the run crashed; show error.
|
|
104
|
+
- status="unknown_run" → no such run (it expired, or the MCP server restarted).`;
|
|
59
105
|
export const provisionAnyTool = {
|
|
60
106
|
name: "provision_any_service",
|
|
61
|
-
description:
|
|
107
|
+
description: PROVISION_DESCRIPTION,
|
|
62
108
|
jsonInputSchema: PROVISION_ANY_JSON_SCHEMA,
|
|
63
109
|
inputSchema: provisionAnyInputSchema,
|
|
64
110
|
handler: async (input, _api) => {
|
|
@@ -66,10 +112,6 @@ export const provisionAnyTool = {
|
|
|
66
112
|
const storage = await openSessionStorage();
|
|
67
113
|
const session = await storage.read();
|
|
68
114
|
if (session === null || session.machine_token === undefined) {
|
|
69
|
-
// Production users hit this when they've never run the install CLI.
|
|
70
|
-
// Local-dev users hit this if their session.json only has an
|
|
71
|
-
// agent_session_token (Tier 1 pair without a machine_token issued).
|
|
72
|
-
// Surface both paths so the agent can route the user correctly.
|
|
73
115
|
const hasPartialSession = session !== null && session.agent_session_token !== undefined;
|
|
74
116
|
return {
|
|
75
117
|
status: "not_installed",
|
|
@@ -79,15 +121,10 @@ export const provisionAnyTool = {
|
|
|
79
121
|
};
|
|
80
122
|
}
|
|
81
123
|
const apiBase = session.api_base_url;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
});
|
|
87
|
-
// Random suffix, not just a ms timestamp: two concurrent signups
|
|
88
|
-
// in the same millisecond would otherwise share a run_id — and,
|
|
89
|
-
// for the same service, the same inbox alias — and cross-read
|
|
90
|
-
// each other's verification email.
|
|
124
|
+
const inboxClient = new InboxClient({ baseUrl: apiBase, apiKey: session.machine_token });
|
|
125
|
+
// Random suffix, not just a ms timestamp: two concurrent signups in
|
|
126
|
+
// the same millisecond would otherwise share a run_id — and, for the
|
|
127
|
+
// same service, the same inbox alias.
|
|
91
128
|
const runId = `mcp-${Date.now().toString(36)}-${randomBytes(4).toString("hex")}`;
|
|
92
129
|
let alias;
|
|
93
130
|
try {
|
|
@@ -101,7 +138,7 @@ export const provisionAnyTool = {
|
|
|
101
138
|
}
|
|
102
139
|
catch (err) {
|
|
103
140
|
const message = err instanceof Error ? err.message : String(err);
|
|
104
|
-
// The createAlias error body
|
|
141
|
+
// The createAlias error body carries the structured payload; parse it back.
|
|
105
142
|
if (/quota_exceeded/.test(message)) {
|
|
106
143
|
const match = message.match(/\{.*\}/s);
|
|
107
144
|
if (match !== null) {
|
|
@@ -129,52 +166,101 @@ export const provisionAnyTool = {
|
|
|
129
166
|
message: `Couldn't reach Trusty Squire's API to set up an alias.`,
|
|
130
167
|
};
|
|
131
168
|
}
|
|
132
|
-
//
|
|
169
|
+
// Register the run, evicting the oldest if the store is full.
|
|
170
|
+
if (runStore.size >= MAX_RUNS) {
|
|
171
|
+
const oldest = runStore.keys().next().value;
|
|
172
|
+
if (oldest !== undefined)
|
|
173
|
+
runStore.delete(oldest);
|
|
174
|
+
}
|
|
175
|
+
runStore.set(runId, { service: input.service, startedAt: Date.now(), result: undefined });
|
|
176
|
+
// Start the signup in the background — do NOT await it. runSignupTask
|
|
177
|
+
// never rejects; it writes the final response into runStore, which
|
|
178
|
+
// check_provision_status then reads.
|
|
179
|
+
void runSignupTask(runId, input, {
|
|
180
|
+
apiBase,
|
|
181
|
+
machineToken: session.machine_token,
|
|
182
|
+
alias,
|
|
183
|
+
inboxClient,
|
|
184
|
+
});
|
|
185
|
+
return {
|
|
186
|
+
status: "started",
|
|
187
|
+
run_id: runId,
|
|
188
|
+
service: input.service,
|
|
189
|
+
message: `Signup for ${input.service} started in the background. ` +
|
|
190
|
+
`Poll check_provision_status with run_id="${runId}" about once a minute ` +
|
|
191
|
+
`until its status is no longer "running" (typically 3-6 minutes).`,
|
|
192
|
+
};
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
export const checkProvisionStatusTool = {
|
|
196
|
+
name: "check_provision_status",
|
|
197
|
+
description: CHECK_DESCRIPTION,
|
|
198
|
+
jsonInputSchema: CHECK_STATUS_JSON_SCHEMA,
|
|
199
|
+
inputSchema: checkProvisionStatusInputSchema,
|
|
200
|
+
handler: async (input, _api) => {
|
|
201
|
+
const record = runStore.get(input.run_id);
|
|
202
|
+
if (record === undefined) {
|
|
203
|
+
return {
|
|
204
|
+
status: "unknown_run",
|
|
205
|
+
run_id: input.run_id,
|
|
206
|
+
message: "No signup run with that run_id. It may have finished and been evicted, " +
|
|
207
|
+
"or the MCP server restarted since it started. Start a new provision_any_service run.",
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
if (record.result === undefined) {
|
|
211
|
+
return {
|
|
212
|
+
status: "running",
|
|
213
|
+
run_id: input.run_id,
|
|
214
|
+
service: record.service,
|
|
215
|
+
elapsed_seconds: Math.round((Date.now() - record.startedAt) / 1000),
|
|
216
|
+
message: "Signup still in progress. Poll again in about 60 seconds.",
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
return record.result;
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
// Runs the signup to completion and stores the final tool response in
|
|
223
|
+
// runStore. Never rejects — any throw is captured as an error result.
|
|
224
|
+
async function runSignupTask(runId, input, ctx) {
|
|
225
|
+
let response;
|
|
226
|
+
try {
|
|
133
227
|
// The user pays nothing for LLM calls — the operator's OpenRouter
|
|
134
|
-
// key handles them server-side, gated by the machine token's
|
|
135
|
-
//
|
|
136
|
-
// Sonnet is the parse-failure fallback.
|
|
228
|
+
// key handles them server-side, gated by the machine token's rolling
|
|
229
|
+
// rate limit. Cheap tier is primary; premium is the fallback.
|
|
137
230
|
const llmPair = {
|
|
138
231
|
primary: new ProxyLLMClient({
|
|
139
|
-
apiBaseUrl: apiBase,
|
|
140
|
-
machineToken:
|
|
232
|
+
apiBaseUrl: ctx.apiBase,
|
|
233
|
+
machineToken: ctx.machineToken,
|
|
141
234
|
tier: "cheap",
|
|
142
235
|
}),
|
|
143
236
|
premium: new ProxyLLMClient({
|
|
144
|
-
apiBaseUrl: apiBase,
|
|
145
|
-
machineToken:
|
|
237
|
+
apiBaseUrl: ctx.apiBase,
|
|
238
|
+
machineToken: ctx.machineToken,
|
|
146
239
|
tier: "premium",
|
|
147
240
|
}),
|
|
148
241
|
};
|
|
149
|
-
// Run the bot locally with this alias. Bot uses the inboxClient to long-
|
|
150
|
-
// poll the API for any verification emails that arrive via SES.
|
|
151
242
|
const bot = new UniversalSignupBot();
|
|
152
243
|
const result = await bot.signup({
|
|
153
244
|
service: input.service,
|
|
154
245
|
...(input.signup_url !== undefined ? { signupUrl: input.signup_url } : {}),
|
|
155
|
-
email: alias,
|
|
156
|
-
inbox: inboxClient,
|
|
246
|
+
email: ctx.alias,
|
|
247
|
+
inbox: ctx.inboxClient,
|
|
157
248
|
llm: llmPair,
|
|
249
|
+
// T6/T13: route through the provider's OAuth path when the
|
|
250
|
+
// caller asked for it (Google or GitHub).
|
|
251
|
+
...(input.oauth_provider !== undefined ? { oauthProvider: input.oauth_provider } : {}),
|
|
158
252
|
});
|
|
159
|
-
// Best-effort
|
|
160
|
-
//
|
|
253
|
+
// Best-effort alias cleanup. Failure is non-fatal — the alias
|
|
254
|
+
// TTL-expires anyway.
|
|
161
255
|
try {
|
|
162
|
-
await inboxClient.revokeAlias(alias);
|
|
256
|
+
await ctx.inboxClient.revokeAlias(ctx.alias);
|
|
163
257
|
}
|
|
164
258
|
catch {
|
|
165
259
|
// noop
|
|
166
260
|
}
|
|
167
|
-
//
|
|
168
|
-
// report it to the API for the analytics ledger. The result.captcha
|
|
169
|
-
// field is set by the agent's pre/post-submit/re-plan gates. We do
|
|
170
|
-
// a fresh asn lookup at event time rather than relying on the
|
|
171
|
-
// install-time one — users move networks, and "where was the
|
|
172
|
-
// machine when this happened" is the analytically interesting bit.
|
|
261
|
+
// Report any captcha encounter to the analytics ledger. Fire-and-forget.
|
|
173
262
|
if (result.captcha !== undefined) {
|
|
174
|
-
|
|
175
|
-
// affect what the user sees. Failures here are logged to stderr
|
|
176
|
-
// and otherwise ignored.
|
|
177
|
-
void postCaptchaEvent(apiBase, session.machine_token, {
|
|
263
|
+
void postCaptchaEvent(ctx.apiBase, ctx.machineToken, {
|
|
178
264
|
service: input.service,
|
|
179
265
|
captcha_kind: result.captcha.kind,
|
|
180
266
|
blocked: result.captcha.blocked,
|
|
@@ -184,54 +270,127 @@ export const provisionAnyTool = {
|
|
|
184
270
|
signup_succeeded: result.success,
|
|
185
271
|
});
|
|
186
272
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
message: `${input.service} blocked automated signup with a ${result.captcha.kind} captcha. ` +
|
|
208
|
-
`Tell the user to sign up manually at ${input.signup_url ?? `https://${input.service.toLowerCase()}.com`}.`,
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
// OAuth-only service: there is no email/password form to automate
|
|
212
|
-
// (F3 Issue 4). Surface it as its own status so the agent can tell
|
|
213
|
-
// the user plainly rather than reporting a generic failure.
|
|
214
|
-
if (result.error !== undefined && result.error.startsWith("oauth_required")) {
|
|
215
|
-
return {
|
|
216
|
-
status: "oauth_required",
|
|
217
|
-
service: input.service,
|
|
218
|
-
error: result.error,
|
|
219
|
-
steps: result.steps,
|
|
220
|
-
browser_channel: result.browser_channel ?? null,
|
|
221
|
-
message: `${input.service} only offers Google/GitHub (OAuth) signup — there is no email form the bot can fill. ` +
|
|
222
|
-
`Tell the user to sign up manually at ${input.signup_url ?? `https://${input.service.toLowerCase()}.com`}.`,
|
|
223
|
-
};
|
|
224
|
-
}
|
|
273
|
+
response = buildSignupResponse(input, result);
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
response = {
|
|
277
|
+
status: "error",
|
|
278
|
+
service: input.service,
|
|
279
|
+
error: err instanceof Error ? err.message : String(err),
|
|
280
|
+
message: `The signup run for ${input.service} crashed before completing.`,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
const record = runStore.get(runId);
|
|
284
|
+
if (record !== undefined)
|
|
285
|
+
record.result = response;
|
|
286
|
+
}
|
|
287
|
+
// Maps a finished SignupResult to the response the caller sees via
|
|
288
|
+
// check_provision_status. Mirrors the status set documented on the
|
|
289
|
+
// tools. Exported for unit testing — the error-prefix → status
|
|
290
|
+
// mapping is the load-bearing logic.
|
|
291
|
+
export function buildSignupResponse(input, result) {
|
|
292
|
+
if (result.success && result.credentials !== undefined) {
|
|
225
293
|
return {
|
|
226
|
-
status: "
|
|
294
|
+
status: "success",
|
|
227
295
|
service: input.service,
|
|
228
|
-
|
|
296
|
+
credentials: result.credentials,
|
|
229
297
|
steps: result.steps,
|
|
298
|
+
message: `Successfully signed up for ${input.service}. Credentials are in this response — show them to the user (or save to their .env).`,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
// Authoritative: the agent recorded a captcha encounter and marked it
|
|
302
|
+
// blocked → captcha_blocked.
|
|
303
|
+
if (result.captcha !== undefined && result.captcha.blocked) {
|
|
304
|
+
return {
|
|
305
|
+
status: "captcha_blocked",
|
|
306
|
+
service: input.service,
|
|
307
|
+
error: result.error ?? "Captcha challenge blocked automated signup.",
|
|
308
|
+
steps: result.steps,
|
|
309
|
+
captcha_kind: result.captcha.kind,
|
|
230
310
|
browser_channel: result.browser_channel ?? null,
|
|
231
|
-
message:
|
|
311
|
+
message: `${input.service} blocked automated signup with a ${result.captcha.kind} captcha. ` +
|
|
312
|
+
`Tell the user to sign up manually at ${input.signup_url ?? `https://${input.service.toLowerCase()}.com`}.`,
|
|
232
313
|
};
|
|
233
|
-
}
|
|
234
|
-
|
|
314
|
+
}
|
|
315
|
+
// OAuth-only service: no email/password form to automate.
|
|
316
|
+
if (result.error !== undefined && result.error.startsWith("oauth_required")) {
|
|
317
|
+
return {
|
|
318
|
+
status: "oauth_required",
|
|
319
|
+
service: input.service,
|
|
320
|
+
error: result.error,
|
|
321
|
+
steps: result.steps,
|
|
322
|
+
browser_channel: result.browser_channel ?? null,
|
|
323
|
+
message: `${input.service} only offers Google/GitHub (OAuth) signup — there is no email form the bot can fill. ` +
|
|
324
|
+
`Tell the user to sign up manually at ${input.signup_url ?? `https://${input.service.toLowerCase()}.com`}.`,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// T7/T10 — OAuth: the bot's Google session is missing/expired, or
|
|
328
|
+
// Google interrupted with a security challenge. The remedy for both
|
|
329
|
+
// is the one-time interactive login.
|
|
330
|
+
if (result.error !== undefined && result.error.startsWith("needs_login")) {
|
|
331
|
+
return {
|
|
332
|
+
status: "needs_login",
|
|
333
|
+
service: input.service,
|
|
334
|
+
error: result.error,
|
|
335
|
+
steps: result.steps,
|
|
336
|
+
browser_channel: result.browser_channel ?? null,
|
|
337
|
+
message: `The bot has no usable provider session for an OAuth signup. Tell the user to run ` +
|
|
338
|
+
`\`npx @trusty-squire/mcp login\` once (add \`--provider=github\` for a GitHub signup), ` +
|
|
339
|
+
`then retry provision_any_service with oauth_provider. The error field names the exact command.`,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
// T7/T10 — OAuth: the consent screen requested broader-than-basic
|
|
343
|
+
// scopes (or its scopes could not be read). The bot deliberately
|
|
344
|
+
// does not auto-approve — a human must review it.
|
|
345
|
+
if (result.error !== undefined && result.error.startsWith("oauth_consent_needs_review")) {
|
|
346
|
+
return {
|
|
347
|
+
status: "oauth_consent_needs_review",
|
|
348
|
+
service: input.service,
|
|
349
|
+
error: result.error,
|
|
350
|
+
steps: result.steps,
|
|
351
|
+
browser_channel: result.browser_channel ?? null,
|
|
352
|
+
message: `${input.service}'s Google consent screen needs human review (it asked for more than ` +
|
|
353
|
+
`basic profile access). Tell the user to complete the OAuth signup manually at ` +
|
|
354
|
+
`${input.signup_url ?? `https://${input.service.toLowerCase()}.com`}.`,
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
// T7/T10 — OAuth: signed in fine, but the API key sits behind a
|
|
358
|
+
// billing / payment-method wall the bot will not cross.
|
|
359
|
+
if (result.error !== undefined && result.error.startsWith("onboarding_blocked")) {
|
|
360
|
+
return {
|
|
361
|
+
status: "onboarding_blocked",
|
|
362
|
+
service: input.service,
|
|
363
|
+
error: result.error,
|
|
364
|
+
steps: result.steps,
|
|
365
|
+
browser_channel: result.browser_channel ?? null,
|
|
366
|
+
message: `${input.service} signed up via Google, but its API key is behind a billing/payment wall. ` +
|
|
367
|
+
`Tell the user to add a payment method at ` +
|
|
368
|
+
`${input.signup_url ?? `https://${input.service.toLowerCase()}.com`} to finish.`,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
// S3: the bot tags "form submitted but no verification email" with a
|
|
372
|
+
// verification_not_sent: error prefix. Surface it as its own status.
|
|
373
|
+
if (result.error !== undefined && result.error.startsWith("verification_not_sent")) {
|
|
374
|
+
return {
|
|
375
|
+
status: "verification_not_sent",
|
|
376
|
+
service: input.service,
|
|
377
|
+
error: result.error,
|
|
378
|
+
steps: result.steps,
|
|
379
|
+
browser_channel: result.browser_channel ?? null,
|
|
380
|
+
message: `${input.service}'s form submitted, but no verification email arrived — the service most likely ` +
|
|
381
|
+
`withheld it (anti-abuse) or needs manual signup. Tell the user to finish at ` +
|
|
382
|
+
`${input.signup_url ?? `https://${input.service.toLowerCase()}.com`}.`,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
return {
|
|
386
|
+
status: "failed",
|
|
387
|
+
service: input.service,
|
|
388
|
+
error: result.error ?? "Unknown error",
|
|
389
|
+
steps: result.steps,
|
|
390
|
+
browser_channel: result.browser_channel ?? null,
|
|
391
|
+
message: `Couldn't finish signing up for ${input.service}. Show the user the steps[] for debugging.`,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
235
394
|
// Best-effort POST to /v1/captcha-events. We don't care about the
|
|
236
395
|
// response — at worst the event is lost, which is no worse than the
|
|
237
396
|
// pre-instrumentation state. Captures fresh asn at event time when
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provision-any.js","sourceRoot":"","sources":["../../src/tools/provision-any.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"provision-any.js","sourceRoot":"","sources":["../../src/tools/provision-any.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trusty-squire/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Local MCP server vibe coding agents install. Thin relay to the Trusty Squire API, with the bundled universal signup bot.",
|
|
6
6
|
"main": "./dist/server.js",
|
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
22
22
|
"open": "^10.1.0",
|
|
23
23
|
"playwright": "^1.49.0",
|
|
24
|
+
"playwright-extra": "^4.3.6",
|
|
25
|
+
"puppeteer-extra-plugin-stealth": "^2.11.2",
|
|
24
26
|
"yaml": "^2.6.1",
|
|
25
27
|
"zod": "^3.23.8"
|
|
26
28
|
},
|