Cacoo Remote MCP Server
Удаленный MCP-сервер Cacoo
Удаленный MCP-сервер для Cacoo API, развертываемый на Cloudflare Workers, AWS Lambda, Google Cloud Run или Azure Container Apps.
В отличие от локального stdio MCP-сервера, этот работает как размещенный HTTP-эндпоинт: вы один раз проходите аутентификацию в браузере с помощью OAuth, и ваш Cacoo API-ключ никогда не покидает сервер.
Возможности
14 MCP-инструментов, покрывающих диаграммы, папки, организации и информацию об аккаунте
OAuth 2.1 с PKCE — клиенты аутентифицируются в браузере; API-ключ на клиенте не нужен
Список разрешенных email — авторизация на уровне приложения поверх вышестоящего IdP
Несколько Cacoo-аккаунтов — маршрутизация для каждого вызова с защитой «только чтение» для каждого аккаунта
Четыре цели развертывания, использующие одни и те же реализации инструментов
Related MCP server: @relbase/mcp
Выбор платформы развертывания
Cloudflare | AWS | Google Cloud | Azure | |
Среда выполнения | Workers (edge) | Lambda + API Gateway | Cloud Run | Container Apps |
MCP-сессия | Durable Objects | Без состояния | Без состояния | Без состояния |
OAuth-сервер авторизации |
|
|
|
|
Вышестоящий IdP | Cloudflare Access | Amazon Cognito | Google account | Microsoft Entra ID |
Хранение состояния | Workers KV | DynamoDB (TTL) | Firestore (TTL) | Cosmos DB (TTL) |
Секреты | Workers Secrets | Secrets Manager | Secret Manager | Key Vault |
IaC | wrangler | AWS SAM | Terraform | Bicep |
Файл конфигурации |
|
|
|
|
Инструменты и их поведение идентичны на всех платформах. Каждая платформа может использовать либо Google, либо Microsoft Entra ID в качестве вышестоящего IdP; в таблице показано значение по умолчанию.
Архитектура
Тот же MCP-сервер работает на четырех платформах. Каждый подграф платформы содержит собственную обвязку —
шлюз, хранилище и вышестоящий IdP — а платформы на Node.js сходятся в общем модуле
src/oauth, который в свою очередь использует src/core.
flowchart TB
subgraph clients["MCP clients"]
direction LR
CC["Claude Code<br/><i>native HTTP transport</i>"]
CD["Claude Desktop / Kiro / Cursor<br/><i>mcp-remote proxy</i>"]
end
subgraph cf["Cloudflare src/platforms/cloudflare"]
direction TB
CFW["Workers <i>OAuthProvider</i>"]
CFA["Cloudflare Access<br/><i>or Google / Entra ID</i>"]
CFKV["KV <i>OAUTH_KV</i>"]
CFDO["Durable Object<br/><i>CacooMCP session</i>"]
CFW -. "OIDC" .-> CFA
CFW --- CFKV
CFW --> CFDO
end
subgraph aws["AWS src/platforms/aws"]
direction TB
APIGW["API Gateway<br/><i>HTTP API + ACM + Route 53</i>"]
LAMBDA["Lambda <i>nodejs22 / arm64</i>"]
COG["Amazon Cognito"]
DDB["DynamoDB <i>OAuth state</i>"]
SM["Secrets Manager<br/><i>Cacoo API keys</i>"]
APIGW --> LAMBDA
LAMBDA -. "OIDC" .-> COG
LAMBDA --- DDB
LAMBDA --- SM
end
subgraph gcp["Google Cloud src/platforms/gcp"]
direction TB
RUN["Cloud Run <i>container</i>"]
GID["Google account"]
FS["Firestore <i>OAuth state</i>"]
GSM["Secret Manager"]
RUN -. "OIDC" .-> GID
RUN --- FS
RUN --- GSM
end
subgraph azure["Azure src/platforms/azure"]
direction TB
ACA["Container Apps <i>container</i>"]
ENT["Entra ID"]
COS["Cosmos DB <i>OAuth state</i>"]
AKV["Key Vault"]
ACA -. "OIDC" .-> ENT
ACA --- COS
ACA --- AKV
end
subgraph oauth["src/oauth shared by Node runtimes"]
OP["provider.ts <i>OAuth authorization server</i>"]
OS["store.ts <i>AuthStore interface</i>"]
OP --- OS
end
subgraph shared["src/core every runtime"]
CS["create-server.ts<br/><i>tool registration + email allowlist</i>"]
TOOLS["tools/ <i>14 MCP tools</i>"]
BC["cacoo-client.ts<br/><i>account routing + readOnly guard</i>"]
CS --> TOOLS --> BC
end
CACOO["Cacoo API <i>/api/v1</i>"]
clients == "Streamable HTTP + OAuth" ==> CFW
clients == "Streamable HTTP + OAuth" ==> APIGW
clients == "Streamable HTTP + OAuth" ==> RUN
clients == "Streamable HTTP + OAuth" ==> ACA
CFDO --> CS
LAMBDA --> OP
RUN --> OP
ACA --> OP
OP --> CS
DDB -. "implements AuthStore" .-> OS
FS -. "implements AuthStore" .-> OS
COS -. "implements AuthStore" .-> OS
BC == "per-account API key" ==> CACOOПоток запросов
sequenceDiagram
autonumber
participant C as MCP client
participant S as Worker / Lambda / Container
participant I as Upstream IdP
participant K as Cacoo
C->>S: POST /mcp
S-->>C: 401 + OAuth metadata
C->>S: authorize
S->>I: redirect to upstream OIDC
I-->>S: callback with identity
Note over S: email allowlist check<br/>reject -> access_denied tool only
S-->>C: access token
C->>S: tools/list, tools/call
Note over S: resolve account -> pick API key<br/>readOnly guard blocks writes
S->>K: Cacoo REST API v1
K-->>S: JSON / PNG / XML
S-->>C: MCP resultАвторизация происходит в два уровня. Вышестоящий IdP решает, кто может войти, а список
разрешенных email решает, кто получает инструменты: пользователь, не входящий в список,
получает сервер, предоставляющий только набор access_denied. Флаг readOnly на аккаунте
отклоняет все запросы, кроме GET, в слое API-клиента, поэтому он не может быть обойден
отдельным инструментом.
Структура каталогов
Три уровня, по степени переиспользуемости:
src/
core/ Every runtime. Depends only on the MCP SDK and zod
cacoo-client.ts Cacoo API client (account routing + readOnly guard)
tools/ 14 MCP tools
create-server.ts MCP server assembly and authorization
oauth/ Node runtimes. OAuth authorization server (Express)
provider.ts OAuthServerProvider implementation
store.ts AuthStore interface — the persistence port
upstream.ts Upstream OIDC client
consent.ts Consent screen
app.ts Express app exposing /authorize, /token, /mcp, ...
platforms/
cloudflare/ Workers wiring (uses its own Workers OAuth provider)
aws/ Lambda wiring + DynamoDB / Secrets Manager adapters
gcp/ Cloud Run wiring + Firestore / Secret Manager adapters
azure/ Container Apps wiring + Cosmos DB / Key Vault adapters
infra/
aws/ SAM template and parameters
gcp/ Terraform configuration
azure/ Bicep template and parameterssrc/platforms/<name> — единственное место, где появляется облачный SDK. Добавление другой
Node-платформы означает реализацию AuthStore, просмотр секретов и точку входа,
которая передает Express-приложение среде выполнения.
Конфигурация
Аккаунты настраиваются как одна JSON-строка, CACOO_ACCOUNTS_CONFIG.
Смотрите Ключи Cacoo API и конфигурация профилей, чтобы узнать
о выпуске ключа и поиске своего organizationKey.
{
"accounts": [
{ "name": "main", "apiKey": "xxx", "organizationKey": "your-org-key" },
{ "name": "shared", "apiKey": "yyy", "readOnly": true }
],
"defaultAccount": "main"
}Поле | Значение |
| Имя, используемое аргументом |
| Cacoo API-ключ. Сгенерируйте его на https://cacoo.com/profile/api |
| Организация по умолчанию для инструментов диаграмм и папок. Требуется на тарифах, не признанных устаревшими; инструменты могут переопределить его в запросе |
| Если true, все запросы, кроме GET, отклоняются |
| По умолчанию |
Подключение из MCP-клиентов
Claude Code
claude mcp add --transport http cacoo https://<your-domain>/mcp -s userClaude Desktop / Kiro / Cursor
{
"mcpServers": {
"cacoo": {
"command": "npx",
"args": ["mcp-remote", "https://<your-domain>/mcp"]
}
}
}При первом подключении откроется браузер и попросит вас выполнить аутентификацию.
Claude Desktop (.mcpb-пакет)
Вместо ручного редактирования JSON выше можно дважды щелкнуть .mcpb (MCP Bundle), чтобы
установить его. Он создается во время развертывания и записывается в dist/.
npm run mcpb:pack # generate on its own
npm run aws:deploy # generated as part of the deployURL-адрес endpoint'а — это поле user_config, а домен, на который выполняется развертывание,
прописывается в нем как значение по умолчанию и формуется из --host, MCP_HOSTNAME,
ApiDomainName в infra/aws/params.yaml или MCP_HOSTNAME в .dev.vars в указанном порядке.
Пакет не содержит самого сервера. MCPB — это формат локального выполнения, поэтому
в него входит mcp-remote в качестве stdio-прокси, который подключается к вашему развернутому
серверу. Claude Code не использует этот пакет — он останавливается на claude mcp add --transport http.
Доступные инструменты
Диаграммы
Инструмент | Описание |
| Список диаграмм с фильтрацией, сортировкой и постраничным выводом |
| Информация об одной диаграмме, включая листы и комментарии |
| Создать новую пустую диаграмму |
| Скопировать существующую диаграмму |
| Переместить диаграмму в другую папку |
| Удалить диаграмму |
| PNG-рендеринг диаграммы или одного листа |
| Структурированное содержимое (формы, текст, линии) в XML |
Рабочее пространство
Инструмент | Описание |
| Настроенные аккаунты, применяемый по умолчанию и аккаунты с правом на запись |
| Папки аккаунта |
| Организации, включая |
| Профиль аутентифицированного аккаунта |
| Сведения о лицензии/плане |
| Публичный профиль пользователя по имени |
Безопасность
Аутентификация: OAuth 2.1 с PKCE (S256) через вышестоящий IdP
Авторизация:
ALLOWED_EMAILSзадает список разрешенных адресов на уровне приложения. Если оставить его пустым, весь список отключается, поэтому любой, кто может войти через вышестоящий IdP, получит доступ ко всем инструментамЗащита API-ключа: ключи Cacoo API остаются на сервере и никогда не отправляются клиентам
Согласие клиента: Dynamic Client Registration открыта для всех, поэтому авторизация ограничена экраном согласия, где указаны клиент и его адрес перенаправления, с защитой от CSRF. Подтверждения привязаны к
client_id+redirect_uriЗащита записи: аккаунты с
readOnly: trueотклоняют все запросы, кроме GET. Проверка находится вsrc/core/cacoo-client.ts, поэтому она не зависит от отдельных инструментовВладение зависимостями: в
.npmrcзадаетсяmin-release-age=3, поэтому при разрешении зависимостей учитываются только те версии паков, которые были опубликованы не менее трех дней назад
Локальная разработка
npm install
npm run type-check # all four platforms
npm test # 108 assertionsТест | Покрытие |
| Построение URL, разрешение |
| Регистрируются все 14 инструментов; запись через разрешенный лист |
| DCR, PKCE, одноразовые токены, области видимости, отзыв |
| HTML-экранирование, подписанные cookie, CSRF, дверь согласия |
| Определение конечных точек для Cognito / Google / Entra ID |
IaC можно проверить без облачных учетных данных:
npm run aws:validate # sam validate --lint
npm run gcp:validate # terraform validate
npm run azure:validate # az bicep buildБлагодарности
Определения инструментов перенесены из acoo-mcp-server (локальный stdio). Архитектура удаленного сервера общая с backlog-remote-mcp-server.
Лицензия
MIT License.
This server cannot be deployed
Maintenance
Related MCP Connectors
Query, browse, and automate OmegaAI workspaces from any MCP client. Streamable HTTP with OAuth 2.0.
Connect to 1,400+ apps and 15,000+ actions through one OAuth-protected MCP server.
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides a standardized MCP interface for interacting with HTTP tools and services, enabling unified API access and management.MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients like Cursor to manage RelBase diagrams and projects through the RelBase REST API, including listing, retrieving, creating, updating, and deleting diagrams.0MIT
- AlicenseNot gradedqualityBmaintenanceEnables clients to access multiple backend MCP servers through a single endpoint, with OAuth 2.1 authorization, namespaced tools, and secure credential management.1MIT
- AlicenseNot gradedqualityCmaintenanceA hosted, OAuth-authenticated MCP endpoint exposing 176 tools that let AI assistants read and write jobs, candidates, applications, interviews, scorecards, prospects, talent pools, and imports within an organization's own applicant tracking data, scoped to the signed-in user's existing permissions.MIT