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 CHANGED
@@ -1,107 +1,135 @@
1
1
  # substack-article-mcp
2
2
 
3
- MCP server for Substack — access your articles (including paid/premium), notes, and engagement data from Cursor, Claude Desktop, Claude Code, or any MCP client.
3
+ MCP server for Substack — read articles, comments, feed, and subscriptions from Cursor, Claude Desktop, Claude Code, or any MCP client. Public content works without authentication; log in for premium/paywalled articles and personalized features.
4
4
 
5
5
  ---
6
6
 
7
7
  ## Quick Start
8
8
 
9
- ### Step 1: Log in (once)
9
+ Choose your AI client:
10
+
11
+ ### Cursor
12
+
13
+ One command — logs in and configures Cursor automatically:
10
14
 
11
15
  ```bash
12
- npx -y substack-article-mcp login
16
+ npx -y substack-article-mcp install --cursor
13
17
  ```
14
18
 
15
- A Chrome window opens where you enter your Substack email and password. **Your main Chrome stays open** — this is a separate, dedicated window that closes automatically after login.
19
+ Restart Cursor after installation.
16
20
 
17
- The tool saves your session cookie and detects your newsletter subdomain. At the end, it offers to add the MCP to Cursor for you.
21
+ ### Claude Code
18
22
 
19
- **Alternative (no window):** If you'd rather paste cookies from DevTools:
23
+ One command logs in and adds the MCP globally:
20
24
 
21
25
  ```bash
22
- npx -y substack-article-mcp login --manual 'substack.sid=PASTE_HERE; substack.lli=PASTE_HERE'
26
+ npx -y substack-article-mcp install --claude-code
23
27
  ```
24
28
 
25
- To get the values: DevTools (F12) → Application → Cookies → substack.com → copy `substack.sid` (and `substack.lli` for full paid-article access).
29
+ ### Claude Desktop
26
30
 
