# AceDataCloud MCPs
Monorepo for all AceDataCloud MCP (Model Context Protocol) servers.
## Servers
| Directory | Standalone Repo | PyPI Package | Category | Documentation |
|---|---|---|---|---|
| `acedatacloud/` | [AceDataCloudMCP](https://github.com/AceDataCloud/AceDataCloudMCP) | [mcp-acedatacloud](https://pypi.org/project/mcp-acedatacloud/) | Account | [Documentation](https://platform.acedata.cloud/documents/acedatacloud-mcp?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_acedatacloud_mcp) |
| `face/` | [FaceTransformMCP](https://github.com/AceDataCloud/FaceTransformMCP) | [mcp-face-transform](https://pypi.org/project/mcp-face-transform/) | Vision | [Service details](https://platform.acedata.cloud/services/8efa1d83-9b75-4562-b44a-af95ce563d05?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_services_8efa1d83_9b75_4562_b44a_af95ce563d05) |
| `fish/` | [FishMCP](https://github.com/AceDataCloud/FishMCP) | [mcp-fish](https://pypi.org/project/mcp-fish/) | Audio | [Documentation](https://platform.acedata.cloud/documents/fish?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_fish) |
| `flux/` | [FluxMCP](https://github.com/AceDataCloud/FluxMCP) | [mcp-flux-pro](https://pypi.org/project/mcp-flux-pro/) | Image | [Documentation](https://platform.acedata.cloud/documents/flux-mcp?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_flux_mcp) |
| `hailuo/` | [HailuoMCP](https://github.com/AceDataCloud/HailuoMCP) | [mcp-hailuo](https://pypi.org/project/mcp-hailuo/) | Video | [Documentation](https://platform.acedata.cloud/documents/hailuo?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_hailuo) |
| `happyhorse/` | [HappyHorseMCP](https://github.com/AceDataCloud/HappyHorseMCP) | [mcp-happyhorse](https://pypi.org/project/mcp-happyhorse/) | Video | [Documentation](https://platform.acedata.cloud/documents/happyhorse?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_happyhorse) |
| `kling/` | [KlingMCP](https://github.com/AceDataCloud/KlingMCP) | [mcp-kling](https://pypi.org/project/mcp-kling/) | Video | [Documentation](https://platform.acedata.cloud/documents/kling?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_kling) |
| `luma/` | [LumaMCP](https://github.com/AceDataCloud/LumaMCP) | [mcp-luma](https://pypi.org/project/mcp-luma/) | Video | [Documentation](https://platform.acedata.cloud/documents/luma-mcp?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_luma_mcp) |
| `maestro/` | [MaestroMCP](https://github.com/AceDataCloud/MaestroMCP) | [mcp-maestro](https://pypi.org/project/mcp-maestro/) | Video Production | [Documentation](https://platform.acedata.cloud/documents/maestro?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_maestro) |
| `midjourney/` | [MidjourneyMCP](https://github.com/AceDataCloud/MidjourneyMCP) | [mcp-midjourney](https://pypi.org/project/mcp-midjourney/) | Image | [Service details](https://platform.acedata.cloud/services/d87e5e99-b797-4ade-9e73-b896896b0461?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_services_d87e5e99_b797_4ade_9e73_b896896b0461) |
| `nanobanana/` | [NanoBananaMCP](https://github.com/AceDataCloud/NanoBananaMCP) | [mcp-nanobanana-pro](https://pypi.org/project/mcp-nanobanana-pro/) | Image | [Documentation](https://platform.acedata.cloud/documents/nano-banana-mcp?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_nano_banana_mcp) |
| `producer/` | [ProducerMCP](https://github.com/AceDataCloud/ProducerMCP) | [mcp-producer](https://pypi.org/project/mcp-producer/) | Music | [Documentation](https://platform.acedata.cloud/documents/producer?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_producer) |
| `seedance/` | [SeedanceMCP](https://github.com/AceDataCloud/SeedanceMCP) | [mcp-seedance](https://pypi.org/project/mcp-seedance/) | Video | [Documentation](https://platform.acedata.cloud/documents/seedance-mcp?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_seedance_mcp) |
| `qwen-image/` | [QwenImageMCP](https://github.com/AceDataCloud/QwenImageMCP) | [mcp-qwen-image](https://pypi.org/project/mcp-qwen-image/) | Image | [Documentation](https://platform.acedata.cloud/documents/qwen-image?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_qwen_image) |
| `seedream/` | [SeedreamMCP](https://github.com/AceDataCloud/SeedreamMCP) | [mcp-seedream-pro](https://pypi.org/project/mcp-seedream-pro/) | Image | [Documentation](https://platform.acedata.cloud/documents/seedream-mcp?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_seedream_mcp) |
| `serp/` | [SerpMCP](https://github.com/AceDataCloud/SerpMCP) | [mcp-serp](https://pypi.org/project/mcp-serp/) | Search | [Documentation](https://platform.acedata.cloud/documents/serp-mcp?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_serp_mcp) |
| `shorturl/` | [ShortURLMCP](https://github.com/AceDataCloud/ShortURLMCP) | [mcp-shorturl](https://pypi.org/project/mcp-shorturl/) | Utility | [Documentation](https://platform.acedata.cloud/documents/short-url-mcp?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_short_url_mcp) |
| `suno/` | [SunoMCP](https://github.com/AceDataCloud/SunoMCP) | [mcp-suno](https://pypi.org/project/mcp-suno/) | Music | [Documentation](https://platform.acedata.cloud/documents/suno-mcp?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_suno_mcp) |
| `veo/` | [VeoMCP](https://github.com/AceDataCloud/VeoMCP) | [mcp-veo](https://pypi.org/project/mcp-veo/) | Video | [Documentation](https://platform.acedata.cloud/documents/veo-mcp?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_veo_mcp) |
| `wan/` | [WanMCP](https://github.com/AceDataCloud/WanMCP) | [mcp-wan](https://pypi.org/project/mcp-wan/) | Video | [Documentation](https://platform.acedata.cloud/documents/wan?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_wan) |
| `aichat/` | [AiChatMCP](https://github.com/AceDataCloud/AiChatMCP) | [mcp-aichat](https://pypi.org/project/mcp-aichat/) | Chat | [Documentation](https://platform.acedata.cloud/documents/aichat?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_aichat) |
| `digitalhuman/` | [DigitalHumanMCP](https://github.com/AceDataCloud/DigitalHumanMCP) | [mcp-digitalhuman](https://pypi.org/project/mcp-digitalhuman/) | Video | [Documentation](https://platform.acedata.cloud/documents/digitalhuman?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_digitalhuman) |
| `hcaptcha/` | [HCaptchaMCP](https://github.com/AceDataCloud/HCaptchaMCP) | [mcp-hcaptcha](https://pypi.org/project/mcp-hcaptcha/) | CAPTCHA | [Service details](https://platform.acedata.cloud/services/018c653e-4f1b-433f-82f9-732ef2767040?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_services_018c653e_4f1b_433f_82f9_732ef2767040) |
| `image2text/` | [Image2TextMCP](https://github.com/AceDataCloud/Image2TextMCP) | [mcp-image2text](https://pypi.org/project/mcp-image2text/) | OCR | [Service details](https://platform.acedata.cloud/services/2aaa7faf-099e-410e-82f3-8d78170f25bb?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_services_2aaa7faf_099e_410e_82f3_8d78170f25bb) |
| `recaptcha/` | [RecaptchaMCP](https://github.com/AceDataCloud/RecaptchaMCP) | [mcp-recaptcha](https://pypi.org/project/mcp-recaptcha/) | CAPTCHA | [Service details](https://platform.acedata.cloud/services/485cc5ca-7f1e-48e5-944e-1fe82b4637e8?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_services_485cc5ca_7f1e_48e5_944e_1fe82b4637e8) |
| `turnstile/` | [TurnstileMCP](https://github.com/AceDataCloud/TurnstileMCP) | [mcp-turnstile](https://pypi.org/project/mcp-turnstile/) | CAPTCHA | [Documentation](https://platform.acedata.cloud/documents/turnstile?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_turnstile) |
| `discord-bot/` | [DiscordBotMCP](https://github.com/AceDataCloud/DiscordBotMCP) | [mcp-discord-bot](https://pypi.org/project/mcp-discord-bot/) | Messaging | [Documentation](https://platform.acedata.cloud/documents/development_discord_bot?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_development_discord_bot) |
| `glm/` | [GLMMCP](https://github.com/AceDataCloud/GLMMCP) | [mcp-glm](https://pypi.org/project/mcp-glm/) | Chat | [Documentation](https://platform.acedata.cloud/documents/glm-chat-completions?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_glm_chat_completions) |
| `grok/` | [GrokMCP](https://github.com/AceDataCloud/GrokMCP) | [mcp-grok](https://pypi.org/project/mcp-grok/) | Video | [Documentation](https://platform.acedata.cloud/documents/grok?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_grok) |
| `minimax/` | [MinimaxMCP](https://github.com/AceDataCloud/MinimaxMCP) | [mcp-minimax](https://pypi.org/project/mcp-minimax/) | Video | [Documentation](https://platform.acedata.cloud/documents/minimax-videos?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_minimax_videos) |
| `openai/` | [OpenAIMCP](https://github.com/AceDataCloud/OpenAIMCP) | [mcp-openai-pro](https://pypi.org/project/mcp-openai-pro/) | AI APIs | [Documentation](https://platform.acedata.cloud/documents/openai?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_openai) |
| `webextrator/` | [WebExtratorMCP](https://github.com/AceDataCloud/WebExtratorMCP) | [mcp-webextrator](https://pypi.org/project/mcp-webextrator/) | Web & Data | [Documentation](https://platform.acedata.cloud/documents/webextrator?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_documents_webextrator) |
## Connect to a server
Each active package README now starts with its actual connection choices. For the verified hosted servers, add the HTTPS MCP URL and use your client's OAuth flow, or use an API credential only when an explicit Bearer header is needed. Local stdio packages need an API credential even though the server process runs on your machine. [Suno](suno/README.md) shows the full music-generation flow; other READMEs use their own endpoint and tool names.
Two exceptions matter: [AceDataCloudMCP](acedatacloud/README.md) manages the account and uses a **platform token**, while [DiscordBotMCP](discord-bot/README.md) connects to a user's deployed Discord Agent Proxy and uses that proxy's URL and token. Five packages—Digital Human, hCaptcha, Image2Text, reCAPTCHA and Turnstile—currently document local setup because their public hosted HTTPS endpoints could not be verified. Sora remains retired.
## Obtain the right credential
For generation/search API keys, follow the illustrated [application-key steps](suno/README.md#api-token-hosted-server): register or sign in, initialize General application if needed, open Keys / Manage Keys, create or copy a key, then store it in your client. Check service access, limits and balance before your first request.
The account-management server uses [Account Tokens](https://platform.acedata.cloud/console/platform-tokens?utm_source=github&utm_medium=referral&utm_campaign=evergreen&utm_content=mcp_catalog_readme_account_token) instead; see its [creation steps](acedatacloud/README.md#explicit-platform-token). Hosted OAuth users follow browser sign-in instead of copying a key. The Discord Agent Proxy uses the URL and token issued by that deployment, as explained in [its prerequisites](discord-bot/README.md#prerequisites).
## Retired
| Directory | Standalone Repo | PyPI Package | Status |
|---|---|---|---|
| `sora/` | [SoraMCP](https://github.com/AceDataCloud/SoraMCP) | [mcp-sora](https://pypi.org/project/mcp-sora/) | Retired; retained for historical reference |
## Service discovery in the official MCP Registry
Suno, Seedance, HappyHorse and Nano Banana keep their existing independent Registry entries and packages. Display titles identify them as integrations **by Ace Data Cloud**; namespace and package identities remain stable. The canonical `scripts/mcp_catalog.json` supplies Registry titles, descriptions, icons and profile metadata. Run `python3 -m scripts.registry_metadata --check` to check the projection, or omit `--check` to refresh it. Website destinations use the existing documentation catalog and current marketing link contract.
GPT Image has a separate image-only profile in the existing `openai/` source: [`openai/GPT_IMAGE.md`](openai/GPT_IMAGE.md). Its published `mcp-gpt-image` manifest selects `mcp-openai-pro --profile gpt-image` and exposes five image/task tools, excluding the general OpenAI tool set and remote. The official `io.github.AceDataCloud/mcp-gpt-image` listing and matching `mcp-openai-pro` package were read back at version `2026.10.18.2` on 2026-10-19. The profile reuses maintained image/task code rather than duplicating a provider implementation or renaming the general server.
The official Registry is a metadata directory, not a default LLM provider selector. Its current search matches server names; a display title does not add spaced search aliases. Downstream catalogs may render titles/icons and provide richer search, but their ingestion and actual client installation must be checked separately.
Runtime `initialize.serverInfo.icons` is a separate projection. Only catalog
entries with `runtime_icon` opt in: `"registry"` reuses that service's canonical
Registry asset, while an explicit icon supports a generic server without
borrowing a profile's identity. Run `python3 -m scripts.runtime_metadata`
(`--check` checks drift) and commit the generated `core/server.py` icon edits.
This changes neither server names/tools nor Registry manifests, Smithery server
cards or listing metadata. Valid protocol metadata does not prove that a client
has fetched or rendered the image.
## Publishing
The combined [Ace Data Cloud MCP extension](https://marketplace.visualstudio.com/items?itemName=acedatacloud.mcp-toolbox)
is maintained in `vscode-bundle/`. `sync.yaml` distributes that source to
[VSCodeMCP](https://github.com/AceDataCloud/VSCodeMCP), whose publish workflow
builds and verifies the Marketplace release. Individual service extensions remain
independent.
Enable a verified hosted service through `vscode_bundle` in
`scripts/mcp_catalog.json`, then run `python3 scripts/build_vscode_bundle.py`.
The generator reads hosted URLs and credential kinds from each `server.json`;
it excludes retired services and rejects unexpected credential destinations.
Normal CI checks the generated service list and runs the bundle's tests/package
build. Update the source here rather than editing the standalone repository.
Each MCP is published to multiple channels automatically on every push to `main`:
| Channel | Status |
|---|---|
| [PyPI](https://pypi.org/) | Active servers published |
| [VS Code Marketplace](https://marketplace.visualstudio.com/) | Active extensions published |
| [JetBrains Marketplace](https://plugins.jetbrains.com/vendor/acedatacloud) | Per-plugin upload and approval; source sync does not imply public availability |
| [Smithery](https://smithery.ai/) | Existing URL publishers verify each accepted release; listing and installation require separate checks |
| [MCP Registry](https://registry.modelcontextprotocol.io/) | Active servers published |
Smithery CLI returns a pending receipt in CI. Existing Smithery publishing jobs wait for that exact release to reach `SUCCESS`; failure, authorization required, and timeout fail the job. Keep `shared/smithery_release.py` and the standalone distribution copies in sync with `python3 scripts/sync_smithery_release.py` (`--check` verifies them). A successful release does not prove a new user can install, authorize, or complete a paid tool call.
Versioning uses **CalVer** (`YYYY.M.D.BUILD`), auto-generated at publish time.
## How It Works
### Sync Pipeline
PlatformBackend's daily ecosystem CronJob prepares incremental capability PRs
using a pinned Backend source. Existing CI and human review gate each update.
The previous dispatch/Copilot sync workflows are retired.
After a reviewed PR lands, `sync-to-repos.yml` distributes the affected packages
to their standalone repositories for publishing.
### Rules
- This monorepo is the **source of truth**. Do not edit standalone repos directly.
- The mapping between subdirectories and standalone repos is defined in [`sync.yaml`](sync.yaml).
- CI runs lint (`ruff`) and tests (`pytest`, Python 3.10/3.11/3.12) on every push and PR.
## Development
### Shared OAuth
The 28 servers listed in [`scripts/sync_oauth.py`](scripts/sync_oauth.py) maintain
their identical OAuth implementation in [`shared/oauth.py`](shared/oauth.py).
Edit that source, then run:
```bash
python3 scripts/sync_oauth.py
python3 scripts/sync_oauth.py --check
python3 -m unittest scripts.test_sync_oauth -v
```
Commit the generated `core/oauth.py` copies together with the shared-source
change. CI rejects stale or manually changed copies; these per-server changes
also trigger the existing test, build, and standalone-repository sync matrices.
The copies are distribution artifacts: each server still runs and builds from
its own directory, with no new dependency or shared service to deploy.
`acedatacloud` keeps its PlatformToken flow. `digitalhuman` and `happyhorse` keep
their additional redirect validation and revoked-token tracking. `midjourney`
keeps its distinct callback/token-exchange implementation. Their local files are
never generated; the sync script requires every OAuth server to be classified
explicitly before writing any copies.
Hosted OAuth requests use canonical AuthBackend scopes: API-credential servers
request `profile:read`, `applications:read`, `applications:write`,
`credentials:read`, and `credentials:write`. The account-management server
requests the account scopes documented in [its authorization table](acedatacloud/README.md#hosted-oauth),
covering the tools as well as platform-token issuance. Its trusted OAuth
application must be synced by AuthBackend before rollout.
To run shared OAuth behavior tests, install `./suno[test]` in an isolated Python
environment (as the representative self-contained package), then run
`python -m pytest shared/test_oauth.py` from the repository root. Tests mock all
HTTP calls and do not require account credentials.
### Server development
```bash
cd <server>/
pip install -e ".[dev]"
pytest --cov=core --cov=tools
ruff check .
```
## Test discovery
Run `pytest` for shared behavior tests and
`python3 -m unittest` for repository
tooling tests. CI discovers both directories; new tests need no workflow edits.
Each MCP package keeps its existing `pytest` test-discovery configuration.
## Marketing links
The shared key-creation steps live in `scripts/token_onboarding.py`; marked sections are refreshed for each distribution channel, including the VS Code bundle. The same guide is rendered into each JetBrains `plugin.xml` description because Marketplace displays that descriptor rather than the repository README. Edit the surrounding package tutorial in `README.md`, then run `python3 scripts/marketing_readmes.py`.
The same source generates `README.pypi.md`; the package metadata selects that file.
All active entries in `scripts/mcp_catalog.json` participate, including available
VS Code and JetBrains READMEs. Sora remains retired. Code examples and MCP/API
protocol URLs are not marketing links and remain unchanged.
Channel rules come from the `links` projection of the single
`PlatformBackend/config/marketing_attribution.json` source. Refresh that generated
snapshot using PlatformBackend's `scripts/export_marketing_contract.py --consumer
mcps --target /path/to/MCPs`. Service destinations stay in the existing MCP catalog.
A new service needs no AuthBackend, frontend or global-contract edit.
Tags use source `github`, `pypi`, `vscode_marketplace` or `jetbrains_marketplace`,
medium `referral`, campaign `evergreen`, and content
`<service>_mcp_<readme|package|vscode|jetbrains>_<placement>`. A marketplace README
identifies its distribution artifact; UTM labels are not verified HTTP referrers.
CI's discovered unittest suite rejects stale generated files, wrong channels,
and missing package README inclusion. `python3 scripts/marketing_readmes.py --check`
can also be run directly. Package publication follows the existing release workflow.
## Daily capability updates
PlatformBackend `ecosystem.py` is the only scheduled coordinator.
One daily Kubernetes Job reviews Backend docs and API changes with Claude Code,
updates existing files, and creates or updates one reviewable PR per repository.
It never merges PRs or duplicates the Backend guide tree. Normal CI and review
remain required; publication and sub-repository mirroring run after merge.