@conorbronsdon/substack-mcp
Advanced tools
@@ -19,3 +19,3 @@ import { SubstackAPIError, AuthenticationError } from "../utils/errors.js"; | ||
| "Content-Type": "application/json", | ||
| "User-Agent": "substack-mcp/0.2.0", | ||
| "User-Agent": "substack-mcp/0.2.1", | ||
| ...(options.headers || {}), | ||
@@ -22,0 +22,0 @@ }; |
+14
-21
@@ -5,23 +5,17 @@ #!/usr/bin/env node | ||
| import { createServer } from "./server.js"; | ||
| function getRequiredEnv(name) { | ||
| const value = process.env[name]; | ||
| if (!value) { | ||
| console.error(`Missing required environment variable: ${name}`); | ||
| console.error(""); | ||
| console.error("Required environment variables:"); | ||
| console.error(" SUBSTACK_PUBLICATION_URL — e.g., https://yourblog.substack.com"); | ||
| console.error(" SUBSTACK_SESSION_TOKEN — connect.sid cookie from browser DevTools"); | ||
| console.error(" SUBSTACK_USER_ID — your numeric Substack user ID"); | ||
| console.error(""); | ||
| console.error("See README.md for setup instructions."); | ||
| process.exit(1); | ||
| async function main() { | ||
| const publicationUrl = process.env.SUBSTACK_PUBLICATION_URL || ""; | ||
| const sessionToken = process.env.SUBSTACK_SESSION_TOKEN || ""; | ||
| const userId = process.env.SUBSTACK_USER_ID || "0"; | ||
| const missingVars = [ | ||
| !process.env.SUBSTACK_PUBLICATION_URL && "SUBSTACK_PUBLICATION_URL", | ||
| !process.env.SUBSTACK_SESSION_TOKEN && "SUBSTACK_SESSION_TOKEN", | ||
| !process.env.SUBSTACK_USER_ID && "SUBSTACK_USER_ID", | ||
| ].filter(Boolean); | ||
| if (missingVars.length > 0) { | ||
| console.error(`Warning: Missing environment variables: ${missingVars.join(", ")}`); | ||
| console.error("Tools will error until all variables are configured. See README.md for setup."); | ||
| } | ||
| return value; | ||
| } | ||
| async function main() { | ||
| const publicationUrl = getRequiredEnv("SUBSTACK_PUBLICATION_URL"); | ||
| const sessionToken = getRequiredEnv("SUBSTACK_SESSION_TOKEN"); | ||
| const userId = getRequiredEnv("SUBSTACK_USER_ID"); | ||
| const client = new SubstackClient(publicationUrl, sessionToken, userId); | ||
| // Validate auth on startup | ||
| // Validate auth on startup (warn but don't block — allows inspection without credentials) | ||
| try { | ||
@@ -32,5 +26,4 @@ const user = await client.validateAuth(); | ||
| catch (err) { | ||
| console.error("Authentication failed. Check your SUBSTACK_SESSION_TOKEN."); | ||
| console.error("Warning: Authentication failed. Tools will error until a valid session token is provided."); | ||
| console.error(err instanceof Error ? err.message : String(err)); | ||
| process.exit(1); | ||
| } | ||
@@ -37,0 +30,0 @@ const server = createServer(client); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAClF,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,cAAc,GAAG,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,cAAc,CAAC,wBAAwB,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAAC;IAElD,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAExE,2BAA2B;IAC3B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC3E,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC;IAClE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC;IAEnD,MAAM,WAAW,GAAG;QAClB,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,0BAA0B;QACnE,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,wBAAwB;QAC/D,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,kBAAkB;KACpD,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,2CAA2C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAExE,0FAA0F;IAC1F,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;QAC3G,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"} |
+1
-1
@@ -7,3 +7,3 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; | ||
| name: "substack-mcp", | ||
| version: "0.2.0", | ||
| version: "0.2.1", | ||
| }); | ||
@@ -10,0 +10,0 @@ // --- Read tools --- |
+1
-1
| { | ||
| "name": "@conorbronsdon/substack-mcp", | ||
| "version": "0.2.0", | ||
| "version": "0.2.1", | ||
| "description": "MCP server for Substack — read posts, manage drafts. No publish or delete by design.", | ||
@@ -5,0 +5,0 @@ "type": "module", |
+2
-2
@@ -10,3 +10,3 @@ { | ||
| }, | ||
| "version": "0.2.0", | ||
| "version": "0.2.1", | ||
| "packages": [ | ||
@@ -16,3 +16,3 @@ { | ||
| "identifier": "@conorbronsdon/substack-mcp", | ||
| "version": "0.2.0", | ||
| "version": "0.2.1", | ||
| "runtimeHint": "npx", | ||
@@ -19,0 +19,0 @@ "transport": { |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
62273
-0.4%870
-0.8%6
200%