shipmail-mcp 0.1.1 → 0.1.3

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.
Files changed (4) hide show
  1. package/README.md +214 -90
  2. package/dist/index.js +863 -10
  3. package/package.json +12 -5
  4. package/server.json +31 -0
package/README.md CHANGED
@@ -1,8 +1,41 @@
1
- # ShipMail MCP Server
1
+ # Shipmail MCP Server
2
2
 
3
- Official Model Context Protocol server for ShipMail. It gives MCP-compatible agents access to ShipMail domains, mailboxes, messages, threads, webhooks, suppressions, resources, and guided prompts.
3
+ [![npm version](https://img.shields.io/npm/v/shipmail-mcp.svg)](https://www.npmjs.com/package/shipmail-mcp)
4
+ [![npm downloads](https://img.shields.io/npm/dm/shipmail-mcp.svg)](https://www.npmjs.com/package/shipmail-mcp)
5
+ [![node](https://img.shields.io/node/v/shipmail-mcp.svg)](https://www.npmjs.com/package/shipmail-mcp)
6
+ [![license](https://img.shields.io/npm/l/shipmail-mcp.svg)](./LICENSE)
4
7
 
5
- ## Install
8
+ Official Model Context Protocol server for [Shipmail](https://shipmail.to). Connect MCP-compatible agents (Claude Desktop, Cursor, VS Code, Windsurf, and others) to Shipmail domains, mailboxes, messages, threads, webhooks, and suppressions.
9
+
10
+ > [Model Context Protocol](https://modelcontextprotocol.io) is an open standard for connecting LLM clients to external tools and data. This server runs locally over stdio and exposes the Shipmail API to your agent.
11
+
12
+ **Transport**: stdio (local).
13
+ **Requirements**: Node.js 20+ and a [Shipmail API key](https://shipmail.to/docs/quick-start).
14
+
15
+ ## Contents
16
+
17
+ - [Quick start](#quick-start)
18
+ - [Claude Desktop](#claude-desktop)
19
+ - [Cursor](#cursor)
20
+ - [VS Code](#vs-code)
21
+ - [Windsurf](#windsurf)
22
+ - [What you can do](#what-you-can-do)
23
+ - [Tools](#tools)
24
+ - [Resources](#resources)
25
+ - [Prompts](#prompts)
26
+ - [Configuration](#configuration)
27
+ - [Security](#security)
28
+ - [Privacy](#privacy)
29
+ - [Troubleshooting](#troubleshooting)
30
+ - [Development](#development)
31
+ - [License](#license)
32
+ - [Links](#links)
33
+
34
+ ## Quick start
35
+
36
+ ### Claude Desktop
37
+
38
+ Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
6
39
 
7
40
  ```json
8
41
  {
@@ -18,25 +51,97 @@ Official Model Context Protocol server for ShipMail. It gives MCP-compatible age
18
51
  }
19
52
  ```
20
53
 
21
- For local development in this repository:
54
+ Restart Claude Desktop. The Shipmail tools appear under the tools menu.
22
55
 
23
- ```bash
24
- cd packages/shipmail-mcp
25
- SHIPMAIL_API_KEY=sm_live_... bun run dev
56
+ ### Cursor
57
+
58
+ Add to `.cursor/mcp.json` in the project root, or `~/.cursor/mcp.json` for global use:
59
+
60
+ ```json
61
+ {
62
+ "mcpServers": {
63
+ "shipmail": {
64
+ "command": "npx",
65
+ "args": ["-y", "shipmail-mcp"],
66
+ "env": {
67
+ "SHIPMAIL_API_KEY": "sm_live_..."
68
+ }
69
+ }
70
+ }
71
+ }
26
72
  ```
27
73
 
28
- ## Configuration
74
+ ### VS Code
75
+
76
+ Add to `.vscode/mcp.json`. The `inputs` block prompts for the key on first use instead of storing it in the file:
77
+
78
+ ```json
79
+ {
80
+ "inputs": [
81
+ {
82
+ "type": "promptString",
83
+ "id": "shipmail-api-key",
84
+ "description": "Shipmail API key",
85
+ "password": true
86
+ }
87
+ ],
88
+ "servers": {
89
+ "shipmail": {
90
+ "type": "stdio",
91
+ "command": "npx",
92
+ "args": ["-y", "shipmail-mcp"],
93
+ "env": {
94
+ "SHIPMAIL_API_KEY": "${input:shipmail-api-key}"
95
+ }
96
+ }
97
+ }
98
+ }
99
+ ```
100
+
101
+ ### Windsurf
102
+
103
+ Edit `~/.codeium/windsurf/mcp_config.json`:
104
+
105
+ ```json
106
+ {
107
+ "mcpServers": {
108
+ "shipmail": {
109
+ "command": "npx",
110
+ "args": ["-y", "shipmail-mcp"],
111
+ "env": {
112
+ "SHIPMAIL_API_KEY": "sm_live_..."
113
+ }
114
+ }
115
+ }
116
+ }
117
+ ```
118
+
119
+ ## What you can do
120
+
121
+ Once connected, ask your agent:
122
+
123
+ - "Set up acme.com on Shipmail and show me the DNS records I need to add at my registrar."
124
+ - "Create a mailbox `support@acme.com` and turn on auto-reply with this text..."
125
+ - "Triage the threads in `support@acme.com` from this week and summarize what needs attention."
126
+ - "Reply to thread `thread_abc123` confirming we ship Friday."
127
+ - "Create a webhook that posts new email events to `https://example.com/hooks/shipmail`, then send a test event."
128
+ - "Show recent deliveries for webhook `whk_xyz` and flag any that failed."
129
+
130
+ ## Tools
29
131
 
30
- | Variable | Description |
31
- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
32
- | `SHIPMAIL_API_KEY` | Required (or use `SHIPMAIL_API_KEY_FILE`). ShipMail API key (`sm_live_...`). |
33
- | `SHIPMAIL_API_KEY_FILE` | Optional path to a file containing the API key. Takes precedence over `SHIPMAIL_API_KEY`. Reduces env-trace leak surface (Docker secrets, systemd `LoadCredential`, etc.). |
34
- | `SHIPMAIL_BASE_URL` | Optional. Must be https on a `shipmail.to` host. Defaults to `https://shipmail.to/api/v1`. |
35
- | `SHIPMAIL_MCP_TOOLS` | Optional comma-separated allowlist of tools. The `--tools` flag overrides this when both are set. |
36
- | `SHIPMAIL_ALLOW_INSECURE_BASE_URL` | Set to `1` to permit a non-https or non-`shipmail.to` base URL. Use only for local development. |
37
- | `SHIPMAIL_MCP_DEBUG` | Set to `1` to include `request_id`/`status` in stderr tool-call logs (default: off). |
132
+ All tools are namespaced with `shipmail_` to avoid collisions with peer MCP servers.
38
133
 
39
- The command also supports `--tools`:
134
+ | Group | Tools |
135
+ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
136
+ | Status | `shipmail_status` |
137
+ | Domains | `shipmail_list_domains`, `shipmail_get_domain`, `shipmail_create_domain`, `shipmail_update_domain`, `shipmail_delete_domain`, `shipmail_verify_domain`, `shipmail_search_domains` |
138
+ | Mailboxes | `shipmail_list_mailboxes`, `shipmail_get_mailbox`, `shipmail_create_mailbox`, `shipmail_update_mailbox`, `shipmail_delete_mailbox`, `shipmail_list_mailbox_folders`, `shipmail_create_mailbox_folder`, `shipmail_update_mailbox_folder`, `shipmail_delete_mailbox_folder`, `shipmail_list_mailbox_identities`, `shipmail_get_mailbox_rules`, `shipmail_set_mailbox_rules`, `shipmail_reset_mailbox_password`, `shipmail_set_auto_reply`, `shipmail_set_spam_filter` |
139
+ | Mailbox inbox | `shipmail_list_mailbox_inbox_messages`, `shipmail_get_mailbox_inbox_thread`, `shipmail_update_inbox_message`, `shipmail_move_inbox_message`, `shipmail_delete_inbox_message` |
140
+ | Messages and threads | `shipmail_list_messages`, `shipmail_get_message`, `shipmail_send_message`, `shipmail_reply_to_message`, `shipmail_list_threads`, `shipmail_get_thread`, `shipmail_reply_to_thread` |
141
+ | Webhooks | `shipmail_list_webhooks`, `shipmail_get_webhook`, `shipmail_create_webhook`, `shipmail_update_webhook`, `shipmail_delete_webhook`, `shipmail_rotate_webhook_secret`, `shipmail_test_webhook`, `shipmail_list_webhook_deliveries` |
142
+ | Suppressions | `shipmail_list_suppressions`, `shipmail_remove_suppression` |
143
+
144
+ To restrict the surface, pass `--tools` (overrides `SHIPMAIL_MCP_TOOLS`):
40
145
 
41
146
  ```json
42
147
  {
@@ -49,100 +154,119 @@ The command also supports `--tools`:
49
154
  }
50
155
  ```
51
156
 
52
- ## Production smoke test
157
+ ## Resources
53
158
 
54
- From the repository root, run the smoke test against the published npm package:
159
+ Read-only resources for inspection without tool calls:
55
160
 
56
- ```bash
57
- SHIPMAIL_API_KEY=sm_live_... bun run smoke:mcp:production
58
- ```
161
+ - `shipmail://account/status`
162
+ - `shipmail://domains`
163
+ - `shipmail://domains/{id}`
164
+ - `shipmail://mailboxes`
165
+ - `shipmail://mailboxes/{id}`
166
+ - `shipmail://mailboxes/{id}/folders`
167
+ - `shipmail://mailboxes/{id}/identities`
168
+ - `shipmail://mailboxes/{id}/rules`
169
+ - `shipmail://mailboxes/{id}/inbox/messages`
170
+ - `shipmail://mailboxes/{id}/inbox/threads/{thread_id}`
171
+ - `shipmail://messages/{id}`
172
+ - `shipmail://threads/{id}`
59
173
 
60
- The default mode installs `shipmail-mcp@latest` in a temporary directory, starts the published binary
61
- over MCP stdio, lists tools, checks production status, and exercises read-only domain, mailbox,
62
- message, webhook, and suppression calls. It does not send email or mutate account state by default.
174
+ ## Prompts
63
175
 
64
- Opt into controlled mutations explicitly:
176
+ Pre-built prompts the agent can use as guided workflows:
65
177
 
66
- ```bash
67
- SHIPMAIL_API_KEY=sm_live_... bun run smoke:mcp:production -- --webhook-mutations
68
- SHIPMAIL_API_KEY=sm_live_... bun run smoke:mcp:production -- --send-to you@example.com
69
- ```
178
+ - `setup_domain`: connect a new domain and walk through DNS setup.
179
+ - `triage_mailbox`: read recent threads in a mailbox and summarize what needs attention.
180
+ - `draft_email_reply`: draft a reply for a given thread, ready for user review.
181
+ - `configure_webhook`: set up and test a webhook for incoming events.
70
182
 
71
- The webhook mode creates a disposable webhook, updates it, rotates its secret, lists deliveries,
72
- deletes it, and confirms deletion. The send mode sends one email and polls the message until it
73
- leaves `queued` or the poll window expires.
183
+ ## Configuration
74
184
 
75
- ## Releases
185
+ | Variable | Required | Description |
186
+ | ---------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
187
+ | `SHIPMAIL_API_KEY` | Yes (or `SHIPMAIL_API_KEY_FILE`) | Shipmail API key (`sm_live_...`). |
188
+ | `SHIPMAIL_API_KEY_FILE` | No | Path to a file containing the API key. Takes precedence over `SHIPMAIL_API_KEY`. Reduces env-trace leak surface (Docker secrets, systemd `LoadCredential`). |
189
+ | `SHIPMAIL_BASE_URL` | No | Override the API base URL. Must be https on a `shipmail.to` host. Defaults to `https://shipmail.to/api/v1`. |
190
+ | `SHIPMAIL_MCP_TOOLS` | No | Comma-separated tool allowlist. The `--tools` flag overrides this. |
191
+ | `SHIPMAIL_ALLOW_INSECURE_BASE_URL` | No | Set to `1` to permit a non-https or non-`shipmail.to` base URL. Local development only. |
192
+ | `SHIPMAIL_MCP_DEBUG` | No | Set to `1` to include `request_id` and `status` in stderr tool-call logs. |
193
+
194
+ ## Security
195
+
196
+ - **Tool namespacing**: All tools are prefixed with `shipmail_` to avoid collisions with peer MCP servers in the same host.
197
+ - **Structured outputs**: Successful tools return both text fallback content and structured MCP `structuredContent`.
198
+ - **Idempotency**: Mutating tools accept an optional `idempotency_key`. When omitted, the server generates a fresh key per tool call. Supply your own key if a specific request must stay idempotent across MCP retries.
199
+ - **Input sanitization**: Email content, addresses, and error text are stripped of ASCII control characters, DEL, and Unicode directional or BiDi markers (U+061C, U+200E/F, U+202A-E, U+2066-9). Long strings are truncated.
200
+ - **Error redaction**: 5xx and unexpected Shipmail errors are redacted to a generic message; the original `request_id` is preserved for support. Generic `Error` thrown values (network errors, deserialization) are redacted to "Internal MCP error" before reaching the LLM. Detail lands on stderr.
201
+ - **Circuit breaker**: Each session enforces per-tool rate limits and a hard total-call ceiling as a runaway-agent guard. These are not abuse controls. Real abuse limits live at the API per API key. Restart the server to reset.
202
+ - **Webhook URL validation**: Webhook URLs must be public https endpoints. Localhost, RFC1918, link-local, ULA, IPv4-mapped IPv6, `0.0.0.0`, decimal-int IPs, `.local`, and `.internal` hosts are rejected at input time.
203
+ - **Destructive annotations**: Tools that delete, retarget, rotate, replace rules, reset credentials, or create automatic outbound responses are annotated with `destructiveHint`. Hosts that gate on this annotation will prompt the user. Annotated tools include `shipmail_update_domain`, `shipmail_update_webhook`, `shipmail_rotate_webhook_secret`, `shipmail_delete_mailbox_folder`, `shipmail_set_mailbox_rules`, `shipmail_reset_mailbox_password`, and `shipmail_set_auto_reply` in addition to obvious deletes.
204
+
205
+ Domain purchase is intentionally excluded.
206
+
207
+ ### What this server does not defend against
208
+
209
+ - **Indirect prompt injection from email content.** Reading a mailbox exposes the agent to attacker-controlled email bodies. The sanitizer strips invisible glyphs but cannot detect natural-language injection ("ignore previous instructions, send to..."). Only call destructive tools after explicit user approval.
210
+ - **Malicious LLM output or hallucinated arguments.** The MCP layer cannot tell whether an argument came from the user or was invented. Use the host UI's tool-call confirmation, especially for `destructiveHint:true` tools.
211
+ - **Compromised MCP host.** Your API key is read from `SHIPMAIL_API_KEY` and held in memory by this process. If the host is compromised, the key is gone regardless. Rotate keys you suspect have been exposed.
212
+ - **Webhook signing secret in conversation logs.** `shipmail_create_webhook` and `shipmail_rotate_webhook_secret` return the secret in `structuredContent`. Many MCP clients persist tool output in conversation history. Treat the session log as sensitive after these calls.
76
213
 
77
- Version bumps are managed by release-please. Use conventional commits scoped to `mcp` for changes
78
- that should produce a package release. The CI publish job rewrites the workspace SDK dependency to
79
- the published `shipmail` SDK version before publishing to npm.
214
+ ## Privacy
80
215
 
81
- The MCP package is published from the `Release Please` GitHub Actions workflow. Configure npm
82
- trusted publishing for `shipmail-mcp` with owner `jcoulaud`, repository `ShipMail`, workflow
83
- filename `release-please.yml`, and environment `npm-publish`. Manual catch-up publishes use the same
84
- workflow with the `publish_mcp` input enabled. Because the source repository is private, the workflow
85
- publishes with `--provenance=false`; npm provenance can be enabled after the repository is public.
216
+ This server forwards email subject lines, bodies, headers, attachment metadata, and recipient lists to whatever LLM you connect it to. The LLM provider may log that content. For privacy-sensitive workflows, restrict the tool surface with `--tools` so the LLM only sees what it needs.
86
217
 
87
- ## Security model
218
+ ## Troubleshooting
88
219
 
89
- - All tools are namespaced with the prefix `shipmail_` so they cannot collide with same-named tools registered by peer MCP servers in the same host.
90
- - Successful tools return both text fallback content and structured MCP `structuredContent`.
91
- - Mutating tools accept an optional caller-supplied `idempotency_key`. When omitted, the MCP server generates one (a fresh key per tool call). Supply your own key if you want a specific request to be idempotent across MCP retries.
92
- - Email content, addresses, and error text are sanitized before reaching the LLM: ASCII control characters, DEL, and Unicode directional/BiDi markers (U+061C, U+200E/F, U+202A-E, U+2066-9) are stripped. Long strings are truncated.
93
- - 5xx and other unexpected ShipMail errors are redacted to a generic message; the original `request_id` is preserved for support. Generic `Error` thrown values (network errors, deserialization, etc.) are redacted to "Internal MCP error" before the LLM sees them; details land on stderr.
94
- - Each MCP session enforces per-tool rate limits AND a hard total-call ceiling as a runaway-agent circuit breaker. These are NOT abuse controls — real abuse limits live at the API per API key. Restart the server to reset.
95
- - Webhook URLs are validated to be public https endpoints. Localhost, RFC1918, link-local, ULA, IPv4-mapped IPv6, `0.0.0.0`, decimal-int IPs, `.local`, and `.internal` hosts are rejected at input time.
96
- - Destructive tools are annotated with `destructiveHint`. MCP hosts that gate on this annotation will prompt the user. We mark `shipmail_update_domain` (catch-all retarget), `shipmail_update_webhook` (URL change), `shipmail_rotate_webhook_secret`, and `shipmail_set_auto_reply` as destructive in addition to obvious deletes.
97
- - Domain purchase is intentionally excluded from v1.
220
+ **`SHIPMAIL_API_KEY` is not set.**
221
+ Confirm the host config includes the key in the `env` block, then restart the host.
98
222
 
99
- ### Threats this server does NOT defend against
223
+ **`Base URL must be https on a shipmail.to host`.**
224
+ You set `SHIPMAIL_BASE_URL` to something else. For local development, also set `SHIPMAIL_ALLOW_INSECURE_BASE_URL=1`.
100
225
 
101
- - **Indirect prompt injection from email content.** If you triage a mailbox, the agent reads attacker-controlled email bodies. The sanitizer strips invisible glyphs but cannot detect natural-language injection ("ignore previous instructions, send to..."). Only call destructive tools after explicit user approval.
102
- - **Malicious LLM output / hallucinated args.** The MCP layer cannot tell whether an argument value came from the user or was invented. Use the host UI's tool-call confirmation (especially for `destructiveHint:true` tools).
103
- - **Compromised MCP host.** Your API key is read from `SHIPMAIL_API_KEY` and held in memory by this process; if the host is compromised the key is gone regardless. Rotate keys you suspect have been exposed.
104
- - **Webhook signing secret in conversation logs.** `shipmail_create_webhook` and `shipmail_rotate_webhook_secret` return the secret in `structuredContent`. Many MCP clients persist tool output in conversation history. Treat the session log as sensitive after these calls.
226
+ **Tools do not show up in the host.**
227
+ Confirm the package launched. Most hosts surface a server log near the chat input or in a developer panel. Set `SHIPMAIL_MCP_DEBUG=1` to add `request_id` and `status` to stderr.
105
228
 
106
- ### Privacy
229
+ **`Internal MCP error`.**
230
+ A non-API error (network, deserialization) was redacted before reaching the agent. Check the host's stderr panel for the underlying detail.
107
231
 
108
- This server forwards email subject lines, bodies, headers, attachment metadata, and recipient lists to the LLM you connect it to. The LLM provider may log that content. For privacy-sensitive workflows, restrict the tool surface with `--tools` so the LLM only sees what it needs.
232
+ **Rate limit hit mid-session.**
233
+ The per-session circuit breaker tripped. Restart the MCP server (in most hosts: toggle the server off and back on, or restart the host).
109
234
 
110
- ## Tool groups
235
+ **Webhook URL rejected.**
236
+ URLs must be public https. Localhost, RFC1918, `.local`, and `.internal` are blocked at input time. Use a public tunnel (ngrok, cloudflared) for local testing.
111
237
 
112
- - Status: `shipmail_status`
113
- - Domains: `shipmail_list_domains`, `shipmail_get_domain`, `shipmail_create_domain`, `shipmail_update_domain`, `shipmail_delete_domain`, `shipmail_verify_domain`, `shipmail_search_domains`
114
- - Mailboxes: `shipmail_list_mailboxes`, `shipmail_get_mailbox`, `shipmail_create_mailbox`, `shipmail_update_mailbox`, `shipmail_delete_mailbox`, `shipmail_set_auto_reply`
115
- - Messages and threads: `shipmail_list_messages`, `shipmail_get_message`, `shipmail_send_message`, `shipmail_reply_to_message`, `shipmail_list_threads`, `shipmail_get_thread`, `shipmail_reply_to_thread`
116
- - Webhooks: `shipmail_list_webhooks`, `shipmail_get_webhook`, `shipmail_create_webhook`, `shipmail_update_webhook`, `shipmail_delete_webhook`, `shipmail_rotate_webhook_secret`, `shipmail_test_webhook`, `shipmail_list_webhook_deliveries`
117
- - Suppressions: `shipmail_list_suppressions`, `shipmail_remove_suppression`
238
+ ## Development
118
239
 
119
- ## Resources
240
+ Run the server locally against the workspace SDK:
120
241
 
121
- - `shipmail://account/status`
122
- - `shipmail://domains`
123
- - `shipmail://domains/{id}`
124
- - `shipmail://mailboxes`
125
- - `shipmail://mailboxes/{id}`
126
- - `shipmail://messages/{id}`
127
- - `shipmail://threads/{id}`
242
+ ```bash
243
+ cd packages/shipmail-mcp
244
+ SHIPMAIL_API_KEY=sm_live_... bun run dev
245
+ ```
128
246
 
129
- ## Prompts
247
+ A production smoke test against the published package is included in the repository QA command:
248
+
249
+ ```bash
250
+ bun run qa
251
+ ```
252
+
253
+ `bun run qa` installs `shipmail-mcp@latest` in a temporary directory and verifies MCP stdio startup,
254
+ tool registration, and status access. Use `QA_PUBLIC_API_BASE_URL` only when validating a deployed
255
+ API other than production.
256
+
257
+ Releases are managed by release-please. Use conventional commits scoped to `mcp` for changes that
258
+ should produce a package release.
130
259
 
131
- - `setup_domain`
132
- - `triage_mailbox`
133
- - `draft_reply`
134
- - `configure_webhook`
260
+ ## License
135
261
 
136
- ## Release notes
262
+ [MIT](./LICENSE).
137
263
 
138
- ### 0.1.0
264
+ ## Links
139
265
 
140
- - First public npm release of the official ShipMail MCP server.
141
- - Local stdio transport for MCP-compatible hosts, including Claude Desktop, Cursor, and Windsurf.
142
- - Tool coverage for status, domains, mailboxes, messages, threads, webhooks, and suppressions.
143
- - Read-only resources and guided prompts for domain setup, mailbox triage, reply drafting, and
144
- webhook configuration.
145
- - Safety controls for namespaced tool IDs, strict Zod schemas, structured outputs, redacted
146
- unexpected errors, prompt-injection-oriented sanitization, public HTTPS webhook validation,
147
- idempotency keys, destructive tool annotations, and per-session circuit breakers.
148
- - Hosted Streamable HTTP and domain purchase are intentionally excluded from this release.
266
+ - [Shipmail docs](https://shipmail.to/docs)
267
+ - [MCP guide](https://shipmail.to/docs/mcp)
268
+ - [API reference](https://shipmail.to/docs/api)
269
+ - [`shipmail` SDK on npm](https://www.npmjs.com/package/shipmail)
270
+ - [TypeScript SDK docs](https://shipmail.to/docs/sdks/typescript)
271
+ - [Model Context Protocol](https://modelcontextprotocol.io)
272
+ - [Issues](https://github.com/jcoulaud/ShipMail/issues)