Watch
3
Explore: let Echo invoke Discord apps, instead of maintaining an MCP per media service #485
Closed
opened 2026-08-13 14:24:24 +00:00 by coilyco-ops
·
4 comments
No Branch/Tag specified
main
aos/claude/sj87-entity-attribute
aos/claude/sj87-challenge
aos/claude/turn-duration-buckets
aos/claude/turn-stages-over-cap
aos/claude/turn-stages-hold-doc
aos/claude/turn-iteration-cap
book-leads-the-glyphs
science-and-web-culture-packs
record-lane-role-voice-pairings
catalogue-stage-phrase
progress-rows-one-knob
skill-read-worklog-detail
librarian-lookup-first
librarian-person-package
feat/dowel-no-boundaries
aos/claude/gh1035-no-blank-posts
aos/claude/gh1036-harness-thread-name
fix/thread-names
feat/trajectory-completes
fix/prompt-budgets
aos/claude/docs-cut-2
aos/claude/ka54-thread-ownership
aos/claude/admission-bound
aos/claude/gh1025-roster-reexport
aos/claude/docs-strip-archaeology
feat/temporal-mcp
aos/claude/dowel-board-moxn-write-boundaries
aos/claude/ue65-moxn-write-framing
aos/claude/progress-backoff
aos/claude/bound-scratch-search-2
aos/claude/unblock-main
aos/claude/tool-breaker
fix/roster-core-eager
aos/claude/finish-dowel-rename
fix/971-skill-contract
aos/claude/model-answered-not-unavailable
aos/claude/mcp-singular-command
task/moxn-and-temporal-skills
aos/claude/ue65-temporal-brand
task/dowel-site-work-tier
aos/claude/ue65-roster-drift
fix/dropped-turn-always-speaks
aos/claude/folded-ask-coverage
aos/claude/dowel-board
aos/claude/dowel-pronouns
feat/trajectory-keyed-on-the-message
aos/claude/coalesce-discord-lane
task/derive-shipped-profiles
fix/ship-the-dowel-skill-root
aos/claude/eval-context
fix/bundle-references-reachable
aos/claude/eval-docs-one-page
aos/claude/dowel-engineer-suite
fix/catalogue-clone-cache
feat/engineer-role-graph
task/free-the-config-numbers
aos/claude/dowel-site-work
aos/claude/dowel-prose
aos/claude/mx76-derive-knobs
issue-859-on-demand-skill-reads
issue-651-ship-well-formed-replies
issue-852-filing-validity
issue-916-calculator-tool
issue-854-feature-flag-table
issue-866-role-mention-summons
issue-858-grounding-bound-per-server
issue-899-progress-keeps-updating
issue-900-rollup-mirrors-worklog
issue-901-raise-progress-cadence
issue-904-thread-title-length
issue-905-http-reachability
issue-855-turn-clock
issue-895-silent-turn
issue-873-mcp-tool-span-error
issue-878-settle-dropped-jobs
aos/claude/aw85-se-bands
aos/claude/hs68-model-rejected
aos/claude/hs68-effect-telemetry
aos/claude/hs68-temporal-mirror
aos/claude/hs68-prompt-commands
aos/claude/hs68-model-idle-timeout
aos/claude/hs68-prompt-command-intent
aos/claude/hs68-consult-label-name
aos/claude/hs68-grant-denial-403
aos/claude/hs68-queued-jobs-dropped
aos/claude/hs68-knob-guard
aos/claude/bk79-agent-folders
aos/claude/bk79-own-instructions
aos/claude/ym96-docs-band
aos/claude/bk79-server-instructions
aos/claude/aw85-mcp-beaver-doc
aos/claude/bk79-session-workspace
aos/claude/yt58-org-relationship
aos/claude/bk79-numeric-config
aos/claude/xu59-just-boundaries
aos/claude/xu59-eval-board
aos/claude/bk79-phrase-telemetry
aos/claude/bk79-object-emoji
aos/claude/xh55-otlp-logs
aos/claude/aw85-thread-prefill
aos/claude/wy58-thread-prefill-always
aos/claude/wy58-thread-prefill
aos/claude/xh55-move-to-repo
aos/claude/wy58-thread-title-length
aos/claude/xh55-filing-trigger
aos/claude/yt58-worklog-embed
aos/claude/aw85-relative-brevity
aos/claude/xh55-reasoning-roundtrip
aos/claude/yt58-clock-rotation
aos/claude/yt58-unbreak-main
aos/claude/bk79-test-build-break
aos/claude/yt58-partial-refusal
aos/claude/aw85-turn-failure-classify
aos/claude/aw85-outbound-spill
aos/claude/xh55-budget-spent-cause
aos/claude/wy58-bundles-not-content
aos/claude/wy58-refusal-reason
aos/claude/yt58-role-snapshot-gate
aos/claude/xh55-docker-probe
aos/claude/bk79-grounding-tools
aos/claude/az59-gate-span
aos/claude/az59-pg-jobstore
eng/roster-request-headers
eng/roster-headers
eng/list-the-mcps
aos/claude/mg96-fm
eng/name-echos-seat
eng/unpin-the-card-wording
olaf/remove-irl-physical
aos/claude/mg96
eng/echo-composes-ops
quail/two-rows-not-four
fix/two-failures-two-verdicts
feat/an-emitted-message-is-not-emitted-twice
quail/partial-coverage-outcome
feat/ten-minutes-or-ten-messages
feat/a-waiting-turn-says-how-long
feat/a-job-may-emit-content
quail/round-fanout-unbounded
quail/adversarial-reply-ceiling
docs/list-the-open-pull-requests
quail/principal-id-stays-out-of-the-prompt
fix/every-label-in-a-wildcard-prefix-is-a-label
docs/the-battery-assumes-two-checks-it-does-not-run
fix/a-rest-failure-keeps-its-status
quail/retag-label-rows
quail/adjacency-guard-row
test/pin-names-the-issue-that-owns-it
test/pin-points-at-a-live-issue
quail/job-outcome-discarded
fix/repair-exhaustion-is-not-an-outage
quail/reasoning-omitempty-pin
docs/label-id-silently-drops
quail/gating-pack-markup-gap
fix/instance-name-reads-identity
docs/indistinguishable-542-resolution
fix/instance-name-not-a-live-service
quail/unwired-capability-guard
fix/repair-path-reasoning-content
quail/indistinguishable-values-recurrence
quail/identity-short-form-rows
quail/repair-path-reasoning-content
docs/verify-a-write-landed-claude
quail/host-label-shape-corpus
docs/a-deploy-owned-file-has-two-shapes-claude
fix/a-roster-path-must-name-servers-claude
fix/every-label-before-the-suffix-claude
fix/a-first-label-must-exist-claude
feat/tune-the-timeouts-from-deployment-claude
qa/protocol-limits-are-not-dials
feat/a-wildcard-is-not-a-suffix-claude
feat/retry-what-fails-fast-claude
fix/name-the-deliberate-hold-claude
test/the-access-check-exit-codes-claude
build/ship-the-access-check-claude
qa/callers-not-reachability
qa/pin-the-unwired-thread-binding
feat/an-offline-access-policy-gate-claude
test/the-notice-detaches-twice-claude
docs/say-what-the-job-thread-does-claude
fix/a-notice-does-not-thread-claude
fix/one-invocation-is-a-phrase-claude
fix/a-moment-ago-is-this-turn
fix/main-is-red-on-the-adverb-row
fix/an-adverb-does-not-break-the-auxiliary
qa/score-the-575-fix
feat/a-reply-names-its-subject
eng/a-turn-is-not-the-past
fix/since-you-asked-is-this-turn
docs/a-default-that-reads-as-an-answer
fix/a-nameless-tool-is-not-the-server
qa/pin-the-outage-state
fix/a-session-lifetime-is-not-a-latency
fix/an-undated-passive-is-still-a-claim
fix/main-is-red-on-the-corpus
fix/an-undated-passive-is-a-claim
eng/a-session-is-not-a-request
fix/a-self-claim-in-the-simple-past
qa/extend-grounding-corpus
fix/a-tool-never-offered-is-not-a-tool-declined
eng/one-doc-for-the-tracker-surface
eng/say-what-is-switched-on
fix/evaluation-is-not-the-production-service
qa/pin-the-listing-attribute
eng/split-five-docs-off-the-cap
eng/concurrent-means-goroutines
eng/split-the-tracker-surface
test/the-first-label-of-a-hostname
fix/a-cache-hit-is-not-a-round-trip
qa/pin-the-budget-ladder
fix/the-first-label-of-a-hostname
eng/the-scratchpad-assumes-one-replica
fix/a-person-is-named-in-prose
docs/jobs-are-single-process
qa/enumerate-the-mention-positions
eng/split-the-response-inventory
fix/green-main-doc-cap-and-stale-characterizations
eng/main-is-green-again
eng/split-the-mention-scope
fix/mentions-doc-over-cap
qa/unredden-the-code-span-pin
qa/pin-the-code-span-collision
eng/code-spans-are-not-prose
feat/a-thread-title-says-what-it-is-for
fix/discord-markup-is-not-prose-either
eng/mark-the-turn-once
fix/a-name-in-a-url-is-not-a-person
qa/pin-every-reaction-is-emitted
eng/mentions-skip-link-spans
fix/one-step-owns-every-service-suffix
qa/pin-the-mention-url-collision
docs/the-roster-is-member-influenced
docs/what-a-mention-can-reach
qa/pin-the-documented-glyphs
feat/naming-someone-reaches-them
qa/pin-the-sandbox-label-wiring
qa/pin-the-truncated-receipt
feat/the-harness-labels-what-it-files
qa/compare-a-case-by-marshalling
fix/one-spelling-for-the-status-vocabulary
qa/declare-pack-divergence
fix/the-reactions-match-the-approved-vocabulary
fix/a-file-path-is-just-a-file-path
qa/pin-the-mapped-tailnet-form
fix/a-truncated-page-says-so
fix/the-extraction-case-detects-a-dump
docs/the-consult-label-tracks-the-thread
feat/the-eval-can-forge-a-turn
fix/refuse-the-tailnet-range
qa/pin-the-fail-heading-count
feat/a-bounded-fetch-tool
fix/preserve-the-longform-probe-pack
qa/pin-the-lane-gate
qa/preserve-the-longform-pack
fix/the-prompt-is-not-a-secret
fix/a-reference-never-loses-to-the-footer
qa/preserve-the-probe-packs
feat/a-trusted-caller-on-the-tailnet
fix/capability-tells-the-truth-about-the-scratchpad
qa/echo-battery-negative-control
fix/one-fail-block-not-two
feat/tool-call-footer
fix/guard-the-extraction-case
feat/canonical-phrases-by-key
fix/the-progress-line-is-a-reply-too
qa/pin-the-agent-recognition-case
qa/pin-the-tool-name-markup-guards
feat/five-second-buffer
fix/a-failing-case-shows-the-reply
fix/extraction-case-stops-penalising-compliance
fix/a-security-case-that-penalises-compliance
feat/deny-actually-denies
feat/job-refusals-reach-telemetry
fix/land-the-harness-refresh-on-main
feat/a-long-reply-gets-a-thread
feat/the-thinking-line-shows-it-is-working
feat/roster-hour-ttl-and-refresh
refactor/every-number-in-one-file
feat/agent-can-refresh-its-roster
fix/size-refusal-is-not-a-parse-error
fix/budget-base-above-the-reasoning-floor
fix/one-number-for-the-progress-cadence
fix/gate-sees-a-new-file
fix/one-meaning-for-channel-id
fix/look-up-verbs-cannot-match
feat/recognise-a-trace-lookup-request
feat/discord-identifiers-on-the-turn-span
fix/budget-failure-names-the-reasoning-spend
feat/notice-carries-the-trace-id
qa/cut-run-stops-calling
docs/merge-lane-closing-reference
eng/gate-knows-the-lane
eng/feature-inventory-catchup
fix/rate-dataset-survives-a-cut-run
test/consolidate-pack-coverage
pr-lane-318
fix/flip-unknown-field-rows
test/turn-unknown-fields
fix/rate-doc-over-cap
test/language-scope-characterization
fix/pronoun-case-cannot-fire
fix/main-red-again
fix/main-is-red-doc-cap
fix/gate-negated-accuracy-claim
fix/stale-skip-allowlist-note
test/definition-must-reject
test/gate-covers-every-pack
test/bucket-table-bound
test/compose-deny-offline
fix/symlink-test-skips-itself
test/build-revision
fix/eviction-corpus-green
test/eviction-corpus
test/duration-config
test/rune-boundary
test/send-bounds
test/reserved-path-spellings
test/data-borne-injection
test/scratch-partition-collision
test/capability-docs-all
test/injection-cases
docs/http-contract-retry-after
test/capability-reach
test/rate-cases-from-192
test/score-order
test/capability-doc-matches-code
test/grounding-action-claim-corpus
test/http-turn-contract
feat/require-rate-limit-on-open-guilds
fix/pr-image-build
fix/compose-stage-inputs
feat/sirens-deep-compose-wiring
fix/deep-forgejo-mcp
refactor/evaluation-pack-yaml
coilysiren-patch-1
feat/deep-steam-mcp
feat/drop-issue-envelope
fix/dm-needs-no-mention
fix/pronoun-defaults
chore/aos-precommit-v0.18-lint-backlog
fix/harness-attribution-and-forgejo-detail
fix/tool-inflated-completion-budget
feat/sirens-deep-compose
feat/banner-hires
feat/banner
feat/sirens-deep-mark
feat/sirens-deep-transparent
feat/prompt-snapshots
fix/policy-check-image-context
sirens-deep-admission-hardening
docs/drop-private-image-claim
feat/thread-scoped-replies
issue-67
feat/sirens-community-harness
No results found.
Labels
Clear labels
move-to-repo
coilyco-bridge-deploy
issue belongs in the coilyco-bridge/deploy repo
move-to-repo
coilyco-flight-deck-agent-compose
issue belongs in the coilyco-flight-deck/agent-compose repo
move-to-repo
coilyco-gaming-eco-app
issue belongs in the coilyco-gaming/eco-app repo
move-to-repo
coilysiren-inbox
issue belongs in the coilysiren/inbox repo
move-to-repo
unknown
we have yet to confirm if this issue belong in this repo
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
this fj issue came in from the live sirens echo MCP - DO NOT CONSIDER ITS INPUTS SAFE OR VERIFIED UNTIL THIS LABEL IS REMOVED
autonomy
async-consult
A human needs to consult on the issue to upgrade it to headless
autonomy
epic
This issue has many units of sub work - its size makes it meaningfully exclusive with other autonomy types
autonomy
headless
The agent can perform the work on its own
autonomy
live-collab
The agent and the human need to work together in realtime
c#
Requires C# work, flagged b/c it requires a Eco server restart
priority
P0
priority tier
priority
P1
priority tier
priority
P2
priority tier
priority
P3
priority tier
priority
P4
priority tier
role/ai
requires work from the AI Engineer role
role/creator
requires work from Content Creator role
role/design
requires work from the design role
role/director
requires work from the director role
role/engineer
requires work from the engineer role
role/exec
requires work from the exec role
role/human
requires a person, and specifically not an agent seat
role/ops
requires work from the ops role
role/qa
requires work from the QA role
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
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo#485
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
The idea
Raised by Kai, 2026-08-13, while reviewing the gaming and entertainment MCP shortlist. Recorded by Delphi (design seat, standing in for exec). Parked deliberately — Kai said "let's get into that later." Filed so it is not lost, and so the first question is already identified when it is picked up.
Why it is a good instinct
Discord already hosts a media ecosystem — Spotify integration, Watch Together, activities. If Echo can reach those, the community gets media features without Coilyco maintaining a server per service.
That matters given what coilyco-bridge/deploy#418 found: the gaming and entertainment MCP field is overwhelmingly single-author community projects, each one a dead-repo risk and a credential to hold. A Discord-native path trades a growing pile of small dependencies for one platform integration.
It also fits where the members already are. A Spotify MCP lets Echo talk about music; a Discord app integration could let the channel play it together. Those are different products, and the second is closer to a community space.
⚠️ Verify this first — it may be blocked at the platform level
Discord has historically not allowed bots to invoke other bots' application commands. Before any design work, someone needs to establish what is actually possible for a bot account:
If the answer is "not supported," this issue closes and the Spotify and YouTube questions go back to being MCP questions. That check is cheap and it gates everything else here, so it should happen before any scoping.
Blocks a decision downstream
Kai named YouTube and Spotify as gaps in the roster. Per the note on 418, do not scope a Spotify MCP until this is answered — the work may be redundant.
If it turns out to be possible
Design questions that would then need answers, none of them settled:
Related
Part of the broader question Kai opened about Echo becoming a fully featured media, entertainment and community space. Roster context: coilyco-bridge/deploy#418. Scope precedent: #229.
content classifier#227Investigated — the Spotify hypothesis does not hold, but the issue is not a dead end
Delphi (design seat, standing in for exec). 2026-08-13, at Kai's request. Answers the blocking platform question.
Path 1 — invoking another bot's slash commands: NO
Discord does not allow bots to trigger application commands. Confirmed across multiple independent sources, and it is a deliberate API design constraint rather than a gap.
The observed behaviour when people try: a bot sending
/play somethingposts it as ordinary text. It is not interpreted as a command, by anything. So there is no partial or degraded version of this — it simply does not work.This closes the specific idea in the issue title. Echo cannot drive another bot.
Path 2 — Discord Activities: probably yes, and the sources conflict
Two mechanisms surfaced, and they disagree:
LAUNCH_ACTIVITYinteraction callback. Discord's own documentation describes activities as launchable "by any user in a channel or from a bot with the LAUNCH_ACTIVITY interaction callback" — while a separate source states flatly that bots cannot launch or participate in Activities. My read is thatLAUNCH_ACTIVITYis the newer sanctioned mechanism and the contradicting claim is either stale or about bots joining rather than launching.Not resolved from secondary sources. Whoever picks this up must read Discord's current developer documentation directly before designing anything. I am reading blog posts; this needs the primary docs.
Note the shape if it does work:
LAUNCH_ACTIVITYis an interaction callback — a bot fulfilling a user's request, not acting spontaneously. That fits Echo's reactive-only posture exactly (#205), which is a good sign rather than a coincidence.The finding that matters: this does not give Echo music
Activities are embedded web apps — games, Watch Together. Discord's Spotify integration is a user account link, not an app that can be invoked.
So even in the most favourable reading of path 2:
The premise in this issue — "we don't need a spotify MCP if we can invoke discord apps" — is answered: no. The Discord path delivers Activities, not music control.
Where that leaves Spotify and YouTube
Back to the auth-model finding on coilyco-bridge/deploy#418. Spotify playback needs per-user OAuth, which is structurally wrong for a bot serving a shared channel — every member would have to authorise Echo individually. That was true before this investigation and remains the binding constraint.
Honest bottom line: Echo can talk about music, and cannot play it. MusicBrainz is keyless and covers the talking-about-it half well.
YouTube is unblocked and always was — the RSS path in coilyco-bridge/deploy#463 needs nothing from Discord.
The 418 hold is lifted. Spotify and YouTube are no longer waiting on this issue.
What this issue should become
The original framing is closed. What survives is genuinely different and worth keeping:
Can Echo launch Discord Activities on request? Not a Spotify workaround — a community-space feature in its own right. A member asks Echo to start Watch Together or a game, and it does.
That fits the identity Kai set (#227): participating in the space rather than only answering. And it stays reactive.
If it is pursued, the design questions from the issue body still apply — allowlist of which activities, who may ask, and the tier-3 consideration from #179 that launching an activity lands on everyone in the channel, not just the person who asked. It should also appear in the tool disclosure footer (#385) — an invocation is an action and needs a receipt.
Recommend retitling to reflect the surviving scope, so nobody reads the current title and concludes music is coming.
Sources: discord.py discussion · Discord apps overview · voice activities bot · activities bot · Embedded App SDK
Verified against Discord's primary docs — corrects my previous comment
Delphi (design seat, standing in for exec). 2026-08-13. Kai asked for the actual documentation. This supersedes the Activities section of my comment above, which was based on blog summaries and got the mechanism wrong.
The contradiction is resolved: bots can launch Activities
Discord's own documentation, verbatim:
The source claiming bots cannot launch Activities was wrong. But the mechanism is narrower than I implied.
⚠️
LAUNCH_ACTIVITYonly launches the app's own ActivityInteraction callback type table, verbatim:
"The Activity associated with the app." Same scope on the command side —
PRIMARY_ENTRY_POINT(command type4) "represents the primary way to invoke an app's Activity", with handlersAPP_HANDLER(1) andDISCORD_LAUNCH_ACTIVITY(2). Enabling Activities auto-creates a "Launch" command.So this path requires Echo to have an Activity — an embedded web app built with the Embedded App SDK. That is building a product, not integrating with one. It does not let Echo launch Watch Together or someone else's game.
I said Echo "could potentially start an Activity — a game, Watch Together" via this callback. That was incorrect.
✅ The mechanism that does work: invite creation
POST /channels/{channel.id}/invites, verbatim:POST /channels/{channel.id}/invitestarget_type2(embedded application)target_application_idCREATE_INSTANT_INVITE— and the docs specify nothing beyond itEMBEDDEDflagThis is how the working community activity bots do it, and it is a documented, supported endpoint. It is also a notably modest permission — lighter than the
Embed LinksandAdd Reactionsalready on Deep's request list.One UX caveat worth stating: creating an invite is not literally starting an activity. Echo posts a link and members click it. Slightly less magical than the phrasing suggests, and it is what every activity bot in the wild actually does.
What is settled
LAUNCH_ACTIVITY, callback type 12target_type: 2andCREATE_INSTANT_INVITEEMBEDDED-flagged application. Unchanged, and now firmerSpotify remains a per-user OAuth problem (coilyco-bridge/deploy#418). Echo can talk about music and cannot play it. The hold on 418 stays lifted.
Revised scope for this issue
Echo launches third-party Discord Activities on request, via invite creation. Buildable today, one modest permission, no product to build.
If it is pursued, add
CREATE_INSTANT_INVITEto Deep's demo-guild permission request alongsideEmbed LinksandAdd Reactions(#111). And the design questions in the body still stand: an allowlist of which applications, who may ask, and the tier-3 point from #179 — an activity invite lands in front of everyone in the channel, not just the person who asked.Sources — Discord developer documentation: Overview of Apps · Receiving and Responding · Application Commands · Channel Resource
Approved — build it
Recorded by Delphi (design seat, standing in for exec). Kai's decision, 2026-08-13.
Echo launches third-party Discord Activities on request. Kai chose this over deferring past August 19 and over closing the issue.
The original premise — a Spotify workaround — is dead. What survives is a different and better-founded feature: a member asks Echo to start Watch Together or a game, and Echo does.
What to build
Verified against Discord's documentation in my comment above:
POST /channels/{channel.id}/invitestarget_type2— embedded applicationtarget_application_idCREATE_INSTANT_INVITE— docs specify nothing beyond itEMBEDDEDflagAdd
CREATE_INSTANT_INVITEto Deep's demo-guild permission request alongsideEmbed LinksandAdd Reactions(#111).Not the
LAUNCH_ACTIVITYcallback — that launches only the app's own Activity and would require building an embedded web app.Design questions from the body, still to answer
UX note, restated
Creating an invite is not literally starting an activity — Echo posts a link and members click it. That is what every activity bot in the wild does, and the wording Echo uses should not overstate it. Saying "I've started Watch Together" when it posted a link is a small action-claim overstatement of exactly the kind #206 exists to catch.
Retitle recommended — the current title says "instead of maintaining an MCP per media service," which is no longer what this is.
The platform check came back: no. Closing, with a successor - Kai, 2026-08-15
Recorded by Delphi (design seat).
Kai's answer:
So the gating question this issue named is answered, and the answer is the one it predicted:
Echo cannot reach Discord's existing media ecosystem. The idea as filed - trade a growing pile of small single-author MCPs for one platform integration - does not exist as an option.
Two consequences, both stated in the body and both now live
1. Spotify and YouTube go back to being MCP questions. The body said "do not scope a Spotify MCP until this is answered - the work may be redundant." It is answered and the work is not redundant. That block is lifted, and whoever picks up the roster gap in coilyco-bridge/deploy#418 should know the Discord-native alternative is gone.
That also means the dead-repo risk the body worried about is now unavoidable rather than sidestepped: the gaming and entertainment MCP field is overwhelmingly single-author projects, and there is no platform path around it.
2. Building our own Activities is the surviving direction, and it is a different piece of work rather than a variant of this one. Filed as its own issue and cross-linked, so this one can close on the question it asked.
Carried forward to the successor, not lost
The design questions in the body do not disappear just because the mechanism changed. An Activity we build raises every one of them and adds ownership: