substack-article-mcp 0.5.1 → 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 +84 -56
- package/dist/auth.d.ts +25 -2
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +78 -75
- package/dist/auth.js.map +1 -1
- package/dist/client.d.ts +45 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +247 -38
- package/dist/client.js.map +1 -1
- package/dist/index.js +94 -22
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +209 -30
- package/dist/server.js.map +1 -1
- package/dist/setup.d.ts +13 -9
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +27 -29
- package/dist/setup.js.map +1 -1
- package/package.json +2 -2
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -1,31 +1,35 @@
|
|
|
1
1
|
import { load } from "cheerio";
|
|
2
|
-
import { getCookieHeaders, loadAuth } from "./auth.js";
|
|
3
|
-
|
|
4
|
-
* Resolve which subdomain to use. Priority:
|
|
5
|
-
* 1. Explicit subdomain passed per-request (e.g. "platformer" to read someone else's newsletter)
|
|
6
|
-
* 2. SUBSTACK_SUBDOMAIN env var
|
|
7
|
-
* 3. Subdomain stored during login (your own newsletter)
|
|
8
|
-
*/
|
|
2
|
+
import { getCookieHeaders, getAuthGuidance, isAuthenticated, loadAuth } from "./auth.js";
|
|
3
|
+
const USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36";
|
|
9
4
|
function resolveBaseUrl(subdomain) {
|
|
10
5
|
const resolved = subdomain ||
|
|
11
6
|
process.env["SUBSTACK_SUBDOMAIN"] ||
|
|
12
7
|
loadAuth()?.subdomain;
|
|
13
8
|
if (!resolved) {
|
|
14
|
-
throw new Error("No subdomain specified.
|
|
9
|
+
throw new Error("No subdomain specified. Pass a subdomain parameter, set the SUBSTACK_SUBDOMAIN env var, or log in to set a default.");
|
|
15
10
|
}
|
|
16
11
|
return `https://${resolved}.substack.com`;
|
|
17
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Make an authenticated (or unauthenticated) GET request to a Substack API endpoint.
|
|
15
|
+
* Works without cookies for public content; includes cookies when available.
|
|
16
|
+
*/
|
|
18
17
|
async function apiGet(endpoint, subdomain) {
|
|
19
18
|
const url = `${resolveBaseUrl(subdomain)}${endpoint}`;
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
const cookies = getCookieHeaders();
|
|
20
|
+
const headers = {
|
|
21
|
+
Accept: "application/json",
|
|
22
|
+
"User-Agent": USER_AGENT,
|
|
23
|
+
};
|
|
24
|
+
if (cookies) {
|
|
25
|
+
headers["Cookie"] = cookies["Cookie"];
|
|
26
|
+
}
|
|
27
|
+
const res = await fetch(url, { headers });
|
|
27
28
|
if (res.status === 401 || res.status === 403) {
|
|
28
|
-
|
|
29
|
+
if (!isAuthenticated()) {
|
|
30
|
+
throw new Error(`This content requires authentication. ${getAuthGuidance()}`);
|
|
31
|
+
}
|
|
32
|
+
throw new Error(`Authentication failed (cookie may have expired). ${getAuthGuidance()}`);
|
|
29
33
|
}
|
|
30
34
|
if (!res.ok) {
|
|
31
35
|
const text = await res.text();
|
|
@@ -33,16 +37,17 @@ async function apiGet(endpoint, subdomain) {
|
|
|
33
37
|
}
|
|
34
38
|
return res.json();
|
|
35
39
|
}
|
|
36
|
-
/** Fetch article HTML page with auth and extract post body (fallback when API returns truncated paid content). */
|
|
37
40
|
async function fetchArticleBodyFromPage(slug, subdomain) {
|
|
38
41
|
const baseUrl = resolveBaseUrl(subdomain);
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
const cookies = getCookieHeaders();
|
|
43
|
+
const headers = {
|
|
44
|
+
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
45
|
+
"User-Agent": USER_AGENT,
|
|
46
|
+
};
|
|
47
|
+
if (cookies) {
|
|
48
|
+
headers["Cookie"] = cookies["Cookie"];
|
|
49
|
+
}
|
|
50
|
+
const res = await fetch(`${baseUrl}/p/${slug}`, { headers });
|
|
46
51
|
if (!res.ok)
|
|
47
52
|
return "";
|
|
48
53
|
const html = await res.text();
|
|
@@ -96,8 +101,43 @@ export async function listArticles(options) {
|
|
|
96
101
|
const data = (await apiGet(`/api/v1/archive?${params}`, subdomain));
|
|
97
102
|
return data.map(normalizePost);
|
|
98
103
|
}
|
|
104
|
+
function isNumericId(slugOrId) {
|
|
105
|
+
return /^\d+$/.test(slugOrId);
|
|
106
|
+
}
|
|
107
|
+
async function fetchPostById(id) {
|
|
108
|
+
const cookies = getCookieHeaders();
|
|
109
|
+
const headers = {
|
|
110
|
+
Accept: "application/json",
|
|
111
|
+
"User-Agent": USER_AGENT,
|
|
112
|
+
};
|
|
113
|
+
if (cookies) {
|
|
114
|
+
headers["Cookie"] = cookies["Cookie"];
|
|
115
|
+
}
|
|
116
|
+
const res = await fetch(`https://substack.com/api/v1/posts/by-id/${id}`, { headers });
|
|
117
|
+
if (res.status === 401 || res.status === 403) {
|
|
118
|
+
throw new Error(`Authentication failed. ${getAuthGuidance()}`);
|
|
119
|
+
}
|
|
120
|
+
if (!res.ok) {
|
|
121
|
+
const text = await res.text();
|
|
122
|
+
throw new Error(`Substack API error ${res.status}: ${text}`);
|
|
123
|
+
}
|
|
124
|
+
const json = (await res.json());
|
|
125
|
+
const post = json["post"];
|
|
126
|
+
const pub = json["publication"];
|
|
127
|
+
return { post, subdomain: pub?.["subdomain"] };
|
|
128
|
+
}
|
|
99
129
|
export async function getArticle(slugOrId, subdomain) {
|
|
100
|
-
|
|
130
|
+
let raw;
|
|
131
|
+
let resolvedSubdomain = subdomain;
|
|
132
|
+
if (isNumericId(slugOrId)) {
|
|
133
|
+
const result = await fetchPostById(slugOrId);
|
|
134
|
+
raw = result.post;
|
|
135
|
+
if (!resolvedSubdomain)
|
|
136
|
+
resolvedSubdomain = result.subdomain;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
raw = (await apiGet(`/api/v1/posts/${slugOrId}`, subdomain));
|
|
140
|
+
}
|
|
101
141
|
let bodyHtml = raw["body_html"] || "";
|
|
102
142
|
const truncatedBodyText = raw["truncated_body_text"];
|
|
103
143
|
const wordCount = raw["wordcount"];
|
|
@@ -107,9 +147,16 @@ export async function getArticle(slugOrId, subdomain) {
|
|
|
107
147
|
(truncatedBodyText != null && truncatedBodyText.length > 0) ||
|
|
108
148
|
(wordCount != null && wordCount > 200 && bodyHtml.length < wordCount * 5);
|
|
109
149
|
if (isPaid && likelyTruncated) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
150
|
+
if (isAuthenticated()) {
|
|
151
|
+
const fromPage = await fetchArticleBodyFromPage(slug, resolvedSubdomain);
|
|
152
|
+
if (fromPage.length > bodyHtml.length)
|
|
153
|
+
bodyHtml = fromPage;
|
|
154
|
+
}
|
|
155
|
+
if (!bodyHtml || bodyHtml.length < 200) {
|
|
156
|
+
bodyHtml = (bodyHtml || "") +
|
|
157
|
+
"\n\n<!-- This is a paid article. The content above may be truncated. " +
|
|
158
|
+
"Log in with a Substack account that has an active subscription to access the full article. -->";
|
|
159
|
+
}
|
|
113
160
|
}
|
|
114
161
|
return {
|
|
115
162
|
...normalizePost(raw),
|
|
@@ -132,25 +179,187 @@ function normalizeComment(raw) {
|
|
|
132
179
|
children: Array.isArray(childrenRaw) ? childrenRaw.map(normalizeComment) : [],
|
|
133
180
|
};
|
|
134
181
|
}
|
|
135
|
-
/**
|
|
136
|
-
* Fetch full comment tree for an article.
|
|
137
|
-
* The slug is resolved to a post ID first via the article detail endpoint.
|
|
138
|
-
*/
|
|
139
182
|
export async function getComments(slugOrId, subdomain) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
183
|
+
let postId;
|
|
184
|
+
let resolvedSubdomain = subdomain;
|
|
185
|
+
if (isNumericId(slugOrId)) {
|
|
186
|
+
postId = Number(slugOrId);
|
|
187
|
+
if (!resolvedSubdomain) {
|
|
188
|
+
const result = await fetchPostById(slugOrId);
|
|
189
|
+
resolvedSubdomain = result.subdomain;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const raw = (await apiGet(`/api/v1/posts/${slugOrId}`, subdomain));
|
|
194
|
+
postId = raw["id"];
|
|
195
|
+
if (!postId)
|
|
196
|
+
throw new Error(`Could not resolve post ID for "${slugOrId}"`);
|
|
197
|
+
}
|
|
145
198
|
const params = new URLSearchParams({
|
|
146
199
|
all_comments: "true",
|
|
147
200
|
sort: "best_first",
|
|
148
201
|
});
|
|
149
|
-
const data = (await apiGet(`/api/v1/post/${postId}/comments?${params}`,
|
|
202
|
+
const data = (await apiGet(`/api/v1/post/${postId}/comments?${params}`, resolvedSubdomain));
|
|
150
203
|
const commentsRaw = (data["comments"] ?? []);
|
|
151
204
|
return {
|
|
152
205
|
postId,
|
|
153
206
|
comments: commentsRaw.map(normalizeComment),
|
|
154
207
|
};
|
|
155
208
|
}
|
|
209
|
+
export async function listSubscriptions() {
|
|
210
|
+
if (!isAuthenticated()) {
|
|
211
|
+
throw new Error(`Listing subscriptions requires authentication. ${getAuthGuidance()}`);
|
|
212
|
+
}
|
|
213
|
+
const cookies = getCookieHeaders();
|
|
214
|
+
const headers = { ...cookies, Accept: "application/json" };
|
|
215
|
+
const res = await fetch("https://substack.com/api/v1/subscriptions?limit=500", { headers });
|
|
216
|
+
if (res.status === 401 || res.status === 403) {
|
|
217
|
+
throw new Error(`Authentication failed (cookie may have expired). ${getAuthGuidance()}`);
|
|
218
|
+
}
|
|
219
|
+
if (!res.ok)
|
|
220
|
+
throw new Error(`Substack API error ${res.status}`);
|
|
221
|
+
const json = (await res.json());
|
|
222
|
+
const subs = (json["subscriptions"] || []);
|
|
223
|
+
const pubs = (json["publications"] || []);
|
|
224
|
+
const pubMap = new Map();
|
|
225
|
+
for (const pub of pubs) {
|
|
226
|
+
pubMap.set(pub["id"], pub);
|
|
227
|
+
}
|
|
228
|
+
return subs
|
|
229
|
+
.map((sub) => {
|
|
230
|
+
const pubId = sub["publication_id"];
|
|
231
|
+
const pub = pubMap.get(pubId);
|
|
232
|
+
if (!pub)
|
|
233
|
+
return null;
|
|
234
|
+
const hasPaid = !!(sub["first_payment_at"]);
|
|
235
|
+
const isComp = sub["type"] === "comp";
|
|
236
|
+
const plan = hasPaid ? "paid" : isComp ? "comp" : "free";
|
|
237
|
+
return {
|
|
238
|
+
publicationId: pubId,
|
|
239
|
+
name: pub["name"] || "",
|
|
240
|
+
subdomain: pub["subdomain"] || "",
|
|
241
|
+
url: pub["base_url"] || `https://${pub["subdomain"]}.substack.com`,
|
|
242
|
+
authorName: pub["author_name"] || "",
|
|
243
|
+
plan,
|
|
244
|
+
isFavorite: sub["is_favorite"] || false,
|
|
245
|
+
createdAt: sub["created_at"] || "",
|
|
246
|
+
};
|
|
247
|
+
})
|
|
248
|
+
.filter((s) => s !== null && s.subdomain !== "");
|
|
249
|
+
}
|
|
250
|
+
export async function getInbox(pages = 1) {
|
|
251
|
+
if (!isAuthenticated()) {
|
|
252
|
+
throw new Error(`Accessing your inbox requires authentication. ${getAuthGuidance()}`);
|
|
253
|
+
}
|
|
254
|
+
const cookies = getCookieHeaders();
|
|
255
|
+
const headers = { ...cookies, Accept: "application/json" };
|
|
256
|
+
const allItems = [];
|
|
257
|
+
let cursor = null;
|
|
258
|
+
for (let page = 0; page < pages; page++) {
|
|
259
|
+
const params = new URLSearchParams({
|
|
260
|
+
inboxType: "inbox",
|
|
261
|
+
surface: "inbox_all",
|
|
262
|
+
limit: "20",
|
|
263
|
+
});
|
|
264
|
+
if (cursor)
|
|
265
|
+
params.set("cursor", cursor);
|
|
266
|
+
const res = await fetch(`https://substack.com/api/v1/inbox/top?${params}`, { headers });
|
|
267
|
+
if (res.status === 401 || res.status === 403) {
|
|
268
|
+
throw new Error(`Authentication failed (cookie may have expired). ${getAuthGuidance()}`);
|
|
269
|
+
}
|
|
270
|
+
if (!res.ok)
|
|
271
|
+
throw new Error(`Substack API error ${res.status}`);
|
|
272
|
+
const json = (await res.json());
|
|
273
|
+
const postItems = (json["post_items"] || json["posts"] || []);
|
|
274
|
+
const pubMap = new Map();
|
|
275
|
+
const pubs = (json["publications"] || []);
|
|
276
|
+
for (const pub of pubs) {
|
|
277
|
+
pubMap.set(pub["id"], pub);
|
|
278
|
+
}
|
|
279
|
+
for (const item of postItems) {
|
|
280
|
+
const post = (item["post"] || item);
|
|
281
|
+
const pubId = post["publication_id"];
|
|
282
|
+
let pub = post["publishedBylines"]
|
|
283
|
+
? undefined
|
|
284
|
+
: post["publication"];
|
|
285
|
+
if (!pub)
|
|
286
|
+
pub = pubMap.get(pubId);
|
|
287
|
+
const bylines = (post["publishedBylines"] || []);
|
|
288
|
+
allItems.push({
|
|
289
|
+
id: post["id"],
|
|
290
|
+
title: post["title"] || "",
|
|
291
|
+
slug: post["slug"] || "",
|
|
292
|
+
subtitle: post["subtitle"] || "",
|
|
293
|
+
publishedAt: post["post_date"] || "",
|
|
294
|
+
canonicalUrl: post["canonical_url"] || "",
|
|
295
|
+
audience: post["audience"] || "everyone",
|
|
296
|
+
publicationName: pub?.["name"] || "",
|
|
297
|
+
publicationSubdomain: pub?.["subdomain"] || "",
|
|
298
|
+
authorName: bylines[0]?.["name"] || pub?.["author_name"] || "",
|
|
299
|
+
likes: post["reaction_count"] || 0,
|
|
300
|
+
comments: post["comment_count"] || 0,
|
|
301
|
+
restacks: post["restacks"] || 0,
|
|
302
|
+
wordCount: post["wordcount"],
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
const nextCursor = json["cursor"];
|
|
306
|
+
if (!nextCursor || postItems.length === 0)
|
|
307
|
+
break;
|
|
308
|
+
cursor = nextCursor;
|
|
309
|
+
}
|
|
310
|
+
allItems.sort((a, b) => {
|
|
311
|
+
const dateA = a.publishedAt ? new Date(a.publishedAt).getTime() : 0;
|
|
312
|
+
const dateB = b.publishedAt ? new Date(b.publishedAt).getTime() : 0;
|
|
313
|
+
return dateB - dateA;
|
|
314
|
+
});
|
|
315
|
+
return allItems;
|
|
316
|
+
}
|
|
317
|
+
export async function getReaderFeed(limit = 20) {
|
|
318
|
+
if (!isAuthenticated()) {
|
|
319
|
+
throw new Error(`Accessing your reader feed requires authentication. ${getAuthGuidance()}`);
|
|
320
|
+
}
|
|
321
|
+
const apiLimit = Math.min(limit, 20);
|
|
322
|
+
const cookies = getCookieHeaders();
|
|
323
|
+
const headers = { ...cookies, Accept: "application/json" };
|
|
324
|
+
const res = await fetch(`https://substack.com/api/v1/reader/posts?limit=${apiLimit}`, { headers });
|
|
325
|
+
if (res.status === 401 || res.status === 403) {
|
|
326
|
+
throw new Error(`Authentication failed (cookie may have expired). ${getAuthGuidance()}`);
|
|
327
|
+
}
|
|
328
|
+
if (!res.ok)
|
|
329
|
+
throw new Error(`Substack API error ${res.status}`);
|
|
330
|
+
const json = (await res.json());
|
|
331
|
+
const posts = (json["posts"] || []);
|
|
332
|
+
const pubs = (json["publications"] || []);
|
|
333
|
+
const pubMap = new Map();
|
|
334
|
+
for (const pub of pubs) {
|
|
335
|
+
pubMap.set(pub["id"], pub);
|
|
336
|
+
}
|
|
337
|
+
const items = posts.map((post) => {
|
|
338
|
+
const pubId = post["publication_id"];
|
|
339
|
+
const pub = pubMap.get(pubId);
|
|
340
|
+
const bylines = (post["publishedBylines"] || []);
|
|
341
|
+
return {
|
|
342
|
+
id: post["id"],
|
|
343
|
+
title: post["title"] || "",
|
|
344
|
+
slug: post["slug"] || "",
|
|
345
|
+
subtitle: post["subtitle"] || "",
|
|
346
|
+
publishedAt: post["post_date"] || "",
|
|
347
|
+
canonicalUrl: post["canonical_url"] || "",
|
|
348
|
+
audience: post["audience"] || "everyone",
|
|
349
|
+
publicationName: pub?.["name"] || "",
|
|
350
|
+
publicationSubdomain: pub?.["subdomain"] || "",
|
|
351
|
+
authorName: bylines[0]?.["name"] || "",
|
|
352
|
+
likes: post["reaction_count"] || 0,
|
|
353
|
+
comments: post["comment_count"] || 0,
|
|
354
|
+
restacks: post["restacks"] || 0,
|
|
355
|
+
wordCount: post["wordcount"],
|
|
356
|
+
};
|
|
357
|
+
});
|
|
358
|
+
items.sort((a, b) => {
|
|
359
|
+
const dateA = a.publishedAt ? new Date(a.publishedAt).getTime() : 0;
|
|
360
|
+
const dateB = b.publishedAt ? new Date(b.publishedAt).getTime() : 0;
|
|
361
|
+
return dateB - dateA;
|
|
362
|
+
});
|
|
363
|
+
return items;
|
|
364
|
+
}
|
|
156
365
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,76 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { join, dirname } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
function getVersion() {
|
|
6
|
+
try {
|
|
7
|
+
const dir = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const pkgPath = join(dir, "..", "package.json");
|
|
9
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
10
|
+
return pkg.version;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return "0.7.0";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
2
16
|
const args = process.argv.slice(2);
|
|
3
17
|
const command = args[0];
|
|
4
18
|
async function main() {
|
|
19
|
+
// ─── install ────────────────────────────────────────────────
|
|
20
|
+
if (command === "install") {
|
|
21
|
+
const flag = args[1];
|
|
22
|
+
if (flag === "--cursor") {
|
|
23
|
+
console.log("Step 1/2: Logging in to Substack...\n");
|
|
24
|
+
const { runLogin } = await import("./auth.js");
|
|
25
|
+
await runLogin();
|
|
26
|
+
console.log("\nStep 2/2: Adding MCP to Cursor...\n");
|
|
27
|
+
const { addToConfig } = await import("./setup.js");
|
|
28
|
+
const { path, updated } = addToConfig("cursor");
|
|
29
|
+
if (updated) {
|
|
30
|
+
console.log(` Added to ${path}`);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.log(` Already configured in ${path}`);
|
|
34
|
+
}
|
|
35
|
+
console.log("\n✅ Done! Restart Cursor to start using the Substack MCP.");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (flag === "--claude-code") {
|
|
39
|
+
console.log("Step 1/2: Logging in to Substack...\n");
|
|
40
|
+
const { runLogin } = await import("./auth.js");
|
|
41
|
+
await runLogin();
|
|
42
|
+
console.log("\nStep 2/2: Adding MCP to Claude Code...\n");
|
|
43
|
+
const { addToClaudeCode } = await import("./setup.js");
|
|
44
|
+
const { success, output } = addToClaudeCode();
|
|
45
|
+
console.log(` ${output}`);
|
|
46
|
+
if (success) {
|
|
47
|
+
console.log("\n✅ Done! The Substack MCP is now available in Claude Code.");
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
console.log('\n⚠️ Could not add automatically. Run this manually:');
|
|
51
|
+
console.log(" claude mcp add -s user substack -- npx -y substack-article-mcp");
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// No flag or unknown flag — show install help
|
|
56
|
+
console.log(`
|
|
57
|
+
substack-article-mcp install — One-step setup
|
|
58
|
+
|
|
59
|
+
Choose your AI client:
|
|
60
|
+
|
|
61
|
+
npx -y substack-article-mcp install --cursor
|
|
62
|
+
Log in + add MCP to Cursor (restart Cursor afterward)
|
|
63
|
+
|
|
64
|
+
npx -y substack-article-mcp install --claude-code
|
|
65
|
+
Log in + add MCP to Claude Code
|
|
66
|
+
|
|
67
|
+
Claude Desktop:
|
|
68
|
+
Install the .mcpb extension from quickviralnotes.com/mcp-setup
|
|
69
|
+
Or download from the GitHub releases page.
|
|
70
|
+
`);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// ─── login ──────────────────────────────────────────────────
|
|
5
74
|
if (command === "login") {
|
|
6
75
|
const flag = args[1];
|
|
7
76
|
if (flag === "--check" || flag === "--status") {
|
|
@@ -9,20 +78,21 @@ async function main() {
|
|
|
9
78
|
const status = await checkAuthStatus();
|
|
10
79
|
if (status.authenticated) {
|
|
11
80
|
console.log("✅ Authenticated");
|
|
81
|
+
console.log(` Source: ${status.authSource || "unknown"}`);
|
|
12
82
|
console.log(` Cookie age: ${status.cookieAge}`);
|
|
13
83
|
console.log(` Subdomain: ${status.subdomain || process.env["SUBSTACK_SUBDOMAIN"] || "(not set)"}`);
|
|
14
84
|
}
|
|
15
85
|
else {
|
|
16
86
|
console.log("❌ Not authenticated");
|
|
17
|
-
console.log(' Run "substack-article-mcp login" to connect your account.');
|
|
87
|
+
console.log(' Run "npx -y substack-article-mcp login" to connect your account.');
|
|
18
88
|
}
|
|
19
89
|
return;
|
|
20
90
|
}
|
|
21
91
|
if (flag === "--manual") {
|
|
22
92
|
const cookieArg = args[2];
|
|
23
93
|
if (!cookieArg) {
|
|
24
|
-
console.error("Usage: substack-article-mcp login --manual <
|
|
25
|
-
console.error(
|
|
94
|
+
console.error("Usage: npx -y substack-article-mcp login --manual <cookie>");
|
|
95
|
+
console.error('\nTo get your cookie:\n1. Open Substack in Chrome\n2. DevTools (F12) → Application → Cookies → substack.com\n3. Copy either:\n - The value of "substack.sid"\n - OR the full Cookie header: "substack.sid=...; substack.lli=..."');
|
|
26
96
|
process.exit(1);
|
|
27
97
|
}
|
|
28
98
|
const { runManualLogin } = await import("./auth.js");
|
|
@@ -33,47 +103,49 @@ async function main() {
|
|
|
33
103
|
await runLogin();
|
|
34
104
|
return;
|
|
35
105
|
}
|
|
106
|
+
// ─── help / version ─────────────────────────────────────────
|
|
36
107
|
if (command === "--help" || command === "-h") {
|
|
37
108
|
printHelp();
|
|
38
109
|
return;
|
|
39
110
|
}
|
|
40
111
|
if (command === "--version" || command === "-v") {
|
|
41
|
-
console.log(
|
|
112
|
+
console.log(`substack-article-mcp v${getVersion()}`);
|
|
42
113
|
return;
|
|
43
114
|
}
|
|
44
|
-
// Default: start MCP server
|
|
115
|
+
// ─── Default: start MCP server ──────────────────────────────
|
|
45
116
|
const { startServer } = await import("./server.js");
|
|
46
117
|
await startServer();
|
|
47
118
|
}
|
|
48
119
|
function printHelp() {
|
|
120
|
+
const v = getVersion();
|
|
49
121
|
console.log(`
|
|
50
|
-
substack-article-mcp — Substack MCP Server (
|
|
51
|
-
|
|
52
|
-
SETUP (run once in your terminal)
|
|
53
|
-
npx -y substack-article-mcp login
|
|
122
|
+
substack-article-mcp — Substack MCP Server (v${v})
|
|
54
123
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
124
|
+
INSTALL (one-step setup for your AI client)
|
|
125
|
+
npx -y substack-article-mcp install --cursor Cursor
|
|
126
|
+
npx -y substack-article-mcp install --claude-code Claude Code
|
|
127
|
+
Claude Desktop: install the .mcpb extension
|
|
58
128
|
|
|
59
|
-
|
|
60
|
-
npx -y substack-article-mcp login
|
|
129
|
+
LOGIN (refresh credentials only, no client changes)
|
|
130
|
+
npx -y substack-article-mcp login Chrome login flow
|
|
131
|
+
npx -y substack-article-mcp login --manual <cookie> Paste cookie directly
|
|
132
|
+
npx -y substack-article-mcp login --check Check auth status
|
|
61
133
|
|
|
62
|
-
OTHER
|
|
63
|
-
npx -y substack-article-mcp
|
|
64
|
-
npx -y substack-article-mcp --help
|
|
134
|
+
OTHER
|
|
135
|
+
npx -y substack-article-mcp --version
|
|
136
|
+
npx -y substack-article-mcp --help
|
|
65
137
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
Cursor/Claude/Claude Code start the server automatically.
|
|
138
|
+
NOTE: Public articles work without logging in.
|
|
139
|
+
Log in to access paid articles, subscriptions, feed, and inbox.
|
|
69
140
|
|
|
70
|
-
MCP TOOLS (available inside your AI app
|
|
141
|
+
MCP TOOLS (available inside your AI app)
|
|
71
142
|
substack_auth_status list_articles get_article search_articles
|
|
143
|
+
get_comments list_subscriptions get_feed
|
|
144
|
+
get_inbox
|
|
72
145
|
`);
|
|
73
146
|
}
|
|
74
147
|
main().catch((error) => {
|
|
75
148
|
console.error("Fatal error:", error);
|
|
76
149
|
process.exit(1);
|
|
77
150
|
});
|
|
78
|
-
export {};
|
|
79
151
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAErB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9C,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;YAEvC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CACT,iBAAiB,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,WAAW,EAAE,CACxF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAghBA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAIjD"}
|