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.
- package/README.md +214 -90
- package/dist/index.js +863 -10
- package/package.json +12 -5
- package/server.json +31 -0
package/README.md
CHANGED
|
@@ -1,8 +1,41 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Shipmail MCP Server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/shipmail-mcp)
|
|
4
|
+
[](https://www.npmjs.com/package/shipmail-mcp)
|
|
5
|
+
[](https://www.npmjs.com/package/shipmail-mcp)
|
|
6
|
+
[](./LICENSE)
|
|
4
7
|
|
|
5
|
-
|
|
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
|
-
|
|
54
|
+
Restart Claude Desktop. The Shipmail tools appear under the tools menu.
|
|
22
55
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
157
|
+
## Resources
|
|
53
158
|
|
|
54
|
-
|
|
159
|
+
Read-only resources for inspection without tool calls:
|
|
55
160
|
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
176
|
+
Pre-built prompts the agent can use as guided workflows:
|
|
65
177
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
##
|
|
218
|
+
## Troubleshooting
|
|
88
219
|
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
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
|
-
|
|
102
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
240
|
+
Run the server locally against the workspace SDK:
|
|
120
241
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
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
|
-
|
|
132
|
-
- `triage_mailbox`
|
|
133
|
-
- `draft_reply`
|
|
134
|
-
- `configure_webhook`
|
|
260
|
+
## License
|
|
135
261
|
|
|
136
|
-
|
|
262
|
+
[MIT](./LICENSE).
|
|
137
263
|
|
|
138
|
-
|
|
264
|
+
## Links
|
|
139
265
|
|
|
140
|
-
-
|
|
141
|
-
-
|
|
142
|
-
-
|
|
143
|
-
-
|
|
144
|
-
|
|
145
|
-
-
|
|
146
|
-
|
|
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)
|