dsh-resend-mcp (0.1.1)
Installation
registry=npm config set registry=npm install dsh-resend-mcp@0.1.1"dsh-resend-mcp": "0.1.1"About this package
dsh-resend-mcp
Resend email tools for DeepSeek Harness, wrapped as an installable DSH bundle.
The plugin connects to Resend's hosted MCP server
(https://mcp.resend.com/mcp), resolves your API key from the DSH credential
store, and exposes a curated subset of Resend's tools as native agent tools
named mcp__resend__<tool>. A diagnostic resend_status tool reports the
connection, credential reference, and active filter without revealing the key.
Not affiliated with Resend. Resend and the Resend logo are trademarks of their respective owners.
Status: v0.1.1 (same code as 0.1.0; documentation only), verified on
2026-10-22 against DSH 0.2.0-rc.2 and Resend's live MCP server: 9 tools
registered from 137 available, and a test email was delivered from
dsh@pvlb.dev to pvlb.dev@gmail.com. CI runs on Forgejo Actions;
dsh-resend-mcp is published on
npmjs and in the private Forgejo
registry.
Why a subset?
Resend's MCP server currently exposes 137 tools whose JSON schemas total roughly 405 KB — on every model request. Most sessions need a handful of them. This plugin selects a small, useful preset by default and lets you widen it explicitly:
| Preset | Tools | Approx. schema size |
|---|---|---|
minimal |
send-email, list-emails, get-email, list-domains |
~13 KB |
sending (default) |
minimal + list-contacts, get-contact, create-contact, list-templates, list-broadcasts |
~26 KB |
inbox |
minimal + ten inbox read/thread/draft tools | ~54 KB |
full |
every tool the server exposes | ~405 KB today |
custom |
whatever tools matches |
user-controlled |
Requirements
- Node.js >= 22.6
- DSH
>=0.2.0-rc.1 <0.3.0 - A Resend account with a verified sending domain and an API key
pnpmavailable to the DSH Plugin Manager (the profile may need to name its absolute path)
Install
From npm (recommended)
dsh plugin --profile web add dsh-resend-mcp
The package is public:
https://www.npmjs.com/package/dsh-resend-mcp. The DSH Plugin Manager resolves
the plugin's DSH peers from the running installation; its own runtime dependency
(@modelcontextprotocol/client) comes from npm.
From a checkout (development)
git clone ssh://git@git.pvlb.dev/dsh-plugins/dsh-resend-mcp.git
cd dsh-resend-mcp
npm run dev:link # makes a local ("link:") install importable
dsh plugin --profile web add "$PWD"
npm run dev:link symlinks the DSH packages this plugin imports into the
gitignored node_modules/. It is only needed for link: installs; a tarball or
registry install gets its dependencies normally.
From a packed tarball
git clone ssh://git@git.pvlb.dev/dsh-plugins/dsh-resend-mcp.git
cd dsh-resend-mcp
npm pack
dsh plugin --profile web add ./dsh-resend-mcp-0.1.1.tgz
From the private Forgejo registry
The Forgejo registry hosts the same version, but downloads need a token and the tarball is installed explicitly; see docs/publishing.md. It is not a public install path.
After install, restart or reload the profile if the Plugin Manager reports
restart-required.
Configure the API key
- Create a key at https://resend.com/api-keys with permission to send email and read the resources you want the agent to use.
- In the DSH Web UI open Settings → Credentials and store it as
RESEND_API_KEY.
The key is resolved through ctx.credentials at connect time. It is never
written to configuration, logs, tool output, or the repository. An environment
variable supplied to the DSH process also works and is read-only in the UI.
To use a different credential reference, set apiKeyEnv in the plugin config.
Verify
Ask the agent to call resend_status, then list your domains:
Use
resend_statusto check the Resend connection, then callmcp__resend__list-domains.
A healthy result shows the credential as configured, the active preset, the registered tool names, and your verified domains.
Configuration
The bundle mounts with config: {}. Override fields through your profile's
configuration layer when you need different behavior:
- id: dsh-resend-mcp
name: dsh-resend-mcp
config:
preset: sending
defaultSender: "you@example.com"
| Field | Default | Description |
|---|---|---|
serverName |
resend |
Namespace for mcp__<serverName>__<tool> |
url |
https://mcp.resend.com/mcp |
Streamable HTTP MCP endpoint |
apiKeyEnv |
RESEND_API_KEY |
Credential reference (never the value) |
preset |
sending |
minimal, sending, inbox, full, or custom |
tools |
[] |
Allowlist patterns; a non-empty list replaces the preset. * is a wildcard |
excludeTools |
[] |
Patterns removed after the preset/allowlist |
defaultSender |
"" |
Verified sender address included in prompt guidance |
toolCallTimeoutMs |
60000 |
Per-tool-call timeout in milliseconds |
startupTimeoutMs |
30000 |
Initial connect and tool-list timeout |
failOnStartupError |
true |
Fail activation instead of keeping resend_status with retries |
maxInstructionBytes |
8192 |
Bound on optional server instruction text |
Examples:
# Only sending + email lookup
config:
preset: minimal
# Everything, explicitly (large prompt prefix)
config:
preset: full
# Add inbox reading on top of the default sending preset
config:
preset: inbox
To use an explicit list, set tools; it replaces the preset:
config:
tools:
- send-email
- list-emails
- get-email
- "*-domain" # list-domains, get-domain, ...
Tools
All MCP-backed tools use the mcp__resend__ prefix and map 1:1 to Resend's
server tools. The default sending preset exposes:
mcp__resend__send-emailmcp__resend__list-emailsmcp__resend__get-emailmcp__resend__list-domainsmcp__resend__list-contactsmcp__resend__get-contactmcp__resend__create-contactmcp__resend__list-templatesmcp__resend__list-broadcasts
Plus the native diagnostic:
resend_status— connection state, credential reference/source, preset, registered tools, missing filter patterns, last error. It never prints the key.
Resend's send-email requires to, subject, text, from, context, and
llm_model. The plugin's prompt guidance explains this and uses
defaultSender when configured.
Security
- The API key is resolved from DSH credentials at connect/reconnect time.
- Configuration carries only the credential reference, never the value.
- Logs contain counts, names, and error messages — not headers or secrets.
resend_statusreports only whether the credential is configured and from which layer (file,env, …).- The repository test suite includes a secret scan and fails on accidental
re_…keys.
The credential store protects against accidental disclosure, not against a malicious agent running as the same OS user; see the DSH credentials documentation for that boundary.
Development
npm test # unit tests, no network/DSH required
npm run check # syntax checks + tests
npm run dev:link # before a local-path install
npm run smoke # real server check; needs RESEND_API_KEY in env
npm run pack:check # inspect the publish artifact
scripts/smoke.mjs connects to the real server, prints the tool count and the
selected names (not schemas), and can optionally send a test email with
--send-to <address>.
See AGENTS.md for architecture, deployment facts, and the full verification checklist, TASKS.md for the backlog, and docs/publishing.md for CI, tagging, and registry setup (including the Forgejo npm registry).
Limitations
- Remote Streamable HTTP only; no stdio
resend-mcpprocess and no OAuth browser flow. - API-key bearer authentication only.
- DSH validates only its own JSON Schema subset locally. Resend keywords such as
format,pattern,minItems, andmaxItemsreach the model but are enforced by Resend's server. - Reconnection uses bounded exponential backoff; after the attempt budget the tools are unregistered until the plugin reloads or the Host restarts.
- No settings UI yet; configure through YAML.
- The plugin is installed profile-wide, affecting every session in that profile.
License
Apache-2.0. See LICENSE.
Dependencies
Dependencies
| ID | Version |
|---|---|
| @modelcontextprotocol/client | 2.0.0 |
Peer dependencies
| ID | Version |
|---|---|
| @deepseek-ai/cordis | ^4.0.1 |
| @deepseek-ai/dsh-credentials | >=0.2.0-rc.1 <0.3.0-0 |
| @deepseek-ai/dsh-mcp-client | >=0.2.0-rc.1 <0.3.0-0 |
| @deepseek-ai/dsh-system-prompt | >=0.2.0-rc.1 <0.3.0-0 |
| @deepseek-ai/dsh-tools | >=0.2.0-rc.1 <0.3.0-0 |
| @deepseek-ai/schemastery | ^3.18.1 |