create-company 1.0.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/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +569 -0
- package/dist/index.js.map +1 -0
- package/package.json +33 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// ─── Section 1: Imports ───────────────────────────────────────────────────────
|
|
3
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ErrorCode, McpError, } from "@modelcontextprotocol/sdk/types.js";
|
|
6
|
+
import { randomBytes, createHash } from "node:crypto";
|
|
7
|
+
import { createServer } from "node:http";
|
|
8
|
+
import { readFileSync, writeFileSync, mkdirSync, unlinkSync, existsSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { homedir } from "node:os";
|
|
11
|
+
import { exec } from "node:child_process";
|
|
12
|
+
// ─── Section 2: Constants + Helpers ───────────────────────────────────────────
|
|
13
|
+
const REMOTE_MCP_URL = process.env.LOVIE_MCP_URL ?? "https://lovie-mcp.vercel.app/mcp/mcp";
|
|
14
|
+
const REQUEST_TIMEOUT = 30_000;
|
|
15
|
+
const DEBUG = !!process.env.DEBUG;
|
|
16
|
+
/** Derive the base URL (without /mcp/mcp) for .well-known endpoints */
|
|
17
|
+
function getBaseUrl() {
|
|
18
|
+
return REMOTE_MCP_URL.replace(/\/mcp\/mcp\/?$/, "");
|
|
19
|
+
}
|
|
20
|
+
function log(...args) {
|
|
21
|
+
process.stderr.write(`[lovie-formation] ${args.join(" ")}\n`);
|
|
22
|
+
}
|
|
23
|
+
function debug(...args) {
|
|
24
|
+
if (DEBUG)
|
|
25
|
+
log("[debug]", ...args);
|
|
26
|
+
}
|
|
27
|
+
// ─── Section 3: Token Storage ─────────────────────────────────────────────────
|
|
28
|
+
const CONFIG_DIR = join(homedir(), ".config", "create-company");
|
|
29
|
+
const TOKEN_FILE = join(CONFIG_DIR, "auth.json");
|
|
30
|
+
function loadStoredAuth() {
|
|
31
|
+
try {
|
|
32
|
+
if (!existsSync(TOKEN_FILE))
|
|
33
|
+
return null;
|
|
34
|
+
const data = JSON.parse(readFileSync(TOKEN_FILE, "utf8"));
|
|
35
|
+
if (!data.access_token)
|
|
36
|
+
return null;
|
|
37
|
+
return data;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function saveAuth(auth) {
|
|
44
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
45
|
+
writeFileSync(TOKEN_FILE, JSON.stringify(auth, null, 2), { mode: 0o600 });
|
|
46
|
+
}
|
|
47
|
+
function clearAuth() {
|
|
48
|
+
try {
|
|
49
|
+
if (existsSync(TOKEN_FILE))
|
|
50
|
+
unlinkSync(TOKEN_FILE);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// ignore
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Get the best available bearer token: env var > stored OAuth token */
|
|
57
|
+
function getAccessToken() {
|
|
58
|
+
if (process.env.LOVIE_API_KEY)
|
|
59
|
+
return process.env.LOVIE_API_KEY;
|
|
60
|
+
const stored = loadStoredAuth();
|
|
61
|
+
return stored?.access_token ?? null;
|
|
62
|
+
}
|
|
63
|
+
// ─── Section 4: OAuth PKCE Helpers ────────────────────────────────────────────
|
|
64
|
+
function base64url(buffer) {
|
|
65
|
+
return buffer.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
66
|
+
}
|
|
67
|
+
function generateCodeVerifier() {
|
|
68
|
+
return base64url(randomBytes(32));
|
|
69
|
+
}
|
|
70
|
+
function generateCodeChallenge(verifier) {
|
|
71
|
+
return base64url(createHash("sha256").update(verifier).digest());
|
|
72
|
+
}
|
|
73
|
+
async function discoverOAuthMetadata() {
|
|
74
|
+
const url = `${getBaseUrl()}/.well-known/oauth-authorization-server`;
|
|
75
|
+
const res = await fetch(url);
|
|
76
|
+
if (!res.ok)
|
|
77
|
+
throw new Error(`Failed to fetch OAuth metadata: ${res.status}`);
|
|
78
|
+
return (await res.json());
|
|
79
|
+
}
|
|
80
|
+
async function registerDynamicClient(registrationEndpoint, redirectUri) {
|
|
81
|
+
const res = await fetch(registrationEndpoint, {
|
|
82
|
+
method: "POST",
|
|
83
|
+
headers: { "Content-Type": "application/json" },
|
|
84
|
+
body: JSON.stringify({
|
|
85
|
+
client_name: "Lovie CLI (create-company)",
|
|
86
|
+
redirect_uris: [redirectUri],
|
|
87
|
+
grant_types: ["authorization_code", "refresh_token"],
|
|
88
|
+
response_types: ["code"],
|
|
89
|
+
token_endpoint_auth_method: "none",
|
|
90
|
+
scope: "profile email",
|
|
91
|
+
}),
|
|
92
|
+
});
|
|
93
|
+
if (!res.ok) {
|
|
94
|
+
const text = await res.text().catch(() => "");
|
|
95
|
+
throw new Error(`Dynamic client registration failed (${res.status}): ${text}`);
|
|
96
|
+
}
|
|
97
|
+
return (await res.json());
|
|
98
|
+
}
|
|
99
|
+
function openBrowser(url) {
|
|
100
|
+
const platform = process.platform;
|
|
101
|
+
const cmd = platform === "darwin" ? "open" : platform === "win32" ? "start" : "xdg-open";
|
|
102
|
+
exec(`${cmd} "${url}"`, (err) => {
|
|
103
|
+
if (err) {
|
|
104
|
+
// If open fails, just print the URL — user can copy-paste
|
|
105
|
+
console.log(`\nOpen this URL in your browser:\n ${url}\n`);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// ─── Section 5: Login / Logout / Token Refresh ────────────────────────────────
|
|
110
|
+
async function refreshAccessToken(storedAuth, metadata) {
|
|
111
|
+
if (!storedAuth.refresh_token)
|
|
112
|
+
return false;
|
|
113
|
+
try {
|
|
114
|
+
const body = new URLSearchParams({
|
|
115
|
+
grant_type: "refresh_token",
|
|
116
|
+
refresh_token: storedAuth.refresh_token,
|
|
117
|
+
client_id: storedAuth.client_id,
|
|
118
|
+
});
|
|
119
|
+
const res = await fetch(metadata.token_endpoint, {
|
|
120
|
+
method: "POST",
|
|
121
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
122
|
+
body,
|
|
123
|
+
});
|
|
124
|
+
if (!res.ok)
|
|
125
|
+
return false;
|
|
126
|
+
const tokens = (await res.json());
|
|
127
|
+
saveAuth({
|
|
128
|
+
...storedAuth,
|
|
129
|
+
access_token: tokens.access_token,
|
|
130
|
+
refresh_token: tokens.refresh_token ?? storedAuth.refresh_token,
|
|
131
|
+
expires_at: tokens.expires_in
|
|
132
|
+
? Date.now() + tokens.expires_in * 1000
|
|
133
|
+
: undefined,
|
|
134
|
+
});
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function login() {
|
|
142
|
+
console.log("Logging in to Lovie...\n");
|
|
143
|
+
// 1. Discover OAuth endpoints
|
|
144
|
+
const metadata = await discoverOAuthMetadata();
|
|
145
|
+
debug("OAuth metadata:", JSON.stringify(metadata));
|
|
146
|
+
if (!metadata.registration_endpoint) {
|
|
147
|
+
throw new Error("OAuth server does not support dynamic client registration");
|
|
148
|
+
}
|
|
149
|
+
// 2. Generate PKCE pair
|
|
150
|
+
const codeVerifier = generateCodeVerifier();
|
|
151
|
+
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
152
|
+
// 3. Start local callback server
|
|
153
|
+
const { port, waitForCode, close } = await startCallbackServer();
|
|
154
|
+
const redirectUri = `http://127.0.0.1:${port}/callback`;
|
|
155
|
+
try {
|
|
156
|
+
// 4. Register dynamic client
|
|
157
|
+
console.log("Registering client...");
|
|
158
|
+
const client = await registerDynamicClient(metadata.registration_endpoint, redirectUri);
|
|
159
|
+
debug("Client registered:", client.client_id);
|
|
160
|
+
// 5. Build authorization URL
|
|
161
|
+
const authUrl = new URL(metadata.authorization_endpoint);
|
|
162
|
+
authUrl.searchParams.set("response_type", "code");
|
|
163
|
+
authUrl.searchParams.set("client_id", client.client_id);
|
|
164
|
+
authUrl.searchParams.set("redirect_uri", redirectUri);
|
|
165
|
+
authUrl.searchParams.set("code_challenge", codeChallenge);
|
|
166
|
+
authUrl.searchParams.set("code_challenge_method", "S256");
|
|
167
|
+
authUrl.searchParams.set("scope", "profile email");
|
|
168
|
+
// 6. Open browser
|
|
169
|
+
console.log("Opening browser for authentication...");
|
|
170
|
+
openBrowser(authUrl.toString());
|
|
171
|
+
console.log("Waiting for authentication...\n");
|
|
172
|
+
// 7. Wait for the callback with the auth code
|
|
173
|
+
const code = await waitForCode();
|
|
174
|
+
debug("Received auth code");
|
|
175
|
+
// 8. Exchange code for tokens
|
|
176
|
+
console.log("Exchanging code for token...");
|
|
177
|
+
const tokenBody = new URLSearchParams({
|
|
178
|
+
grant_type: "authorization_code",
|
|
179
|
+
code,
|
|
180
|
+
redirect_uri: redirectUri,
|
|
181
|
+
client_id: client.client_id,
|
|
182
|
+
code_verifier: codeVerifier,
|
|
183
|
+
});
|
|
184
|
+
const tokenRes = await fetch(metadata.token_endpoint, {
|
|
185
|
+
method: "POST",
|
|
186
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
187
|
+
body: tokenBody,
|
|
188
|
+
});
|
|
189
|
+
if (!tokenRes.ok) {
|
|
190
|
+
const errText = await tokenRes.text().catch(() => "");
|
|
191
|
+
throw new Error(`Token exchange failed (${tokenRes.status}): ${errText}`);
|
|
192
|
+
}
|
|
193
|
+
const tokens = (await tokenRes.json());
|
|
194
|
+
// 9. Store tokens
|
|
195
|
+
saveAuth({
|
|
196
|
+
access_token: tokens.access_token,
|
|
197
|
+
refresh_token: tokens.refresh_token,
|
|
198
|
+
token_type: tokens.token_type,
|
|
199
|
+
expires_at: tokens.expires_in
|
|
200
|
+
? Date.now() + tokens.expires_in * 1000
|
|
201
|
+
: undefined,
|
|
202
|
+
client_id: client.client_id,
|
|
203
|
+
client_secret: client.client_secret,
|
|
204
|
+
});
|
|
205
|
+
console.log("\nAuthenticated successfully!");
|
|
206
|
+
console.log(`Token stored in ${TOKEN_FILE}`);
|
|
207
|
+
console.log("\nYou can now use Lovie tools. Add to Claude Code with:\n claude mcp add lovie-formation npx create-company\n");
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
close();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function startCallbackServer() {
|
|
214
|
+
return new Promise((resolve, reject) => {
|
|
215
|
+
let resolveCode;
|
|
216
|
+
let rejectCode;
|
|
217
|
+
const codePromise = new Promise((res, rej) => {
|
|
218
|
+
resolveCode = res;
|
|
219
|
+
rejectCode = rej;
|
|
220
|
+
});
|
|
221
|
+
const server = createServer((req, res) => {
|
|
222
|
+
const url = new URL(req.url ?? "/", `http://127.0.0.1`);
|
|
223
|
+
if (url.pathname === "/callback") {
|
|
224
|
+
const code = url.searchParams.get("code");
|
|
225
|
+
const error = url.searchParams.get("error");
|
|
226
|
+
if (error) {
|
|
227
|
+
const desc = url.searchParams.get("error_description") ?? error;
|
|
228
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
229
|
+
res.end(`<html><body><h1>Authentication failed</h1><p>${desc}</p><p>You can close this tab.</p></body></html>`);
|
|
230
|
+
rejectCode(new Error(`OAuth error: ${desc}`));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (code) {
|
|
234
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
235
|
+
res.end(`<html><body><h1>Authenticated!</h1><p>You can close this tab and return to your terminal.</p></body></html>`);
|
|
236
|
+
resolveCode(code);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
res.writeHead(400, { "Content-Type": "text/plain" });
|
|
240
|
+
res.end("Missing code parameter");
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
res.writeHead(404);
|
|
244
|
+
res.end();
|
|
245
|
+
});
|
|
246
|
+
server.listen(0, "127.0.0.1", () => {
|
|
247
|
+
const addr = server.address();
|
|
248
|
+
if (!addr || typeof addr === "string") {
|
|
249
|
+
reject(new Error("Failed to start callback server"));
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
resolve({
|
|
253
|
+
port: addr.port,
|
|
254
|
+
waitForCode: () => codePromise,
|
|
255
|
+
close: () => server.close(),
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
server.on("error", reject);
|
|
259
|
+
// Timeout after 2 minutes
|
|
260
|
+
setTimeout(() => {
|
|
261
|
+
rejectCode(new Error("Authentication timed out (2 minutes)"));
|
|
262
|
+
server.close();
|
|
263
|
+
}, 120_000);
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
async function logout() {
|
|
267
|
+
clearAuth();
|
|
268
|
+
console.log("Logged out. Token cleared.");
|
|
269
|
+
}
|
|
270
|
+
async function showStatus() {
|
|
271
|
+
const stored = loadStoredAuth();
|
|
272
|
+
if (!stored) {
|
|
273
|
+
console.log("Not logged in. Run: npx create-company login");
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const expired = stored.expires_at && stored.expires_at < Date.now();
|
|
277
|
+
console.log(`Logged in (token ${expired ? "expired" : "active"})`);
|
|
278
|
+
console.log(`Token file: ${TOKEN_FILE}`);
|
|
279
|
+
if (expired && stored.refresh_token) {
|
|
280
|
+
console.log("Token expired — will auto-refresh on next use.");
|
|
281
|
+
}
|
|
282
|
+
else if (expired) {
|
|
283
|
+
console.log("Token expired — run: npx create-company login");
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// ─── Section 6: Session State ─────────────────────────────────────────────────
|
|
287
|
+
let sessionId = null;
|
|
288
|
+
let requestId = 1;
|
|
289
|
+
let discoveredTools = [];
|
|
290
|
+
let isReinitializing = false;
|
|
291
|
+
let cachedAccessToken = null;
|
|
292
|
+
function resolveAuthHeader() {
|
|
293
|
+
if (cachedAccessToken)
|
|
294
|
+
return cachedAccessToken;
|
|
295
|
+
cachedAccessToken = getAccessToken();
|
|
296
|
+
return cachedAccessToken;
|
|
297
|
+
}
|
|
298
|
+
// ─── Section 7: Core HTTP Transport ───────────────────────────────────────────
|
|
299
|
+
async function rpcCall(method, params) {
|
|
300
|
+
const id = requestId++;
|
|
301
|
+
const body = JSON.stringify({
|
|
302
|
+
jsonrpc: "2.0",
|
|
303
|
+
id,
|
|
304
|
+
method,
|
|
305
|
+
params: params ?? {},
|
|
306
|
+
});
|
|
307
|
+
const headers = {
|
|
308
|
+
"Content-Type": "application/json",
|
|
309
|
+
Accept: "application/json, text/event-stream",
|
|
310
|
+
};
|
|
311
|
+
const token = resolveAuthHeader();
|
|
312
|
+
if (token) {
|
|
313
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
314
|
+
}
|
|
315
|
+
if (sessionId) {
|
|
316
|
+
headers["Mcp-Session-Id"] = sessionId;
|
|
317
|
+
}
|
|
318
|
+
debug(`→ ${method}`, params ? JSON.stringify(params).slice(0, 200) : "");
|
|
319
|
+
const controller = new AbortController();
|
|
320
|
+
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);
|
|
321
|
+
let response;
|
|
322
|
+
try {
|
|
323
|
+
response = await fetch(REMOTE_MCP_URL, {
|
|
324
|
+
method: "POST",
|
|
325
|
+
headers,
|
|
326
|
+
body,
|
|
327
|
+
signal: controller.signal,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
clearTimeout(timeout);
|
|
332
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
333
|
+
throw new McpError(ErrorCode.InternalError, `HTTP request failed: ${msg}`);
|
|
334
|
+
}
|
|
335
|
+
finally {
|
|
336
|
+
clearTimeout(timeout);
|
|
337
|
+
}
|
|
338
|
+
// Capture session ID from response
|
|
339
|
+
const newSessionId = response.headers.get("mcp-session-id");
|
|
340
|
+
if (newSessionId) {
|
|
341
|
+
sessionId = newSessionId;
|
|
342
|
+
debug("Session ID:", sessionId);
|
|
343
|
+
}
|
|
344
|
+
// 401 → token expired, try refresh
|
|
345
|
+
if (response.status === 401 && !isReinitializing) {
|
|
346
|
+
const stored = loadStoredAuth();
|
|
347
|
+
if (stored?.refresh_token) {
|
|
348
|
+
debug("Got 401, attempting token refresh…");
|
|
349
|
+
const metadata = await discoverOAuthMetadata();
|
|
350
|
+
const refreshed = await refreshAccessToken(stored, metadata);
|
|
351
|
+
if (refreshed) {
|
|
352
|
+
cachedAccessToken = null; // force reload
|
|
353
|
+
return rpcCall(method, params);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// If refresh failed, surface the error
|
|
357
|
+
log("Authentication failed. Run: npx create-company login");
|
|
358
|
+
}
|
|
359
|
+
// 404 → session expired, reinitialize once
|
|
360
|
+
if (response.status === 404 && !isReinitializing) {
|
|
361
|
+
debug("Got 404, reinitializing session…");
|
|
362
|
+
await reinitializeSession();
|
|
363
|
+
return rpcCall(method, params);
|
|
364
|
+
}
|
|
365
|
+
if (!response.ok) {
|
|
366
|
+
const text = await response.text().catch(() => "");
|
|
367
|
+
throw new McpError(ErrorCode.InternalError, `Remote returned ${response.status}: ${text.slice(0, 300)}`);
|
|
368
|
+
}
|
|
369
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
370
|
+
let result;
|
|
371
|
+
if (contentType.includes("text/event-stream")) {
|
|
372
|
+
const text = await response.text();
|
|
373
|
+
result = parseSSEResponse(text);
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
const json = (await response.json());
|
|
377
|
+
if (json.error) {
|
|
378
|
+
const err = json.error;
|
|
379
|
+
throw new McpError(err.code ?? ErrorCode.InternalError, err.message ?? "Remote error");
|
|
380
|
+
}
|
|
381
|
+
result = json.result;
|
|
382
|
+
}
|
|
383
|
+
debug(`← ${method}`, JSON.stringify(result).slice(0, 200));
|
|
384
|
+
return result;
|
|
385
|
+
}
|
|
386
|
+
// ─── Section 8: SSE Parser ────────────────────────────────────────────────────
|
|
387
|
+
function parseSSEResponse(text) {
|
|
388
|
+
const lines = text.split("\n");
|
|
389
|
+
for (const line of lines) {
|
|
390
|
+
if (!line.startsWith("data:"))
|
|
391
|
+
continue;
|
|
392
|
+
const data = line.slice(5).trim();
|
|
393
|
+
if (!data || data === "[DONE]")
|
|
394
|
+
continue;
|
|
395
|
+
try {
|
|
396
|
+
const parsed = JSON.parse(data);
|
|
397
|
+
if (parsed.error) {
|
|
398
|
+
const err = parsed.error;
|
|
399
|
+
throw new McpError(err.code ?? ErrorCode.InternalError, err.message ?? "Remote SSE error");
|
|
400
|
+
}
|
|
401
|
+
if (parsed.result !== undefined) {
|
|
402
|
+
return parsed.result;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
catch (err) {
|
|
406
|
+
if (err instanceof McpError)
|
|
407
|
+
throw err;
|
|
408
|
+
debug("Skipping unparseable SSE line:", data.slice(0, 100));
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
throw new McpError(ErrorCode.InternalError, "No valid JSON-RPC result found in SSE response");
|
|
412
|
+
}
|
|
413
|
+
// ─── Section 9: Session (Re)initialization ────────────────────────────────────
|
|
414
|
+
async function reinitializeSession() {
|
|
415
|
+
isReinitializing = true;
|
|
416
|
+
try {
|
|
417
|
+
sessionId = null;
|
|
418
|
+
debug("Sending initialize…");
|
|
419
|
+
await rpcCall("initialize", {
|
|
420
|
+
protocolVersion: "2025-03-26",
|
|
421
|
+
capabilities: {},
|
|
422
|
+
clientInfo: {
|
|
423
|
+
name: "lovie-formation",
|
|
424
|
+
version: "1.0.0",
|
|
425
|
+
},
|
|
426
|
+
});
|
|
427
|
+
debug("Sending notifications/initialized…");
|
|
428
|
+
const notifHeaders = {
|
|
429
|
+
"Content-Type": "application/json",
|
|
430
|
+
};
|
|
431
|
+
const token = resolveAuthHeader();
|
|
432
|
+
if (token) {
|
|
433
|
+
notifHeaders["Authorization"] = `Bearer ${token}`;
|
|
434
|
+
}
|
|
435
|
+
if (sessionId) {
|
|
436
|
+
notifHeaders["Mcp-Session-Id"] = sessionId;
|
|
437
|
+
}
|
|
438
|
+
fetch(REMOTE_MCP_URL, {
|
|
439
|
+
method: "POST",
|
|
440
|
+
headers: notifHeaders,
|
|
441
|
+
body: JSON.stringify({
|
|
442
|
+
jsonrpc: "2.0",
|
|
443
|
+
method: "notifications/initialized",
|
|
444
|
+
}),
|
|
445
|
+
}).catch(() => { });
|
|
446
|
+
debug("Fetching tools/list…");
|
|
447
|
+
const toolsResult = (await rpcCall("tools/list"));
|
|
448
|
+
discoveredTools = toolsResult?.tools ?? [];
|
|
449
|
+
log(`Discovered ${discoveredTools.length} tools from remote`);
|
|
450
|
+
}
|
|
451
|
+
catch (err) {
|
|
452
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
453
|
+
log(`Warning: session init failed: ${msg}`);
|
|
454
|
+
discoveredTools = [];
|
|
455
|
+
}
|
|
456
|
+
finally {
|
|
457
|
+
isReinitializing = false;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
// ─── Section 10: Main (stdio MCP server) ─────────────────────────────────────
|
|
461
|
+
async function main() {
|
|
462
|
+
const token = resolveAuthHeader();
|
|
463
|
+
if (!token) {
|
|
464
|
+
log("Not authenticated. Run: npx create-company login");
|
|
465
|
+
log("Starting server with 0 tools (no auth token)...");
|
|
466
|
+
}
|
|
467
|
+
const server = new Server({
|
|
468
|
+
name: "lovie-formation",
|
|
469
|
+
version: "1.0.0",
|
|
470
|
+
}, {
|
|
471
|
+
capabilities: {
|
|
472
|
+
tools: {},
|
|
473
|
+
},
|
|
474
|
+
});
|
|
475
|
+
// Initialize remote session
|
|
476
|
+
try {
|
|
477
|
+
await reinitializeSession();
|
|
478
|
+
}
|
|
479
|
+
catch {
|
|
480
|
+
log("Warning: could not reach remote server, starting with 0 tools");
|
|
481
|
+
}
|
|
482
|
+
// Handler: tools/list
|
|
483
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
484
|
+
return { tools: discoveredTools };
|
|
485
|
+
});
|
|
486
|
+
// Handler: tools/call
|
|
487
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
488
|
+
const { name, arguments: args } = request.params;
|
|
489
|
+
try {
|
|
490
|
+
const result = (await rpcCall("tools/call", {
|
|
491
|
+
name,
|
|
492
|
+
arguments: args ?? {},
|
|
493
|
+
}));
|
|
494
|
+
if (result?.content && Array.isArray(result.content)) {
|
|
495
|
+
return {
|
|
496
|
+
content: result.content,
|
|
497
|
+
isError: result.isError ?? false,
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
return {
|
|
501
|
+
content: [
|
|
502
|
+
{
|
|
503
|
+
type: "text",
|
|
504
|
+
text: typeof result === "string"
|
|
505
|
+
? result
|
|
506
|
+
: JSON.stringify(result, null, 2),
|
|
507
|
+
},
|
|
508
|
+
],
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
catch (err) {
|
|
512
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
513
|
+
return {
|
|
514
|
+
content: [{ type: "text", text: `Error: ${msg}` }],
|
|
515
|
+
isError: true,
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
});
|
|
519
|
+
const transport = new StdioServerTransport();
|
|
520
|
+
await server.connect(transport);
|
|
521
|
+
log(`Server running — ${discoveredTools.length} tools available via stdio`);
|
|
522
|
+
}
|
|
523
|
+
// ─── Section 11: Entry Point ──────────────────────────────────────────────────
|
|
524
|
+
const command = process.argv[2];
|
|
525
|
+
process.on("uncaughtException", (err) => {
|
|
526
|
+
log("Uncaught exception:", err.message);
|
|
527
|
+
process.exit(1);
|
|
528
|
+
});
|
|
529
|
+
process.on("unhandledRejection", (reason) => {
|
|
530
|
+
log("Unhandled rejection:", String(reason));
|
|
531
|
+
process.exit(1);
|
|
532
|
+
});
|
|
533
|
+
if (command === "login") {
|
|
534
|
+
login().catch((err) => {
|
|
535
|
+
console.error("Login failed:", err instanceof Error ? err.message : String(err));
|
|
536
|
+
process.exit(1);
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
else if (command === "logout") {
|
|
540
|
+
logout().catch(() => process.exit(1));
|
|
541
|
+
}
|
|
542
|
+
else if (command === "status") {
|
|
543
|
+
showStatus().catch(() => process.exit(1));
|
|
544
|
+
}
|
|
545
|
+
else if (command === "help" || command === "--help" || command === "-h") {
|
|
546
|
+
console.log(`create-company — Lovie MCP stdio server
|
|
547
|
+
|
|
548
|
+
Usage:
|
|
549
|
+
npx create-company Start the MCP stdio server
|
|
550
|
+
npx create-company login Authenticate with Lovie (opens browser)
|
|
551
|
+
npx create-company logout Clear stored credentials
|
|
552
|
+
npx create-company status Check authentication status
|
|
553
|
+
|
|
554
|
+
Add to Claude Code:
|
|
555
|
+
claude mcp add lovie-formation npx create-company
|
|
556
|
+
|
|
557
|
+
Environment:
|
|
558
|
+
LOVIE_MCP_URL Remote MCP server URL (default: https://lovie-mcp.vercel.app/mcp/mcp)
|
|
559
|
+
LOVIE_API_KEY Bearer token (overrides stored OAuth token)
|
|
560
|
+
DEBUG Enable verbose logging`);
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
// Default: start MCP stdio server
|
|
564
|
+
main().catch((err) => {
|
|
565
|
+
log("Fatal:", err instanceof Error ? err.message : String(err));
|
|
566
|
+
process.exit(1);
|
|
567
|
+
});
|
|
568
|
+
}
|
|
569
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-company",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP stdio-to-HTTP proxy for Lovie company formation tools",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"create-company": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc && node -e \"const fs=require('fs'); const f='dist/index.js'; const c=fs.readFileSync(f,'utf8'); if(!c.startsWith('#!')) fs.writeFileSync(f,'#!/usr/bin/env node\\n'+c); fs.chmodSync(f,'755');\"",
|
|
14
|
+
"dev": "tsx src/index.ts",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"mcp",
|
|
19
|
+
"company-formation",
|
|
20
|
+
"lovie",
|
|
21
|
+
"ai-tools",
|
|
22
|
+
"stdio-proxy"
|
|
23
|
+
],
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@modelcontextprotocol/sdk": "^1.12.1"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^22.15.21",
|
|
30
|
+
"tsx": "^4.19.4",
|
|
31
|
+
"typescript": "^5.8.3"
|
|
32
|
+
}
|
|
33
|
+
}
|