Cacoo Remote Server
БесплатноНе проверенEnables managing Cacoo diagrams, folders, organizations, and account information through MCP tools over HTTP, with OAuth-based authentication, email allowlistin
Описание
Enables managing Cacoo diagrams, folders, organizations, and account information through MCP tools over HTTP, with OAuth-based authentication, email allowlisting, and support for multiple Cacoo accounts.
README
A remote MCP server for the Cacoo API, deployable to Cloudflare Workers, AWS Lambda, Google Cloud Run or Azure Container Apps.
Unlike a local stdio MCP server, this runs as a hosted HTTP endpoint: you authenticate once in the browser with OAuth, and your Cacoo API key never leaves the server.
Features
- 14 MCP tools covering diagrams, folders, organizations and account information
- OAuth 2.1 with PKCE — clients authenticate in the browser; no API key on the client
- Email allowlist — application-level authorization on top of the upstream IdP
- Multiple Cacoo accounts — route per call, with a per-account read-only guard
- Four deployment targets sharing the same tool implementations
Choosing a deployment
| Cloudflare | AWS | Google Cloud | Azure | |
|---|---|---|---|---|
| Runtime | Workers (edge) | Lambda + API Gateway | Cloud Run | Container Apps |
| MCP session | Durable Objects | Stateless | Stateless | Stateless |
| OAuth authorization server | @cloudflare/workers-oauth-provider |
src/oauth |
src/oauth |
src/oauth |
| Upstream IdP | Cloudflare Access | Amazon Cognito | Google account | Microsoft Entra ID |
| State storage | Workers KV | DynamoDB (TTL) | Firestore (TTL) | Cosmos DB (TTL) |
| Secrets | Workers Secrets | Secrets Manager | Secret Manager | Key Vault |
| IaC | wrangler | AWS SAM | Terraform | Bicep |
| Config file | .dev.vars |
infra/aws/params.yaml |
infra/gcp/terraform.tfvars |
infra/azure/params.json |
The tools and their behavior are identical on all of them. Every platform can use either Google or Microsoft Entra ID as its upstream IdP; the table shows the default.
Architecture
The same MCP server runs on four platforms. Each platform subgraph holds its own wiring —
gateway, storage and upstream IdP — and the Node-based ones funnel into the shared
src/oauth, which in turn uses 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
Request flow
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
Authorization happens in two layers. The upstream IdP decides who may sign in, and the
email allowlist decides who gets tools: a user outside the allowlist receives a server
exposing only access_denied. The readOnly flag on an account rejects every non-GET
request in the API client layer, so it cannot be bypassed by an individual tool.
Directory layout
Three layers, by how widely each one can be reused:
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 parameters
src/platforms/<name> is the only place a cloud SDK appears. Adding another Node-hosted
platform means implementing AuthStore, a secret lookup, and an entry point that hands
the Express app to the runtime.
Configuration
Accounts are configured as a single JSON string, CACOO_ACCOUNTS_CONFIG.
See Cacoo API keys and account configuration for how to issue a
key and find your organizationKey.
{
"accounts": [
{ "name": "main", "apiKey": "xxx", "organizationKey": "your-org-key" },
{ "name": "shared", "apiKey": "yyy", "readOnly": true }
],
"defaultAccount": "main"
}
| Field | Meaning |
|---|---|
name |
Name used by the account argument on every tool |
apiKey |
Cacoo API key. Generate one at https://cacoo.com/profile/api |
organizationKey |
Default organization for diagram and folder tools. Required on non-legacy plans; tools can override it per call |
readOnly |
When true, every non-GET call is rejected |
baseUrl |
Defaults to https://cacoo.com |
Connecting from MCP Clients
Claude Code
claude mcp add --transport http cacoo https://<your-domain>/mcp -s user
Claude Desktop / Kiro / Cursor
{
"mcpServers": {
"cacoo": {
"command": "npx",
"args": ["mcp-remote", "https://<your-domain>/mcp"]
}
}
}
A browser opens on first connection and asks you to authenticate.
Claude Desktop (.mcpb bundle)
Instead of hand-editing the JSON above, you can double-click a .mcpb (MCP Bundle) to
install it. It is generated during deploy and written to dist/.
npm run mcpb:pack # generate on its own
npm run aws:deploy # generated as part of the deploy
The endpoint URL is a user_config field, and the domain you deployed to is baked in as
its default, resolved from --host, MCP_HOSTNAME, ApiDomainName in
infra/aws/params.yaml, or MCP_HOSTNAME in .dev.vars, in that order.
The bundle does not contain the server itself. MCPB is a local-execution format, so
it ships mcp-remote as a stdio proxy that connects to your deployed server. Claude Code
does not use this bundle — it stays on claude mcp add --transport http.
Available Tools
Diagrams
| Tool | Description |
|---|---|
list_diagrams |
List diagrams with filtering, sorting and pagination |
get_diagram |
Details of one diagram, including sheets and comments |
create_diagram |
Create a new empty diagram |
copy_diagram |
Copy an existing diagram |
move_diagram |
Move a diagram to another folder |
delete_diagram |
Delete a diagram |
get_diagram_image |
PNG rendering of a diagram or one sheet |
get_diagram_contents |
Structured contents (shapes, text, lines) as XML |
Workspace
| Tool | Description |
|---|---|
list_accounts |
Configured accounts, the default, and which allow writes |
list_folders |
Folders in the account |
list_organizations |
Organizations, including the key used as organizationKey |
get_account |
Profile of the authenticated account |
get_license |
License/plan details |
get_user |
Public profile of a user by name |
Security
- Authentication: OAuth 2.1 with PKCE (S256) against an upstream IdP
- Authorization:
ALLOWED_EMAILSprovides an application-level email allowlist. Leaving it empty disables the allowlist, so anyone who can sign in through the upstream IdP gets every tool - API key protection: Cacoo API keys stay on the server and are never sent to clients
- Client consent: Dynamic Client Registration is open to anyone, so authorization is
gated behind a consent screen naming the client and its redirect target, with CSRF
protection. Approvals are keyed on
client_id+redirect_uri - Write guard: accounts marked
readOnly: truereject every non-GET call. The check lives insrc/core/cacoo-client.ts, so it does not depend on individual tools - Dependency cooldown:
.npmrcsetsmin-release-age=3, so dependency resolution only considers package versions that have been public for at least three days
Local Development
npm install
npm run type-check # all four platforms
npm test # 108 assertions
| Test | Covers |
|---|---|
npm run test:cacoo-client |
URL building, organizationKey resolution, readOnly guard, error formatting, 4MB image cap |
npm run test:tools |
All 14 tools register; allowlist gating |
npm run test:oauth |
DCR, PKCE, single-use tokens, scopes, revocation |
npm run test:oauth-consent |
HTML escaping, signed cookies, CSRF, approval gate |
npm run test:oauth-upstream |
Endpoint resolution for Cognito / Google / Entra ID |
IaC can be validated without cloud credentials:
npm run aws:validate # sam validate --lint
npm run gcp:validate # terraform validate
npm run azure:validate # az bicep build
Credits
The tool definitions are ported from cacoo-mcp-server (local stdio). The remote server architecture is shared with backlog-remote-mcp-server.
License
MIT
Установка Cacoo Remote Server
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/midnight480/cacoo-remote-mcp-serverFAQ
Cacoo Remote Server MCP бесплатный?
Да, Cacoo Remote Server MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Cacoo Remote Server?
Нет, Cacoo Remote Server работает без API-ключей и переменных окружения.
Cacoo Remote Server — hosted или self-hosted?
Доступен hosted-вариант: Unyly запускает сервер в облаке, локальная установка не обязательна.
Как установить Cacoo Remote Server в Claude Desktop, Claude Code или Cursor?
Открой Cacoo Remote Server на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
Gmail
Read, send and search emails from Claude
автор: GoogleSlack
Send, search and summarize Slack messages
автор: SlackRunbear
No-code MCP client for team chat platforms, such as Slack, Microsoft Teams, and Discord.
Discord Server
A community discord server dedicated to MCP by [Frank Fiegel](https://github.com/punkpeye)
Klavis AI
Open Source MCP Infra. Hosted MCP servers and MCP clients on Slack and Discord.
Work90210/APIFold
Turn any REST API into a hosted MCP server. 18 free public servers (GitHub, Stripe, Slack, OpenAI, Notion, and more) — no setup required, bring your own API key
автор: Work90210arikusi/deepseek-mcp-server
MCP server for DeepSeek AI with chat, reasoning, multi-turn sessions, function calling, thinking mode, and cost tracking.
автор: arikusihashgraph-online/hashnet-mcp-js
MCP server for the Registry Broker. Discover, register, and chat with AI agents on the Hashgraph network.
автор: hashgraph-onlineprofullstack/mcp-server
A comprehensive MCP server aggregating 20+ tools including SEO optimization, document conversion, domain lookup, email validation, QR generation, weather data,
автор: profullstackWayStation-ai/mcp
Seamlessly and securely connect Claude Desktop and other MCP hosts to your favorite apps (Notion, Slack, Monday, Airtable, etc.). Takes less than 90 secs.
автор: waystation-aiCompare Cacoo Remote Server with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории communication