27
- ### Step 2: Add the MCP to your app (if you didn't during login)
31
+ Download the `.mcpb` extension from the [Releases page](https://github.com/jenny-ouyang/substack-article-mcp/releases) and double-click to install.
28
32
 
29
- **Cursor** edit `~/.cursor/mcp.json`:
33
+ **Optional:** After installing, go to Extensions > Substack Articles > Settings and paste your Substack cookie to unlock paid articles, subscriptions, and your feed. Leave it empty for public-only access.
30
34
 
31
- ```json
32
- {
33
- "mcpServers": {
34
- "substack": {
35
- "command": "npx",
36
- "args": ["-y", "substack-article-mcp"]
37
- }
38
- }
39
- }
40
- ```
35
+ ### Use it
41
36
 
42
- **Claude Desktop** (macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`): same format.
37
+ Ask from chat the app starts the server automatically:
43
38
 
44
- **Claude Code:**
39
+ - "List recent articles from platformer" *(public, no auth needed)*
40
+ - "Get the full content of article 184929446" *(works with numeric IDs)*
41
+ - "Show me the comments on this article"
42
+ - "Search platformer articles for 'antitrust'"
43
+ - "What newsletters do I subscribe to?" *(requires auth)*
44
+ - "Show me my reader feed" *(requires auth)*
45
45
 
46
- ```bash
47
- claude mcp add substack -- npx -y substack-article-mcp
48
- ```
46
+ ---
49
47
 
50
- Restart Cursor / Claude after changing config.
48
+ ## Authentication
51
49
 
52
- ### Step 3: Use it
50
+ **Authentication is optional.** Public tools (`list_articles`, `get_article`, `search_articles`, `get_comments`) work without any credentials as long as you specify a subdomain.
53
51
 
54
- Ask from chat — the app starts the server automatically:
52
+ Log in to unlock:
53
+ - Full paid/premium article content
54
+ - `list_subscriptions` — see all newsletters you follow
55
+ - `get_feed` — your personalized reader feed
56
+ - `get_inbox` — chronological inbox from all subscriptions
57
+ - Auto-detected default subdomain (so you don't need to specify one)
58
+
59
+ ### How auth works
55
60
 
56
- - "List my recent Substack articles"
57
- - "Get the full content of my article about [topic]"
58
- - "Search my articles for [keyword]"
59
- - "Show me the comments on my latest article"
60
- - "Get the article about AI tools from platformer" *(reads someone else's newsletter)*
61
+ The server checks for credentials in this priority order:
62
+
63
+ 1. **`SUBSTACK_COOKIE` environment variable** used by Claude Desktop's `.mcpb` extension (set automatically from the optional cookie field in settings)
64
+ 2. **`~/.substack-article-mcp/auth.json`** saved by the `login` or `install` command
65
+ 3. **No auth** public content only
66
+
67
+ ### Refreshing credentials
68
+
69
+ Substack cookies expire every few weeks. When tools start returning auth errors:
70
+
71
+ - **Cursor / Claude Code:** Run `npx -y substack-article-mcp login` in your terminal
72
+ - **Claude Desktop:** Go to Extensions > Substack Articles > Settings and paste a fresh cookie
73
+
74
+ ### Getting your cookie manually
75
+
76
+ 1. Open substack.com in Chrome and log in
77
+ 2. DevTools (F12) → Application → Cookies → substack.com
78
+ 3. Copy the value of `substack.sid` (and `substack.lli` for paid articles)
79
+ 4. Use as: `substack.sid=YOUR_VALUE; substack.lli=YOUR_LLI_VALUE`
61
80
 
62
81
  ---
63
82
 
64
- ## CLI commands
83
+ ## CLI Commands
65
84
 
66
- | Command | What it does |
85
+ | Command | Description |
67
86
  |---------|-------------|
68
- | `npx -y substack-article-mcp login` | Opens a Chrome window to log in. Saves your session. |
69
- | `npx -y substack-article-mcp login --manual '...'` | Paste cookies from DevTools (no new window). |
70
- | `npx -y substack-article-mcp login --check` | Check auth status and cookie age. |
71
- | `npx -y substack-article-mcp --help` | Show help. |
87
+ | `npx -y substack-article-mcp install --cursor` | Log in + add MCP to Cursor |
88
+ | `npx -y substack-article-mcp install --claude-code` | Log in + add MCP to Claude Code |
89
+ | `npx -y substack-article-mcp login` | Refresh credentials (Chrome login flow) |
90
+ | `npx -y substack-article-mcp login --manual '<cookie>'` | Paste cookies directly |
91
+ | `npx -y substack-article-mcp login --check` | Check auth status and cookie age |
92
+ | `npx -y substack-article-mcp --help` | Show help |
93
+ | `npx -y substack-article-mcp --version` | Show version |
72
94
 
73
- > **Do not** run `npx -y substack-article-mcp` with no arguments in your terminal. That starts the MCP stdio server and your terminal will look stuck. Cursor/Claude run it for you.
95
+ > **Do not** run `npx -y substack-article-mcp` with no arguments in your terminal. That starts the MCP stdio server and your terminal will appear stuck. Your AI client starts it automatically.
74
96
 
75
97
  ---
76
98
 
77
- ## MCP tools
99
+ ## MCP Tools
78
100
 
79
- | Tool | Description |
80
- |------|-------------|
81
- | `substack_auth_status` | Check if auth is valid, cookie age, subdomain. |
82
- | `list_articles` | List published articles (metadata, engagement, paid/free). |
83
- | `get_article` | Full article as markdown (includes premium content). |
84
- | `search_articles` | Search published articles by keyword. |
85
- | `get_comments` | Full comment tree every comment, reply, author name, reactions. |
101
+ | Tool | Auth Required | Description |
102
+ |------|:---:|-------------|
103
+ | `substack_auth_status` | No | Check auth status, cookie age, and get refresh guidance |
104
+ | `list_articles` | No* | List published articles with metadata and engagement stats |
105
+ | `get_article` | No* | Full article as markdown. Accepts slug or numeric post ID |
106
+ | `search_articles` | No* | Search articles by keyword |
107
+ | `get_comments` | No* | Full comment tree with replies and reactions |
108
+ | `list_subscriptions` | Yes | All newsletters you subscribe to (paid, comped, free) |
109
+ | `get_feed` | Yes | Personalized reader feed from subscribed newsletters |
110
+ | `get_inbox` | Yes | Chronological inbox with pagination |
86
111
 
87
- All content tools accept an optional `subdomain` parameter. This means you can read articles from **any** Substack newsletter you subscribe to, not just your own. For example, specify `subdomain: "platformer"` to read Platformer articles.
112
+ *\* Requires a `subdomain` parameter if not authenticated. Auth is needed for paid/premium content.*
88
113
 
89
- ---
114
+ All content tools accept an optional `subdomain` parameter to read any newsletter (e.g., `subdomain: "platformer"`).
90
115
 
91
- ## How auth works
116
+ `get_article` and `get_comments` also accept numeric post IDs (e.g., `184929446`). When using an ID, the publication is auto-detected.
117
+
118
+ ---
92
119
 
93
- 1. Run `login` once (and again when the session expires, typically every few weeks).
94
- 2. The tool saves `substack.sid`, `substack.lli` (for paid content), and your subdomain to `~/.substack-article-mcp/auth.json`.
95
- 3. The MCP server reads that file and sends cookies to Substack's API. No environment variables needed.
120
+ ## Privacy & Security
96
121
 
97
- **What about my main Chrome?** The `login` command uses a dedicated Chrome profile stored in `~/.substack-article-mcp/chrome-profile/`. This is completely separate from your regular Chrome it does not touch your tabs, extensions, or browsing data.
122
+ - The server runs **entirely on your local machine** as a subprocess of your AI client
123
+ - No cloud hosting, no intermediary servers
124
+ - Your credentials never leave your computer
125
+ - The `login` command uses a dedicated Chrome profile in `~/.substack-article-mcp/chrome-profile/` — completely separate from your regular Chrome
98
126
 
99
127
  ---
100
128
 
101
129
  ## Requirements
102
130
 
103
131
  - **Node.js** 18+
104
- - **Google Chrome** (for the `login` command only)
132
+ - **Google Chrome** (for the `login` / `install` commands only — not needed for Claude Desktop)
105
133
 
106
134
  ## Disclaimer
107
135
 
package/dist/auth.d.ts CHANGED
@@ -2,18 +2,41 @@ interface StoredAuth {
2
2
  substackSid: string;
3
3
  extractedAt: string;
4
4
  subdomain?: string;
5
- /** Real JWT for paid/subscriber context; if missing, we send "substack.lli=1" which can yield truncated paid content */
6
5
  substackLli?: string;
7
6
  }
8
7
  export declare function getAuthDir(): string;
8
+ export declare function getAuthFilePath(): string;
9
+ /**
10
+ * Parse a cookie string (env var or manual input) into sid and optional lli.
11
+ * Accepts formats:
12
+ * "substack.sid=VALUE; substack.lli=VALUE"
13
+ * "s%3A..." (raw sid value)
14
+ */
15
+ export declare function parseCookieInput(input: string): {
16
+ sid: string;
17
+ lli?: string;
18
+ };
19
+ /**
20
+ * Load auth from env var first, then auth.json file.
21
+ * Priority: SUBSTACK_COOKIE env var > auth.json
22
+ */
9
23
  export declare function loadAuth(): StoredAuth | null;
10
24
  export declare function saveAuth(sid: string, subdomain?: string, lli?: string): void;
11
- export declare function getCookieHeaders(): Record<string, string>;
25
+ /** Returns true if any auth source is available. */
26
+ export declare function isAuthenticated(): boolean;
27
+ /**
28
+ * Build cookie headers for Substack API requests.
29
+ * Returns null if no auth is available (instead of throwing).
30
+ */
31
+ export declare function getCookieHeaders(): Record<string, string> | null;
32
+ /** Auth guidance message tailored to the user's context. */
33
+ export declare function getAuthGuidance(): string;
12
34
  export declare function runLogin(): Promise<void>;
13
35
  export declare function runManualLogin(cookieArg: string): Promise<void>;
14
36
  export declare function validateStoredAuth(): Promise<boolean>;
15
37
  export declare function checkAuthStatus(): Promise<{
16
38
  authenticated: boolean;
39
+ authSource?: string;
17
40
  cookieAge?: string;
18
41
  subdomain?: string;
19
42
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAQA,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wHAAwH;IACxH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,wBAAgB,QAAQ,IAAI,UAAU,GAAG,IAAI,CAU5C;AAED,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,MAAM,GACX,IAAI,CASN;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBzD;AAyCD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAiG9C;AAwKD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBrE;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAsB3D;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAmBD"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAWA,UAAU,UAAU;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAiB7E;AAED;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,UAAU,GAAG,IAAI,CAuB5C;AAED,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,MAAM,GACX,IAAI,CASN;AAED,oDAAoD;AACpD,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAYhE;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,IAAI,MAAM,CAKxC;AAwCD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA0F9C;AAmHD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBrE;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAqB3D;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAuBD"}
package/dist/auth.js CHANGED
@@ -4,13 +4,61 @@ import { join } from "node:path";
4
4
  const AUTH_DIR = join(homedir(), ".substack-article-mcp");
5
5
  const AUTH_FILE = join(AUTH_DIR, "auth.json");
6
6
  const CHROME_PROFILE_DIR = join(AUTH_DIR, "chrome-profile");
7
+ 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";
7
8
  export function getAuthDir() {
8
9
  if (!existsSync(AUTH_DIR)) {
9
10
  mkdirSync(AUTH_DIR, { recursive: true });
10
11
  }
11
12
  return AUTH_DIR;
12
13
  }
14
+ export function getAuthFilePath() {
15
+ return AUTH_FILE;
16
+ }
17
+ /**
18
+ * Parse a cookie string (env var or manual input) into sid and optional lli.
19
+ * Accepts formats:
20
+ * "substack.sid=VALUE; substack.lli=VALUE"
21
+ * "s%3A..." (raw sid value)
22
+ */
23
+ export function parseCookieInput(input) {
24
+ const trimmed = input.trim();
25
+ if (trimmed.includes("=") && (trimmed.includes(";") || trimmed.includes("substack."))) {
26
+ const parts = trimmed.split(";").map((p) => p.trim());
27
+ let sid = "";
28
+ let lli;
29
+ for (const part of parts) {
30
+ const eq = part.indexOf("=");
31
+ if (eq === -1)
32
+ continue;
33
+ const name = part.slice(0, eq).trim();
34
+ const value = part.slice(eq + 1).trim();
35
+ if (name === "substack.sid")
36
+ sid = value;
37
+ if (name === "substack.lli" && value.length > 10)
38
+ lli = value;
39
+ }
40
+ if (sid)
41
+ return lli ? { sid, lli } : { sid };
42
+ }
43
+ return { sid: trimmed };
44
+ }
45
+ /**
46
+ * Load auth from env var first, then auth.json file.
47
+ * Priority: SUBSTACK_COOKIE env var > auth.json
48
+ */
13
49
  export function loadAuth() {
50
+ const envCookie = process.env["SUBSTACK_COOKIE"];
51
+ if (envCookie && envCookie.trim().length > 0) {
52
+ const { sid, lli } = parseCookieInput(envCookie);
53
+ if (sid && sid.length > 5) {
54
+ return {
55
+ substackSid: sid,
56
+ extractedAt: new Date().toISOString(),
57
+ subdomain: process.env["SUBSTACK_SUBDOMAIN"],
58
+ ...(lli ? { substackLli: lli } : {}),
59
+ };
60
+ }
61
+ }
14
62
  try {
15
63
  if (!existsSync(AUTH_FILE))
16
64
  return null;
@@ -34,19 +82,33 @@ export function saveAuth(sid, subdomain, lli) {
34
82
  };
35
83
  writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), "utf-8");
36
84
  }
85
+ /** Returns true if any auth source is available. */
86
+ export function isAuthenticated() {
87
+ return loadAuth() !== null;
88
+ }
89
+ /**
90
+ * Build cookie headers for Substack API requests.
91
+ * Returns null if no auth is available (instead of throwing).
92
+ */
37
93
  export function getCookieHeaders() {
38
94
  const auth = loadAuth();
39
- if (!auth) {
40
- throw new Error("Not authenticated. Run `substack-article-mcp login` first to connect your Substack account.");
41
- }
95
+ if (!auth)
96
+ return null;
42
97
  const lli = auth.substackLli && auth.substackLli.length > 10
43
98
  ? auth.substackLli
44
99
  : "1";
45
100
  return {
46
101
  Cookie: `substack.sid=${auth.substackSid}; substack.lli=${lli}`,
47
- "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
102
+ "User-Agent": USER_AGENT,
48
103
  };
49
104
  }
105
+ /** Auth guidance message tailored to the user's context. */
106
+ export function getAuthGuidance() {
107
+ if (process.env["SUBSTACK_COOKIE"] !== undefined) {
108
+ return "Your Substack cookie has expired or is invalid. Update it in your Claude Desktop extension settings (Extensions > Substack Articles).";
109
+ }
110
+ return 'Not authenticated. Run "npx -y substack-article-mcp login" in your terminal to connect your Substack account.';
111
+ }
50
112
  function findChrome() {
51
113
  const { platform } = process;
52
114
  const candidates = [];
@@ -73,7 +135,7 @@ export async function runLogin() {
73
135
  if (!chromePath) {
74
136
  console.error("Could not find Chrome/Chromium on your system.");
75
137
  console.error("Install Google Chrome and try again.");
76
- console.error("\nAlternative: run `substack-article-mcp login --manual` to paste your cookie directly.");
138
+ console.error('\nAlternative: run "substack-article-mcp login --manual" to paste your cookie directly.');
77
139
  process.exit(1);
78
140
  }
79
141
  console.log("Opening a Chrome window for Substack login...");
@@ -93,8 +155,6 @@ export async function runLogin() {
93
155
  });
94
156
  const pages = await browser.pages();
95
157
  const page = pages[0] || (await browser.newPage());
96
- // Clear any stale Substack cookies from a previous login session
97
- // so we don't accidentally grab an old cookie and close immediately.
98
158
  try {
99
159
  const client = await page.createCDPSession();
100
160
  const existing = (await client.send("Network.getAllCookies"));
@@ -107,7 +167,7 @@ export async function runLogin() {
107
167
  await client.detach();
108
168
  }
109
169
  catch {
110
- // Non-critical — the URL-based check in waitForSubstackCookies is our safety net
170
+ // Non-critical
111
171
  }
112
172
  await page.goto("https://substack.com/sign-in", {
113
173
  waitUntil: "networkidle2",
@@ -127,7 +187,6 @@ export async function runLogin() {
127
187
  process.exit(1);
128
188
  }
129
189
  console.log("Login detected! Extracting account info...");
130
- // Try to detect the user's own publication subdomain (best-effort, not required)
131
190
  let subdomain = await detectSubdomainFromPage(page);
132
191
  await browser.close();
133
192
  if (!subdomain) {
@@ -141,13 +200,10 @@ export async function runLogin() {
141
200
  }
142
201
  if (subdomain) {
143
202
  console.log(` Default newsletter: ${subdomain}.substack.com`);
144
- console.log(" (You can also read articles from any other Substack by specifying a subdomain.)");
145
203
  }
146
204
  else {
147
205
  console.log(" No default newsletter detected — specify a subdomain when listing or reading articles.");
148
206
  }
149
- console.log("\nYou can now use the Substack Article MCP in Cursor, Claude Code, or Claude Desktop.");
150
- await offerToAddMcp();
151
207
  }
152
208
  async function detectSubdomainFromPage(page) {
153
209
  const urlsToTry = [
@@ -176,7 +232,7 @@ async function detectSubdomainFromPage(page) {
176
232
  return match[1];
177
233
  }
178
234
  catch {
179
- // continue to next
235
+ // continue
180
236
  }
181
237
  }
182
238
  return null;
@@ -184,17 +240,13 @@ async function detectSubdomainFromPage(page) {
184
240
  function getCookieHeadersForSid(sid) {
185
241
  return {
186
242
  Cookie: `substack.sid=${sid}; substack.lli=1`,
187
- "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
243
+ "User-Agent": USER_AGENT,
188
244
  Accept: "application/json",
189
245
  };
190
246
  }
191
- /** Try Substack session/dashboard APIs with the cookie to get publication subdomain. */
192
247
  async function detectSubdomainFromApi(sid) {
193
248
  const headers = getCookieHeadersForSid(sid);
194
- const bases = [
195
- "https://substack.com/api/v1",
196
- "https://substack.com/api",
197
- ];
249
+ const bases = ["https://substack.com/api/v1", "https://substack.com/api"];
198
250
  const paths = ["/me", "/user", "/session", "/dashboard", "/user/me"];
199
251
  for (const base of bases) {
200
252
  for (const path of paths) {
@@ -227,35 +279,6 @@ async function detectSubdomainFromApi(sid) {
227
279
  }
228
280
  return null;
229
281
  }
230
- async function offerToAddMcp() {
231
- if (!process.stdin.isTTY)
232
- return;
233
- const readline = await import("node:readline");
234
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
235
- const answer = await new Promise((resolve) => {
236
- rl.question("\nAdd MCP to Cursor now? (y/n): ", (a) => {
237
- rl.close();
238
- resolve((a || "").trim().toLowerCase());
239
- });
240
- });
241
- if (answer !== "y" && answer !== "yes")
242
- return;
243
- try {
244
- const { addToConfig } = await import("./setup.js");
245
- const { path, updated } = addToConfig("cursor");
246
- if (updated) {
247
- console.log(` Added to ${path}`);
248
- console.log(" Restart Cursor to use the MCP.");
249
- }
250
- else {
251
- console.log(` Already in ${path}`);
252
- }
253
- }
254
- catch (err) {
255
- console.error(" Could not add to Cursor:", err instanceof Error ? err.message : String(err));
256
- }
257
- }
258
- /** Returns sid and lli only after user has left the sign-in page (avoids grabbing a stale cookie from the same profile). */
259
282
  async function waitForSubstackCookies(page, timeoutMs) {
260
283
  const start = Date.now();
261
284
  while (Date.now() - start < timeoutMs) {
@@ -274,35 +297,12 @@ async function waitForSubstackCookies(page, timeoutMs) {
274
297
  }
275
298
  }
276
299
  catch {
277
- // Page may have navigated or CDP session failed — retry
300
+ // retry
278
301
  }
279
302
  await new Promise((r) => setTimeout(r, 2000));
280
303
  }
281
304
  return null;
282
305
  }
283
- /** Parse Cookie header or single value into sid and optional lli. */
284
- function parseCookieInput(input) {
285
- const trimmed = input.trim();
286
- if (trimmed.includes("=") && (trimmed.includes(";") || trimmed.includes("substack."))) {
287
- const parts = trimmed.split(";").map((p) => p.trim());
288
- let sid = "";
289
- let lli;
290
- for (const part of parts) {
291
- const eq = part.indexOf("=");
292
- if (eq === -1)
293
- continue;
294
- const name = part.slice(0, eq).trim();
295
- const value = part.slice(eq + 1).trim();
296
- if (name === "substack.sid")
297
- sid = value;
298
- if (name === "substack.lli" && value.length > 10)
299
- lli = value;
300
- }
301
- if (sid)
302
- return lli ? { sid, lli } : { sid };
303
- }
304
- return { sid: trimmed };
305
- }
306
306
  export async function runManualLogin(cookieArg) {
307
307
  const { sid, lli } = parseCookieInput(cookieArg);
308
308
  if (!sid) {
@@ -324,11 +324,11 @@ export async function runManualLogin(cookieArg) {
324
324
  export async function validateStoredAuth() {
325
325
  try {
326
326
  const headers = getCookieHeaders();
327
- // Validate against substack.com itself — works regardless of whether we know the user's subdomain
327
+ if (!headers)
328
+ return false;
328
329
  const res = await fetch("https://substack.com/api/v1/reader/posts?limit=1", { headers, redirect: "follow" });
329
330
  if (res.ok)
330
331
  return true;
331
- // Fallback: if we have a subdomain, try the publication-specific endpoint
332
332
  const subdomain = loadAuth()?.subdomain || process.env["SUBSTACK_SUBDOMAIN"];
333
333
  if (subdomain) {
334
334
  const res2 = await fetch(`https://${subdomain}.substack.com/api/v1/archive?limit=1`, { headers });
@@ -341,6 +341,8 @@ export async function validateStoredAuth() {
341
341
  }
342
342
  }
343
343
  export async function checkAuthStatus() {
344
+ const envCookie = process.env["SUBSTACK_COOKIE"];
345
+ const hasEnvVar = envCookie !== undefined && envCookie.trim().length > 0;
344
346
  const auth = loadAuth();
345
347
  if (!auth) {
346
348
  return { authenticated: false };
@@ -352,7 +354,8 @@ export async function checkAuthStatus() {
352
354
  const ageHours = Math.floor((ageMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
353
355
  return {
354
356
  authenticated: valid,
355
- cookieAge: `${ageDays}d ${ageHours}h (extracted ${auth.extractedAt})`,
357
+ authSource: hasEnvVar ? "environment variable" : "auth.json",
358
+ cookieAge: hasEnvVar ? "from env var" : `${ageDays}d ${ageHours}h (extracted ${auth.extractedAt})`,
356
359
  subdomain: auth.subdomain,
357
360
  };
358
361
  }
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -38,12 +38,53 @@ export interface SubstackComment {
38
38
  reactions: Record<string, number>;
39
39
  children: SubstackComment[];
40
40
  }
41
- /**
42
- * Fetch full comment tree for an article.
43
- * The slug is resolved to a post ID first via the article detail endpoint.
44
- */
45
41
  export declare function getComments(slugOrId: string, subdomain?: string): Promise<{
46
42
  postId: number;
47
43
  comments: SubstackComment[];
48
44
  }>;
45
+ export interface SubstackSubscription {
46
+ publicationId: number;
47
+ name: string;
48
+ subdomain: string;
49
+ url: string;
50
+ authorName: string;
51
+ plan: "paid" | "comp" | "free";
52
+ isFavorite: boolean;
53
+ createdAt: string;
54
+ }
55
+ export declare function listSubscriptions(): Promise<SubstackSubscription[]>;
56
+ export interface InboxItem {
57
+ id: number;
58
+ title: string;
59
+ slug: string;
60
+ subtitle: string;
61
+ publishedAt: string;
62
+ canonicalUrl: string;
63
+ audience: string;
64
+ publicationName: string;
65
+ publicationSubdomain: string;
66
+ authorName: string;
67
+ likes: number;
68
+ comments: number;
69
+ restacks: number;
70
+ wordCount?: number;
71
+ }
72
+ export declare function getInbox(pages?: number): Promise<InboxItem[]>;
73
+ export interface FeedItem {
74
+ id: number;
75
+ title: string;
76
+ slug: string;
77
+ subtitle: string;
78
+ publishedAt: string;
79
+ canonicalUrl: string;
80
+ audience: string;
81
+ publicationName: string;
82
+ publicationSubdomain: string;
83
+ authorName: string;
84
+ likes: number;
85
+ comments: number;
86
+ restacks: number;
87
+ wordCount?: number;
88
+ }
89
+ export declare function getReaderFeed(limit?: number): Promise<FeedItem[]>;
49
90
  //# sourceMappingURL=client.d.ts.map