@nitrosend/mcp
Advanced tools
+1
-0
| export interface AuthConfig { | ||
| token: string; | ||
| mode: "api_key" | "bearer"; | ||
| clientAccountSid?: string; | ||
| } | ||
| export declare function getAuthConfig(): AuthConfig; | ||
| export declare function getApiUrl(): string; |
+3
-2
@@ -5,4 +5,5 @@ const DEFAULT_API_URL = "https://api.nitrosend.com/mcp"; | ||
| const bearerToken = process.env.NITROSEND_BEARER_TOKEN; | ||
| const clientAccountSid = process.env.NITROSEND_CLIENT_ACCOUNT_SID?.trim() || undefined; | ||
| if (bearerToken) { | ||
| return { token: bearerToken, mode: "bearer" }; | ||
| return { token: bearerToken, mode: "bearer", clientAccountSid }; | ||
| } | ||
@@ -16,3 +17,3 @@ if (apiKey) { | ||
| } | ||
| return { token: apiKey, mode: "api_key" }; | ||
| return { token: apiKey, mode: "api_key", clientAccountSid }; | ||
| } | ||
@@ -19,0 +20,0 @@ console.error("Error: No authentication credentials set.\n\n" + |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,+BAA+B,CAAC;AAOxD,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IAEvD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CACX,oCAAoC;gBAClC,yCAAyC;gBACzC,0DAA0D,CAC7D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,KAAK,CACX,+CAA+C;QAC7C,qBAAqB;QACrB,+CAA+C;QAC/C,sCAAsC;QACtC,sFAAsF;QACtF,0DAA0D,CAC7D,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,eAAe,CAAC;AAC1D,CAAC"} | ||
| {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,+BAA+B,CAAC;AAQxD,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACvD,MAAM,gBAAgB,GACpB,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAEhE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CACX,oCAAoC;gBAClC,yCAAyC;gBACzC,0DAA0D,CAC7D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9D,CAAC;IAED,OAAO,CAAC,KAAK,CACX,+CAA+C;QAC7C,qBAAqB;QACrB,+CAA+C;QAC/C,sCAAsC;QACtC,sFAAsF;QACtF,0DAA0D,CAC7D,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,eAAe,CAAC;AAC1D,CAAC"} |
+62
-25
| #!/usr/bin/env node | ||
| import { createRequire } from "node:module"; | ||
| import { once } from "node:events"; | ||
| import { createInterface } from "node:readline"; | ||
| import { getAuthConfig, getApiUrl } from "./auth.js"; | ||
| const { token, mode } = getAuthConfig(); | ||
| const require = createRequire(import.meta.url); | ||
| const packageJson = require("../package.json"); | ||
| const { token, mode, clientAccountSid } = getAuthConfig(); | ||
| const apiUrl = getApiUrl(); | ||
| const userAgent = `nitrosend-mcp/${packageJson.version || "unknown"}`; | ||
| let mcpSessionId; | ||
| const RETRY_DELAYS = [100, 300]; | ||
| async function forward(line) { | ||
| const requestId = extractRequestId(line); | ||
| let lastError = null; | ||
| for (let attempt = 0; attempt <= RETRY_DELAYS.length; attempt++) { | ||
| try { | ||
| const headers = { | ||
| "Content-Type": "application/json", | ||
| Accept: "application/json, text/event-stream", | ||
| Authorization: `Bearer ${token}`, | ||
| "User-Agent": userAgent, | ||
| }; | ||
| if (clientAccountSid) { | ||
| headers["X-Client-Account-SID"] = clientAccountSid; | ||
| } | ||
| if (mcpSessionId) { | ||
| headers["Mcp-Session-Id"] = mcpSessionId; | ||
| } | ||
| const res = await fetch(apiUrl, { | ||
| method: "POST", | ||
| headers: { | ||
| "Content-Type": "application/json", | ||
| Authorization: `Bearer ${token}`, | ||
| }, | ||
| headers, | ||
| body: line, | ||
| }); | ||
| const nextSessionId = res.headers.get("Mcp-Session-Id"); | ||
| if (nextSessionId) { | ||
| mcpSessionId = nextSessionId; | ||
| } | ||
| if (res.status === 202) { | ||
@@ -32,3 +52,3 @@ // JSON-RPC notification — no response body | ||
| console.error(`Auth error (${res.status}): ${authHint}`); | ||
| return jsonRpcError(-32000, `Authentication failed (${res.status})`); | ||
| return jsonRpcError(-32000, `Authentication failed (${res.status})`, requestId); | ||
| } | ||
@@ -40,3 +60,3 @@ // 5xx — retry | ||
| } | ||
| return jsonRpcError(-32000, `API returned ${res.status}`); | ||
| return jsonRpcError(-32000, `API returned ${res.status}`, requestId); | ||
| } | ||
@@ -54,9 +74,23 @@ catch (err) { | ||
| console.error(`Network error: ${msg}`); | ||
| return jsonRpcError(-32000, `Network error: ${msg}`); | ||
| return jsonRpcError(-32000, `Network error: ${msg}`, requestId); | ||
| } | ||
| function jsonRpcError(code, message) { | ||
| function extractRequestId(line) { | ||
| try { | ||
| const payload = JSON.parse(line); | ||
| if (typeof payload.id === "string" || | ||
| typeof payload.id === "number" || | ||
| payload.id === null) { | ||
| return payload.id; | ||
| } | ||
| } | ||
| catch { | ||
| // Invalid JSON-RPC requests do not have a reliable id to preserve. | ||
| } | ||
| return null; | ||
| } | ||
| function jsonRpcError(code, message, id) { | ||
| return JSON.stringify({ | ||
| jsonrpc: "2.0", | ||
| error: { code, message }, | ||
| id: null, | ||
| id, | ||
| }); | ||
@@ -68,4 +102,3 @@ } | ||
| const rl = createInterface({ input: process.stdin }); | ||
| let pending = 0; | ||
| let closing = false; | ||
| let queue = Promise.resolve(); | ||
| rl.on("line", async (line) => { | ||
@@ -75,19 +108,23 @@ const trimmed = line.trim(); | ||
| return; | ||
| pending++; | ||
| const response = await forward(trimmed); | ||
| queue = queue | ||
| .then(() => processLine(trimmed)) | ||
| .catch((err) => { | ||
| console.error(`Bridge error: ${err.message}`); | ||
| }); | ||
| }); | ||
| rl.on("close", () => { | ||
| queue.then(() => process.exit(0)); | ||
| }); | ||
| async function processLine(line) { | ||
| const response = await forward(line); | ||
| if (response) { | ||
| process.stdout.write(response + "\n"); | ||
| await writeStdout(response + "\n"); | ||
| } | ||
| pending--; | ||
| if (closing && pending === 0) { | ||
| process.exit(0); | ||
| } | ||
| async function writeStdout(text) { | ||
| if (!process.stdout.write(text)) { | ||
| await once(process.stdout, "drain"); | ||
| } | ||
| }); | ||
| rl.on("close", () => { | ||
| closing = true; | ||
| if (pending === 0) { | ||
| process.exit(0); | ||
| } | ||
| }); | ||
| } | ||
| console.error(`Nitrosend MCP bridge started (${apiUrl}, auth=${mode})`); | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
+3
-2
| { | ||
| "name": "@nitrosend/mcp", | ||
| "version": "0.6.2", | ||
| "version": "0.7.0", | ||
| "description": "MCP server for Nitrosend — connect Claude to your email marketing platform", | ||
@@ -17,3 +17,4 @@ "mcpName": "com.nitrosend/nitrosend", | ||
| "prepare": "npm run build", | ||
| "dev": "tsc --watch" | ||
| "dev": "tsc --watch", | ||
| "test:bridge": "npm run build && node scripts/bridge-serialization-test.mjs" | ||
| }, | ||
@@ -20,0 +21,0 @@ "engines": { |
+24
-11
| # @nitrosend/mcp | ||
| MCP server for [Nitrosend](https://nitrosend.com) — connect any AI agent to your email marketing platform. | ||
| Optional stdio bridge for [Nitrosend](https://nitrosend.com). Most clients should connect directly to Nitrosend's remote MCP server at `https://api.nitrosend.com/mcp`; this package exists for stdio-only clients and local development. | ||
| All plans, including free plans, have full access to Nitrosend MCP/API/CLI. Plan limits still apply to send volume, seats, AI action allowances, and paid add-ons. | ||
| For Claude Desktop, Claude.ai, and Claude Cowork, use the remote MCP connector | ||
| UI. Do not install `@nitrosend/cli` or this stdio bridge for the standard | ||
| Claude connector setup. | ||
| Manage contacts, compose emails, build automated flows, and launch campaigns through natural language. | ||
@@ -38,3 +44,3 @@ | ||
| Go to **Settings → MCP Servers → Add** and select **Streamable HTTP** transport: | ||
| Go to **Settings → Connections → Add Custom Connector** and enter: | ||
@@ -65,4 +71,3 @@ ```text | ||
| "nitrosend": { | ||
| "command": "npx", | ||
| "args": ["-y", "mcp-remote", "https://api.nitrosend.com/mcp"] | ||
| "url": "https://api.nitrosend.com/mcp" | ||
| } | ||
@@ -73,3 +78,3 @@ } | ||
| Cursor opens your browser to sign in on first use via `mcp-remote`. | ||
| Cursor handles Nitrosend as a direct remote MCP server. On first use, it prompts for OAuth sign-in. | ||
@@ -135,3 +140,3 @@ --- | ||
| Zed only supports stdio transport — use `mcp-remote` to bridge: | ||
| Add to your Zed settings: | ||
@@ -142,6 +147,3 @@ ```json | ||
| "nitrosend": { | ||
| "command": { | ||
| "path": "npx", | ||
| "args": ["-y", "mcp-remote", "https://api.nitrosend.com/mcp"] | ||
| } | ||
| "url": "https://api.nitrosend.com/mcp" | ||
| } | ||
@@ -162,3 +164,3 @@ } | ||
| **If your client only supports stdio**, use the bridge with an API key: | ||
| **If your client only supports stdio**, use this bridge package with an API key: | ||
@@ -189,2 +191,12 @@ ```json | ||
| ## Account and client-account context | ||
| For OAuth connections, Nitrosend stores both the current account and the current client account per user and OAuth application. Ask your agent to call `nitro_get_status` first: it shows `current_account` and `available_accounts` alongside `current_client_account` and `available_client_accounts`. | ||
| If the task is for a different account than the one shown, call `nitro_select_account` with the target `account_id`. The switch takes effect on the next tool call. Then call `nitro_select_client_account` to pick a client account within that account. The selected account persists across the session and across token refreshes until you switch again. | ||
| `nitro_select_account` and `nitro_select_client_account` only change the active MCP context. `nitro_set_brand_kit` edits the Brand Kit for the current client account, such as colors, logo, sender details, and voice. | ||
| API key connections are pinned to the API key's account and client account and cannot switch with `nitro_select_account` or `nitro_select_client_account`. For stdio bridge deployments that must force a single client account, set `NITROSEND_CLIENT_ACCOUNT_SID`; the bridge will send `X-Client-Account-SID` only when that variable is present. | ||
| ## Environment variables | ||
@@ -196,2 +208,3 @@ | ||
| | `NITROSEND_BEARER_TOKEN` | OAuth bearer token — alternative to API key | | ||
| | `NITROSEND_CLIENT_ACCOUNT_SID` | Optional fixed-client-account override for the stdio bridge. Sends `X-Client-Account-SID` only when set. | | ||
| | `NITROSEND_API_URL` | Override API endpoint (default: `https://api.nitrosend.com/mcp`) | | ||
@@ -198,0 +211,0 @@ |
Debug access
Supply chain riskUses debug, reflection and dynamic code execution features.
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
17023
38.73%161
31.97%211
6.57%7
40%