sendsoon-mcp 0.1.0__tar.gz
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.
- sendsoon_mcp-0.1.0/.gitignore +26 -0
- sendsoon_mcp-0.1.0/LICENSE +21 -0
- sendsoon_mcp-0.1.0/PKG-INFO +144 -0
- sendsoon_mcp-0.1.0/README.md +112 -0
- sendsoon_mcp-0.1.0/pyproject.toml +91 -0
- sendsoon_mcp-0.1.0/src/sendsoon_mcp/__init__.py +10 -0
- sendsoon_mcp-0.1.0/src/sendsoon_mcp/__main__.py +20 -0
- sendsoon_mcp-0.1.0/src/sendsoon_mcp/client.py +317 -0
- sendsoon_mcp-0.1.0/src/sendsoon_mcp/config.py +22 -0
- sendsoon_mcp-0.1.0/src/sendsoon_mcp/errors.py +151 -0
- sendsoon_mcp-0.1.0/src/sendsoon_mcp/server.py +18 -0
- sendsoon_mcp-0.1.0/src/sendsoon_mcp/tools/__init__.py +20 -0
- sendsoon_mcp-0.1.0/src/sendsoon_mcp/tools/ip_lookup.py +28 -0
- sendsoon_mcp-0.1.0/src/sendsoon_mcp/tools/markitdown_convert.py +31 -0
- sendsoon_mcp-0.1.0/src/sendsoon_mcp/tools/send_email.py +53 -0
- sendsoon_mcp-0.1.0/src/sendsoon_mcp/validation.py +195 -0
- sendsoon_mcp-0.1.0/tests/__init__.py +1 -0
- sendsoon_mcp-0.1.0/tests/test_client.py +195 -0
- sendsoon_mcp-0.1.0/tests/test_tools.py +110 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
node_modules/
|
|
2
|
+
.pnpm-store/
|
|
3
|
+
dist/
|
|
4
|
+
mcp/bin/
|
|
5
|
+
npm/bin/
|
|
6
|
+
coverage/
|
|
7
|
+
*.tgz
|
|
8
|
+
*.tsbuildinfo
|
|
9
|
+
.env
|
|
10
|
+
.env.*
|
|
11
|
+
.DS_Store
|
|
12
|
+
*.log
|
|
13
|
+
.cursor/rules/
|
|
14
|
+
|
|
15
|
+
# Python
|
|
16
|
+
__pycache__/
|
|
17
|
+
*.py[cod]
|
|
18
|
+
.pytest_cache/
|
|
19
|
+
.mypy_cache/
|
|
20
|
+
.ruff_cache/
|
|
21
|
+
.venv/
|
|
22
|
+
venv/
|
|
23
|
+
python/dist/
|
|
24
|
+
python/*.egg-info/
|
|
25
|
+
python/src/*.egg-info/
|
|
26
|
+
*.egg-info/
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 sendsoon
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: sendsoon-mcp
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: MCP server for SendSoon: send email, look up public IP information, and convert files to Markdown from Claude, Cursor, Codex, and other AI agents.
|
|
5
|
+
Project-URL: Homepage, https://github.com/sendsoon/ai
|
|
6
|
+
Project-URL: Documentation, https://github.com/sendsoon/ai/tree/main/python
|
|
7
|
+
Project-URL: Repository, https://github.com/sendsoon/ai
|
|
8
|
+
Project-URL: Issues, https://github.com/sendsoon/ai/issues
|
|
9
|
+
Author: SendSoon
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: claude,codex,cursor,email,ip-lookup,markitdown,mcp,mcp-server,model-context-protocol,sendsoon
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Communications :: Email
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Requires-Dist: httpx>=0.27
|
|
24
|
+
Requires-Dist: mcp<2,>=1.2.0
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: mypy>=1.13; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
|
|
28
|
+
Requires-Dist: pytest-httpx>=0.35; extra == 'dev'
|
|
29
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
30
|
+
Requires-Dist: ruff>=0.8; extra == 'dev'
|
|
31
|
+
Description-Content-Type: text/markdown
|
|
32
|
+
|
|
33
|
+
# sendsoon-mcp
|
|
34
|
+
|
|
35
|
+
MCP server for [SendSoon](https://www.sendsoonai.com/). Gives Claude, Cursor, Codex, and other MCP clients the ability to send email, look up public IP information, and convert files to Markdown.
|
|
36
|
+
|
|
37
|
+
**PyPI:** [`sendsoon-mcp`](https://pypi.org/project/sendsoon-mcp/)
|
|
38
|
+
**Server name:** `sendsoon`
|
|
39
|
+
**Transport:** `stdio`
|
|
40
|
+
**Tools:** `send_email`, `ip_lookup`, `markitdown_convert`
|
|
41
|
+
|
|
42
|
+
Python package version is managed independently from the Node package [`@sendsoon/ai`](https://www.npmjs.com/package/@sendsoon/ai). Tool names and request/response semantics stay aligned.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Install
|
|
47
|
+
|
|
48
|
+
Recommended (no global install):
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
uvx sendsoon-mcp
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Or install the CLI:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pip install sendsoon-mcp
|
|
58
|
+
sendsoon-mcp
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Requirements:** Python 3.10+, and a client that supports local stdio MCP servers.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Configuration
|
|
66
|
+
|
|
67
|
+
| Variable | Required | Description |
|
|
68
|
+
| --- | --- | --- |
|
|
69
|
+
| `SENDSOON_EMAIL_RECIPIENT` | **Yes** | The **only** recipient address allowed for `send_email`. The `to` parameter must match this value exactly (case-insensitive). |
|
|
70
|
+
| `SENDSOON_API_KEY` | No | Leave empty for anonymous trial: one public IP may send up to **3 test emails per day**. After that, register at [sendsoonai.com](https://sendsoonai.com/login-register), generate a `ssk_live_...` Key at [Profile](https://www.sendsoonai.com/profile), and set it here. |
|
|
71
|
+
| `SENDSOON_API_BASE_URL` | No | Defaults to `https://www.sendsoonai.com`. HTTPS required except `http://localhost`. |
|
|
72
|
+
|
|
73
|
+
Never commit a real Key to Git or share it with anyone.
|
|
74
|
+
|
|
75
|
+
Invalid or revoked Keys are rejected and do **not** fall back to the anonymous quota.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Client configuration
|
|
80
|
+
|
|
81
|
+
### Cursor / Claude Desktop
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"mcpServers": {
|
|
86
|
+
"sendsoon": {
|
|
87
|
+
"command": "uvx",
|
|
88
|
+
"args": ["sendsoon-mcp"],
|
|
89
|
+
"env": {
|
|
90
|
+
"SENDSOON_EMAIL_RECIPIENT": "<YOUR_EMAIL>",
|
|
91
|
+
"SENDSOON_API_KEY": ""
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
After `pip install sendsoon-mcp`, you can use `"command": "sendsoon-mcp"` with an empty `args` array (or omit `args`).
|
|
99
|
+
|
|
100
|
+
### Codex
|
|
101
|
+
|
|
102
|
+
```toml
|
|
103
|
+
[mcp_servers.sendsoon]
|
|
104
|
+
command = "uvx"
|
|
105
|
+
args = ["sendsoon-mcp"]
|
|
106
|
+
|
|
107
|
+
[mcp_servers.sendsoon.env]
|
|
108
|
+
SENDSOON_EMAIL_RECIPIENT = "<YOUR_EMAIL>"
|
|
109
|
+
SENDSOON_API_KEY = ""
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Claude Code
|
|
113
|
+
|
|
114
|
+
```powershell
|
|
115
|
+
claude mcp add --transport stdio --scope user --env SENDSOON_EMAIL_RECIPIENT=<YOUR_EMAIL> sendsoon -- uvx sendsoon-mcp
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Tools
|
|
121
|
+
|
|
122
|
+
| Tool | Input highlights | Notes |
|
|
123
|
+
| --- | --- | --- |
|
|
124
|
+
| `send_email` | `to`, `subject`, `body`, optional `content_type`, `idempotency_key` | Recipient must match `SENDSOON_EMAIL_RECIPIENT` |
|
|
125
|
+
| `ip_lookup` | `ip` | Public IPv4/IPv6 only |
|
|
126
|
+
| `markitdown_convert` | `filename`, `content_base64` | Remote SendSoon conversion (max 10 MB decoded); same semantics as the Node MCP |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Development
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
cd python
|
|
134
|
+
python -m pip install -e ".[dev]"
|
|
135
|
+
pytest
|
|
136
|
+
ruff check src tests
|
|
137
|
+
mypy
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## License
|
|
143
|
+
|
|
144
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# sendsoon-mcp
|
|
2
|
+
|
|
3
|
+
MCP server for [SendSoon](https://www.sendsoonai.com/). Gives Claude, Cursor, Codex, and other MCP clients the ability to send email, look up public IP information, and convert files to Markdown.
|
|
4
|
+
|
|
5
|
+
**PyPI:** [`sendsoon-mcp`](https://pypi.org/project/sendsoon-mcp/)
|
|
6
|
+
**Server name:** `sendsoon`
|
|
7
|
+
**Transport:** `stdio`
|
|
8
|
+
**Tools:** `send_email`, `ip_lookup`, `markitdown_convert`
|
|
9
|
+
|
|
10
|
+
Python package version is managed independently from the Node package [`@sendsoon/ai`](https://www.npmjs.com/package/@sendsoon/ai). Tool names and request/response semantics stay aligned.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Install
|
|
15
|
+
|
|
16
|
+
Recommended (no global install):
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
uvx sendsoon-mcp
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Or install the CLI:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pip install sendsoon-mcp
|
|
26
|
+
sendsoon-mcp
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Requirements:** Python 3.10+, and a client that supports local stdio MCP servers.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Configuration
|
|
34
|
+
|
|
35
|
+
| Variable | Required | Description |
|
|
36
|
+
| --- | --- | --- |
|
|
37
|
+
| `SENDSOON_EMAIL_RECIPIENT` | **Yes** | The **only** recipient address allowed for `send_email`. The `to` parameter must match this value exactly (case-insensitive). |
|
|
38
|
+
| `SENDSOON_API_KEY` | No | Leave empty for anonymous trial: one public IP may send up to **3 test emails per day**. After that, register at [sendsoonai.com](https://sendsoonai.com/login-register), generate a `ssk_live_...` Key at [Profile](https://www.sendsoonai.com/profile), and set it here. |
|
|
39
|
+
| `SENDSOON_API_BASE_URL` | No | Defaults to `https://www.sendsoonai.com`. HTTPS required except `http://localhost`. |
|
|
40
|
+
|
|
41
|
+
Never commit a real Key to Git or share it with anyone.
|
|
42
|
+
|
|
43
|
+
Invalid or revoked Keys are rejected and do **not** fall back to the anonymous quota.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Client configuration
|
|
48
|
+
|
|
49
|
+
### Cursor / Claude Desktop
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"mcpServers": {
|
|
54
|
+
"sendsoon": {
|
|
55
|
+
"command": "uvx",
|
|
56
|
+
"args": ["sendsoon-mcp"],
|
|
57
|
+
"env": {
|
|
58
|
+
"SENDSOON_EMAIL_RECIPIENT": "<YOUR_EMAIL>",
|
|
59
|
+
"SENDSOON_API_KEY": ""
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
After `pip install sendsoon-mcp`, you can use `"command": "sendsoon-mcp"` with an empty `args` array (or omit `args`).
|
|
67
|
+
|
|
68
|
+
### Codex
|
|
69
|
+
|
|
70
|
+
```toml
|
|
71
|
+
[mcp_servers.sendsoon]
|
|
72
|
+
command = "uvx"
|
|
73
|
+
args = ["sendsoon-mcp"]
|
|
74
|
+
|
|
75
|
+
[mcp_servers.sendsoon.env]
|
|
76
|
+
SENDSOON_EMAIL_RECIPIENT = "<YOUR_EMAIL>"
|
|
77
|
+
SENDSOON_API_KEY = ""
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Claude Code
|
|
81
|
+
|
|
82
|
+
```powershell
|
|
83
|
+
claude mcp add --transport stdio --scope user --env SENDSOON_EMAIL_RECIPIENT=<YOUR_EMAIL> sendsoon -- uvx sendsoon-mcp
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Tools
|
|
89
|
+
|
|
90
|
+
| Tool | Input highlights | Notes |
|
|
91
|
+
| --- | --- | --- |
|
|
92
|
+
| `send_email` | `to`, `subject`, `body`, optional `content_type`, `idempotency_key` | Recipient must match `SENDSOON_EMAIL_RECIPIENT` |
|
|
93
|
+
| `ip_lookup` | `ip` | Public IPv4/IPv6 only |
|
|
94
|
+
| `markitdown_convert` | `filename`, `content_base64` | Remote SendSoon conversion (max 10 MB decoded); same semantics as the Node MCP |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Development
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
cd python
|
|
102
|
+
python -m pip install -e ".[dev]"
|
|
103
|
+
pytest
|
|
104
|
+
ruff check src tests
|
|
105
|
+
mypy
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## License
|
|
111
|
+
|
|
112
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "sendsoon-mcp"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "MCP server for SendSoon: send email, look up public IP information, and convert files to Markdown from Claude, Cursor, Codex, and other AI agents."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
license = { text = "MIT" }
|
|
8
|
+
authors = [{ name = "SendSoon" }]
|
|
9
|
+
keywords = [
|
|
10
|
+
"mcp",
|
|
11
|
+
"model-context-protocol",
|
|
12
|
+
"mcp-server",
|
|
13
|
+
"sendsoon",
|
|
14
|
+
"email",
|
|
15
|
+
"ip-lookup",
|
|
16
|
+
"markitdown",
|
|
17
|
+
"claude",
|
|
18
|
+
"cursor",
|
|
19
|
+
"codex",
|
|
20
|
+
]
|
|
21
|
+
classifiers = [
|
|
22
|
+
"Development Status :: 4 - Beta",
|
|
23
|
+
"Intended Audience :: Developers",
|
|
24
|
+
"License :: OSI Approved :: MIT License",
|
|
25
|
+
"Programming Language :: Python :: 3",
|
|
26
|
+
"Programming Language :: Python :: 3.10",
|
|
27
|
+
"Programming Language :: Python :: 3.11",
|
|
28
|
+
"Programming Language :: Python :: 3.12",
|
|
29
|
+
"Programming Language :: Python :: 3.13",
|
|
30
|
+
"Topic :: Communications :: Email",
|
|
31
|
+
]
|
|
32
|
+
dependencies = [
|
|
33
|
+
"mcp>=1.2.0,<2",
|
|
34
|
+
"httpx>=0.27",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
[project.urls]
|
|
38
|
+
Homepage = "https://github.com/sendsoon/ai"
|
|
39
|
+
Documentation = "https://github.com/sendsoon/ai/tree/main/python"
|
|
40
|
+
Repository = "https://github.com/sendsoon/ai"
|
|
41
|
+
Issues = "https://github.com/sendsoon/ai/issues"
|
|
42
|
+
|
|
43
|
+
[project.scripts]
|
|
44
|
+
sendsoon-mcp = "sendsoon_mcp.__main__:main"
|
|
45
|
+
|
|
46
|
+
[project.optional-dependencies]
|
|
47
|
+
dev = [
|
|
48
|
+
"pytest>=8.0",
|
|
49
|
+
"pytest-asyncio>=0.24",
|
|
50
|
+
"pytest-httpx>=0.35",
|
|
51
|
+
"ruff>=0.8",
|
|
52
|
+
"mypy>=1.13",
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
[build-system]
|
|
56
|
+
requires = ["hatchling"]
|
|
57
|
+
build-backend = "hatchling.build"
|
|
58
|
+
|
|
59
|
+
[tool.hatch.build.targets.wheel]
|
|
60
|
+
packages = ["src/sendsoon_mcp"]
|
|
61
|
+
|
|
62
|
+
[tool.hatch.build.targets.sdist]
|
|
63
|
+
include = [
|
|
64
|
+
"/src/sendsoon_mcp",
|
|
65
|
+
"/tests",
|
|
66
|
+
"/README.md",
|
|
67
|
+
"/LICENSE",
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
[tool.pytest.ini_options]
|
|
71
|
+
asyncio_mode = "auto"
|
|
72
|
+
asyncio_default_fixture_loop_scope = "function"
|
|
73
|
+
testpaths = ["tests"]
|
|
74
|
+
|
|
75
|
+
[tool.ruff]
|
|
76
|
+
line-length = 100
|
|
77
|
+
target-version = "py310"
|
|
78
|
+
src = ["src/sendsoon_mcp", "tests"]
|
|
79
|
+
|
|
80
|
+
[tool.ruff.lint]
|
|
81
|
+
select = ["E", "F", "I", "UP", "B"]
|
|
82
|
+
|
|
83
|
+
[tool.ruff.lint.isort]
|
|
84
|
+
known-first-party = ["sendsoon_mcp"]
|
|
85
|
+
|
|
86
|
+
[tool.mypy]
|
|
87
|
+
python_version = "3.10"
|
|
88
|
+
strict = true
|
|
89
|
+
packages = ["sendsoon_mcp"]
|
|
90
|
+
mypy_path = "src"
|
|
91
|
+
explicit_package_bases = true
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""SendSoon MCP server package."""
|
|
2
|
+
|
|
3
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
__version__ = version("sendsoon-mcp")
|
|
7
|
+
except PackageNotFoundError: # pragma: no cover - local editable without metadata
|
|
8
|
+
__version__ = "0.1.0"
|
|
9
|
+
|
|
10
|
+
__all__ = ["__version__"]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""CLI / module entrypoint for the SendSoon MCP server."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def main() -> None:
|
|
9
|
+
from .server import run
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
run()
|
|
13
|
+
except Exception as error: # noqa: BLE001 - top-level process boundary
|
|
14
|
+
message = str(error) if str(error) else type(error).__name__
|
|
15
|
+
print(f"[sendsoon] Failed to start MCP server: {message}", file=sys.stderr)
|
|
16
|
+
raise SystemExit(1) from error
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
if __name__ == "__main__":
|
|
20
|
+
main()
|