Empower agents to help you manage your network infrastructure
An MCP server for Datum Cloud with OAuth 2.1 (PKCE) auth, macOS Keychain token storage, and tools for listing/operating on organizations, projects, domains, HTTP proxies, HTTP routes, gateways, traffic protection policies, DNS zones/records, and CRD schemas.
- Quick install (auto-detects your platform and installs to a user-writable PATH):
curl -fsSL https://github.com/datum-cloud/datum-mcp/releases/latest/download/install.sh | sh- Manual download:
- Download the appropriate binary from the latest release
- macOS:
datum-mcp_darwin_arm64,datum-mcp_darwin_amd64 - Linux:
datum-mcp_linux_amd64,datum-mcp_linux_arm64 - Windows:
datum-mcp_windows_amd64.exe(and optionallywindows_arm64)
- macOS:
- Rename to
datum-mcp(ordatum-mcp.exeon Windows) and place it somewhere on your PATH.
- Download the appropriate binary from the latest release
MCP client config in Claude desktop and Claude:
Mode: stdio
{
"datum-mcp": {
"command": "datum-mcp",
"args": []
}
}Cursor config in stdio mode (macOS/Linux):
Windows:
On Windows, point your MCP config to the full path where you installed the binary:
{
"datum-mcp": {
"command": "<path prefix here>/datum-mcp.exe",
"args": []
}
}go build ./cmd/datum-mcp- On first use, the server opens a browser for OAuth (PKCE), then stores credentials (including refresh token) in the system keychain.
- Subsequent calls reuse/refresh the token from keychain automatically.
- We log to stderr; JSON-RPC uses stdout.
DATUM_AUTH_HOSTNAME(defaultauth.datum.net)DATUM_API_HOSTNAME(derived from auth host if unset)DATUM_CLIENT_ID(inferred for *.datum.net and *.staging.env.datum.net)DATUM_TOKEN(override bearer token; skips login)DATUM_VERBOSE(trueto print verbose auth logs)DATUM_USER_ID(override user subject; otherwise from stored credentials)DATUM_ORG(active organization for project listing)
The binary speaks MCP over stdio or streamable http. Register it (e.g., in Claude Desktop) as a command transport pointing to the built executable.
- Stdio (http coming soon):
datum-mcpAll tools accept JSON inputs and return both structured content and a pretty-printed text block for UIs that show text only.
-
organizationmemberships
- Actions:
list|get|set - Input:
- List memberships for current user:
{ "action": "list" } - Get active organization:
{ "action": "get" } - Set active organization (verifies membership):
{ "action": "set", "body": { "name": "<org-id>" } }
- List memberships for current user:
- User resolution:
DATUM_USER_IDenv, else subject from stored credentials.
- Actions:
-
users
- Actions:
list - Input:
- List users (org memberships) under an organization:
{ "action": "list", "org": "<org-id>" }
- List users (org memberships) under an organization:
- Lists org-scoped memberships in namespace
organization-<org>using the org control-plane client.
- Actions:
-
projects
- Actions:
list|get|set|create - Input:
- List:
{ "action": "list", "org": "<org-id>" }(or setDATUM_ORGand omitorg) - Get active:
{ "action": "get" } - Set active (verifies existence in org):
{ "action": "set", "body": { "name": "<project-id>" }, "org": "<optional>" } - Create:
{ "action": "create", "org": "<org-id>", "body": { "metadata": { "name": "<project-id>" }, "spec": { ... } } }
- List:
- Org resolution:
orginput, elseDATUM_ORGenv, else stored active org.
- Actions:
-
domains
- Actions:
list|get|create|update|delete - Input:
- List:
{ "action": "list", "project": "<optional>" } - Get:
{ "action": "get", "id": "<name>", "project": "<optional>" } - Create:
{ "action": "create", "body": { ... }, "project": "<optional>" } - Update:
{ "action": "update", "id": "<name>", "body": { ... }, "project": "<optional>" } - Delete:
{ "action": "delete", "id": "<name>", "project": "<optional>" }
- List:
- Project resolution:
projectinput, else active project (fromprojects set). - Namespace: list/get/create/update run in namespace
default.
- Actions:
-
httpproxies
- Same shape and behavior as
domains(namespaced list/get/create/update; delete by name).
- Same shape and behavior as
-
httproutes
- Same shape and behavior as
domains(namespaced list/get/create/update; delete by name). - Targets Gateway API HTTPRoute resources.
- Same shape and behavior as
-
gateways
- Same shape and behavior as
domains(namespaced list/get/create/update; delete by name). - Targets Gateway API Gateway resources.
- Same shape and behavior as
-
trafficprotectionpolicies
- Same shape and behavior as
domains(namespaced list/get/create/update; delete by name). - Policies are intended to target either
GatewayorHTTPRouteresources. - Group/kind:
networking.datumapis.com/TrafficProtectionPolicy.
- Same shape and behavior as
-
dnszones
- Actions:
list|get|create|update|delete - Input:
- List:
{ "action": "list", "project": "<optional>" } - Get:
{ "action": "get", "id": "<name>", "project": "<optional>" } - Create:
{ "action": "create", "body": { ... }, "project": "<optional>" } - Update:
{ "action": "update", "id": "<name>", "body": { ... }, "project": "<optional>" } - Delete:
{ "action": "delete", "id": "<name>", "project": "<optional>" }
- List:
- Project resolution:
projectinput, else active project (fromprojects set). - Namespace: operates in namespace
default. - Group/kind:
dns.networking.miloapis.com/DNSZone.
- Actions:
-
dnsrecordsets
- Actions:
list|get|create|update|delete - Input:
- List:
{ "action": "list", "project": "<optional>" } - Get:
{ "action": "get", "id": "<name>", "project": "<optional>" } - Create:
{ "action": "create", "body": { ... }, "project": "<optional>" } - Update:
{ "action": "update", "id": "<name>", "body": { ... }, "project": "<optional>" } - Delete:
{ "action": "delete", "id": "<name>", "project": "<optional>" }
- List:
- Project resolution:
projectinput, else active project (fromprojects set). - Namespace: operates in namespace
default. - Group/kind:
dns.networking.miloapis.com/DNSRecordSet.
- Actions:
-
dnszoneclasses
- Actions:
list|get - Input:
- List:
{ "action": "list", "project": "<optional>" } - Get:
{ "action": "get", "id": "<name>", "project": "<optional>" }
- List:
- Scope: cluster-scoped (no namespace).
- Group/kind:
dns.networking.miloapis.com/DNSZoneClass.
- Actions:
-
apis (CRDs list/describe via upstream OpenAPI/
kubectl explainlogic)- Actions:
list|get - Input:
- List groups/versions and resources:
{ "action": "list", "project": "<optional>" } - Get a schema for a specific kind:
{ "action": "get", "group": "<group>", "version": "<version>", "kind": "<Kind>", "project": "<optional>" }
- List groups/versions and resources:
- Behavior:
listreads the project control-plane OpenAPI v3 index and returns groups, versions, and resources withname,kind, andnamespaced.getfetches the OpenAPI v3 document for the given group/version and returns the full upstream-rendered schema for the requested kind (no custom trimming).
- Actions:
organizations→ list orgsorganizations→ set active orgprojects→ list for an orgprojects→ set active project- Use
domains/httpproxies/httproutes/gateways/trafficprotectionpolicies/dnszones/dnsrecordsets/dnszoneclassesfor CRUD/list/get, orapisto inspect CRD schemas
