feat(temporal): serve the lane's own Temporal namespace as read-only MCP #1028
No reviewers
Labels
No labels
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!1028
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/temporal-mcp"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Refs deploy#698. The harness half. A deploy PR follows and is the half that actually puts it on Dowel's roster.
What is missing today
The mirror writes: Dowel's deployment carries
SIRENS_ECHO_TEMPORAL_HOST=coilyco.gcdqf.tmprl.cloud:7233, its namespace, its task queue, and the API key.DialTemporalMirrorreturns a dial error rather than swallowing it, so the pod being1/1 Runningis proof it connected.Nothing reads. Dowel's roster has six servers and none is Temporal, so on a Temporal livestream the agent cannot answer a question about its own durable execution.
Why a binary here rather than a server in deploy
deploy#698 says "1st class if they have one, beaver if not". Neither is available:
GethosTheWalrus/temporal-mcp, Apache-2.0, Python), not Temporal's own.https://coilyco.gcdqf.tmprl.clouddirectly and every path including/resets the connection.stdio_server()againstmcp.server.Server, and the TypeScript alternative ships no image at all. A stdio server cannot be reached from a sibling container, because a pod shares a network namespace and not stdin, so it would have to be spawned as a child inside a bridge image.serve-upstreamtakes a URL and never binds stdio, and deploy holds no Dockerfile at all, so that bridge needs a new repo, a publish workflow and registry credentials before the first manifest exists.Against that, this repo already has everything:
So the server is one more binary in an image that is published anyway, and the deploy change becomes an
extraContainersentry running this same image with a different command. No new image, no registry work, no third-party code, no bridge.The surface
Three tools, all observation:
list_workflows- takes a Temporal visibility query, returns flattened rows.describe_workflow- status, times, history length, pending work.get_workflow_history- event ids, types and times.Nothing that starts, signals, cancels, terminates, schedules or batches is registered. That matters because the community server offers 21 tools including
terminate_workflow,batch_terminateanddelete_schedule, and taking that route would have made an allowlist load-bearing. Here the mutation has no handler, which is the same deny-by-absence posture the.mcp.kdlguardfiles rely on.Two further narrowings:
get_workflow_historyreturns ids, types and times and nothing else.Results are flattened rather than passed through as protobuf JSON, which is mostly envelope, and a model reading a tool result pays for every byte.
Tests
TestNoMutatingVerbIsReachableapplies the same screenmcp-beaver lint-upstream --read-only heuristicapplies to an allowlist, so a mutating tool cannot be added later without a test failing first.TestOnlyReadToolsAreServedpins the list at exactly three and requires each to declarereadOnlyHint; checked non-vacuous by flipping the annotation to false, which fails all three.TestDialRefusesAHalfFilledConnectioncovers the half-configured case the mirror already guards against.go test ./...,go vet, andpre-commit run --all-filesgreen.go mod tidypromotedgo.temporal.io/apifrom indirect to direct at the same version, since the flattening imports itsworkflow/v1andenums/v1types.No docs page, and why
docs/is at 40 of its 40-page cap, andsirens-echo-mcp.mdis at exactly 8000 of 8000 characters. There is no room for a page or a paragraph, which is sirens-echo#1020 exactly. The package and command comments name deploy#698 instead. Worth folding into #1020's consolidation rather than shaving another page to fit.