Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.murmur.dev/llms.txt

Use this file to discover all available pages before exploring further.

The MurmurService gRPC API is the backend for the CLI, dashboard, and MCP server. It provides complete programmatic control over agents, catalog resources, pools, sessions, and events.

Architecture

The API server (murmur-api) runs on Google Kubernetes Engine (GKE) and exposes a gRPC interface:
CLI (murmur)           Dashboard (murmur-ui)        Agent VM (MCP)
    ↓ gRPC/TLS             ↓ gRPC-web                  ↓ gRPC/TLS
    └───────────────────────┼───────────────────────────┘
                            ↓ Envoy (gRPC-web → gRPC)
                       murmur-api (GKE)

                    Orchestration / GCS / KMS
  • CLI — connects directly via gRPC with TLS
  • Dashboard — connects via gRPC-web through an Envoy proxy (required for browser compatibility)
  • Agent VMs — the MCP server connects via gRPC with TLS using the agent’s service token
TLS is enabled by default for all connections.

Authentication

Every API request must be authenticated. Three authentication methods are supported:
MethodUsed byToken source
Identity tokenCLI, MCP (local)GitHub OAuth → murmur login
Session cookieDashboardGitHub OAuth → ECIES P-256 encrypted cookie
Service tokenAgent VMsIssued by control plane at VM boot
Tokens are passed in gRPC metadata. The API server validates the token, resolves the caller’s identity and tenant, and checks authorization before processing the request. See Authentication for details on each method.

RPC categories

The API exposes over 80 RPCs organized into the following categories.

Agent lifecycle

RPCs for creating, managing, and controlling agents:
RPCDescription
SpawnCreate a new agent task with full configuration
QueueAddSend a follow-up message to a running agent
KillCancel an agent and its entire subtree
SleepPut a running agent to sleep (idle state)
WakeWake a sleeping agent
StopTurnInterrupt the agent’s current turn
RekeyRefresh an agent’s credentials without interrupting work
ClearQueueDiscard all queued follow-ups for an agent

Queries

RPCs for reading agent and tenant state:
RPCDescription
StatusGet an agent’s current state, progress, PRs, and cost
ListList agents with optional filters (developer, all, workspace)
TreeGet the full agent hierarchy as a tree structure
WaitBlock until an agent reaches a target phase
WhoAmIReturn the caller’s identity and permissions
ListTenantsList tenants the caller has access to
ResolveVMLook up which agent is running on a specific VM

Streaming

Server-streaming RPCs that push real-time updates:
RPCTypeDescription
WatchTreeServer streamStream agent tree hierarchy with live updates
WatchAgentServer streamStream a single agent’s state changes
StreamSessionEventsServer streamStream live Claude Code session output
StreamTelemetryServer streamStream cost, token, and performance metrics
StreamLogsServer streamStream VM-level logs
SessionChannelBidirectional streamPush/receive channel events (used by MCP server)
Streaming RPCs are long-lived connections. The server pushes events as they occur. Clients receive updates without polling.

Catalog CRUD

RPCs for managing catalog resources:
RPCDescription
GetResourceRead a single resource by kind and name
SetResourceCreate or update a resource
ListResourcesList all resources of a kind
DeleteResourceDelete a resource (blocked if referenced)
DescribeKindsGet schema information for all resource kinds
GetResourceHistoryGet version history for a resource
RevertResourceRevert a resource to a previous generation
PatchResourcePartial update of resource fields

Pool management

RPCs for managing the VM pool:
RPCDescription
EnsurePoolEnsure the pool meets minimum capacity
PoolStatusGet current pool state: total, available, assigned VMs
PoolFlushDrain and recreate the pool

Bake (image building)

RPCs for building custom VM images:
RPCDescription
BakeRecipeStart an image build from a recipe
GetBakeGet the status of a bake job
ListBakesList all bake jobs
WatchBakeServer stream — watch a bake job’s progress in real time

Subscriptions

RPCs for managing event subscriptions:
RPCDescription
AddSubscriptionSubscribe to events for a repository or pattern
RemoveSubscriptionRemove an event subscription
FlushSubscriptionsRemove all subscriptions
ListSubscriptionsList active subscriptions

Tasks

RPCs for managing agent task checklists:
RPCDescription
TaskCreateCreate a new task in an agent’s checklist
TaskUpdateUpdate a task’s status, description, or dependencies
TaskListList all tasks for an agent
TaskGetGet a single task by ID

Storage proxy

RPCs that proxy storage operations through the API server (agents cannot access GCS directly):
RPCDescription
PersistSessionSave session state to storage
RestoreSessionRestore session state from storage
UploadPublicUpload a file to the public storage bucket and return its URL

Proto packages

The API is defined across several Protocol Buffer packages:
PackageDescription
murmur.api.v1Main API service definition and common types
murmur.agent.v1Agent-specific types (status, phase, config)
murmur.authz.v1Authorization types (permissions, roles, grants)
murmur.workflow.v1Agent orchestration types
murmur.session.v1Session types (events, telemetry, channel)
murmur.port.v1Port forwarding types
murmur.vm.v1VM lifecycle types
murmur.control.v1Control plane types (internal)

Error handling

The API uses standard gRPC status codes:
CodeMeaning
OK (0)Success
NOT_FOUND (5)Resource or agent does not exist
ALREADY_EXISTS (6)Resource or agent already exists (e.g. duplicate spawn)
PERMISSION_DENIED (7)Caller lacks required permissions
FAILED_PRECONDITION (9)Operation cannot be performed in current state (e.g. kill an already-dead agent)
UNAUTHENTICATED (16)Missing or invalid authentication token
RESOURCE_EXHAUSTED (8)Pool at capacity, rate limited
INVALID_ARGUMENT (3)Malformed request
Error details include human-readable messages describing what went wrong and, where applicable, what action to take.

Rate limiting

The API enforces per-tenant rate limits to prevent abuse. Limits are generous for normal usage patterns. If you hit rate limits, the API returns RESOURCE_EXHAUSTED with a Retry-After header indicating when to retry. Streaming RPCs are not rate-limited per message — they are limited by the number of concurrent streams per tenant.