New:Socket for Asana Is Now Available.Learn more
Get Started

@nitrosend/mcp

Package Overview
Dependencies
Maintainers
2
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@nitrosend/mcp - npm Package Compare versions

Comparing version
0.6.2
to
0.7.0
+1
-0
dist/auth.d.ts
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 +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"}
#!/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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"}
{
"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 @@