Volcengine SMS MCP Server
An independent adapter for Volcengine SMS APIs. Each tool receives its complete API input, makes one upstream request and returns the result. It supports MCP 2026-07-28, stdio and stateless Streamable HTTP.
There is no database, business cache, qualification draft, stored preview, generic execution ticket, local file service or UI. It does not load or depend on a Skill. The client owns interaction and user confirmation; the SMS service owns business validation, applications, tasks and delivery records.
Tools
| Capability | Tools |
|---|---|
| Account and message groups | list_message_groups, get_message_group, get_account_information |
| Qualifications | get_qualification_requirements, list_qualifications, recognize_qualification_document, check_qualification_enterprise, check_qualification_person, apply_qualification |
| Mobile verification | send_verification_code, verify_code |
| Signatures and templates | list_signatures, apply_signature, list_templates, list_second_templates, apply_template |
| Sending and reports | send_sms, list_send_logs, get_send_statistics |
| Ordinary batches | get_batch_upload_url, get_batch_csv_template, create_batch_task, get_batch_task, list_batch_tasks, start_batch_task, cancel_batch_task |
There are 26 tools. Ordinary batches cover domestic notification and marketing SMS. Special notification batches, OTP batches and international SMS are outside this server's scope.
Tools preserve the upstream result structure and IDs. They do not select a template, rewrite content, deduplicate recipients, synthesize qualification-check tickets or decide whether a human approved an operation. A ticket returned by a qualification check is an upstream business receipt, not MCP state; the caller provides it when submitting the complete application. Client configuration must provide the application/scene/template values required by mobile verification APIs.
Qualification images must already be available through the existing SMS material channel. OCR and application tools accept its file references; there is no MCP-owned fileId, filesystem access or upload endpoint. The client must arrange a private material channel and handle OCR results and personal information appropriately. For batches, get_batch_upload_url returns the upstream signed upload URL and file key: upload the CSV directly, then pass that key as fileUrl to create_batch_task. Creating a task does not start it.
Install and configure
Python 3.11 or later is required. From source:
uv sync --extra test
uv run mcp-server-sms --transport stdio
For stdio, supply VOLCENGINE_ACCESS_KEY, VOLCENGINE_SECRET_KEY and optionally VOLCENGINE_SESSION_TOKEN in the client process environment. No local subject, encryption key or database URL is required. Do not place credentials in prompts or source control.
After version 0.1.0 has been published:
uvx --from 'mcp-server-sms==0.1.0' mcp-server-sms --transport stdio
Development clients can use an explicit wheel path before publication.
Streamable HTTP
mcp-server-sms --transport streamable-http --host 0.0.0.0 --port 8000 \
--public-url https://sms-mcp.example.com
Connect to /mcp. The deployment supplies HTTPS and access policy. Every HTTP request carries Authorization: Bearer <Base64 JSON> with the following credential fields:
{"AccessKeyId":"<access-key>","SecretAccessKey":"<secret-key>","SessionToken":"<optional-session-token>"}
This follows the repository's credential-passing convention; it is not an OAuth access token and Base64 is not encryption. The client or trusted gateway must construct the header outside model context. HTTP never falls back to process credentials. Each SMS call uses these credentials for official V4 signing, and SMS/IAM enforces resource access. The server has no OAuth login flow or persistent caller identity.
--public-url adds the deployment's HTTPS origin to DNS-rebinding protection. Without it, only local HTTP hosts are accepted. Requests do not require a protocol session or shared process state. Replicas can serve requests independently.
The HTTP connection pool is owned by the MCP server lifespan and closed at shutdown. Credentials and signed headers remain per-request, and response cookies are not retained between callers. Connection reuse does not introduce business state or a database.
Outcomes and confirmation
- The client must obtain user authorization before calling tools with side effects. Tool annotations describe behavior; they do not prove user consent.
- SMS API acceptance and delivery are separate. Use the returned Message ID with
list_send_logs; an empty result does not prove failure. - Application creation is not audit approval. Query qualification, signature or template state separately.
- No API calls are automatically retried. A timeout or unconfirmed write returns
outcome_unknown; do not blindly repeat it. This adapter does not provide durable request deduplication or an exactly-once guarantee. - Unstructured HTTP 400/401/403/404/405/413/415/422/429 responses are explicit rejections. Other unstructured statuses, server errors, and malformed or incomplete successful write responses remain uncertain. API-response errors include
http_statuswithout echoing the response body. - The upload API's top-level
urlis returned byte-for-byte, including its signed credential parameters. Other fields still undergo credential redaction. Treat the complete URL as a temporary capability; do not redact it before upload or expose it in logs. - A successful API call can contain a failed business check, such as an invalid verification code. Inspect the upstream
statusvalue. - The API adapter does not log request bodies or credentials. Upstream error text is not echoed, and authentication fields are removed from results; ordinary business content is preserved. Clients and deployment platforms must also configure their own logging and private-data handling.
Development
uv sync --extra test
uv run ruff check src tests
uv run pytest -q
uv build
uv run python -m twine check dist/*
Tests cover direct API calls, request serialization, credential isolation, uncertain writes, business error responses, file-response decoding and the stateless protocol. They do not submit real qualifications or send real SMS. Actual write tests require separate customer authorization.
API fields are checked against the official SMS SDK. V4 signing uses the official Python SDK. Qualification extension APIs use the existing SMS service contract; SDK coverage and account availability must be verified for the deployment.
The repository's package workflow builds PRs and publishes new versions after merge, with maintainer PyPI permissions. Package publication does not deploy a cloud service. Licensed under Apache-2.0.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcp_server_sms-0.1.0.tar.gz.
File metadata
- Download URL: mcp_server_sms-0.1.0.tar.gz
- Upload date:
- Size: 106.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a85571fdf1f29ddf6fb64de2f9334bd87ca7a9a58500da3f4620a6c5ed3f43b
|
|
| MD5 |
557df9014c9ad1c102ee04daf3110c16
|
|
| BLAKE2b-256 |
da40acc8a77767986f26fdd4e21812085d20934087a1b2e09d40c85f81dde25b
|
File details
Details for the file mcp_server_sms-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mcp_server_sms-0.1.0-py3-none-any.whl
- Upload date:
- Size: 21.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
017cc4433f197a2d1786cd71c969dd31be3a328d138e4a1d6d630aa1db6c1179
|
|
| MD5 |
e6ae7cc0a29597f0546e52660fd118f3
|
|
| BLAKE2b-256 |
09923a6ee4d4390e68a491d55ec33fd8f9411a95966587e80d3c94cbdc21e721
|