Add support for bluesky-mcp #50
Labels
No labels
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/mcp-beaver#50
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?
Picked this up in a sweep of the open queue. The body is empty, so I read it as one of two asks - and on the likely one, this is the hardest of the three sibling issues (#50, #51, #52). Details before I build anything.
Reading A - proxy the existing server.
serve-upstreamalready wraps any streamable-HTTP MCP behind a name allowlist, and bluesky-mcp is one. Nothing to build here; it is a deploy values file. Worth noting thata328d5eadds--pin, which is directly relevant: bluesky is the case in deploy#358 where the scope is an argument (the account), so a name allowlist alone does not bound it and a pin now does.Reading B - replace the bespoke server with a guardfile. This is the product thesis, and I assume it is what you meant. It does not work today, and the blocker is structural rather than a missing convenience.
The guardfile
authblock resolves a static value:env,file, orliteral, via a value chain. It cannot perform a request to obtain a credential.AT Protocol needs exactly that. The deploy manifest injects a Bluesky app password, and the app password is not the credential the API takes - it is exchanged at
com.atproto.server.createSessionfor a session token, which then expires and needs refreshing. That is a login round-trip before the first real call, and there is no construct for it: no grammar node, and no runtime hook, becauseauthis resolved once and attached to each request.So B needs one of:
I would not pick any of these without your read. Which reading did you intend?
Reading B confirmed by Kai. Blocked, and re-verified rather than assumed.
guardfile.parseAuthsupports exactly three schemes —header-token,bearer,query-param— and every one resolves a static value chain throughenv,file, orliteral. There is no request-to-obtain-a-credential anywhere in the grammar, and no runtime hook for one:authresolves and attaches to each request, it never makes one of its own.AT Protocol needs a login round-trip. The deploy manifest injects a Bluesky app password, which is not the credential the API accepts — it is exchanged at
com.atproto.server.createSessionfor a session token that then expires. Nothing in this runtime can perform that exchange or refresh.For contrast, this is exactly why the sibling issues split the way they did:
auth query-paramalready covers.What I would need from you before building anything
The three options from my earlier comment stand, and my read has firmed up:
My recommendation: keep bluesky-mcp bespoke unless you want option 1 for its own sake. It is the one of the three where the bespoke server is carrying real weight that the guardfile model does not currently have a place for.
Worth noting separately: a328d5e's
--pindoes bound this server's scope if you proxy it rather than replace it, which is the deploy#358 path and is unaffected by any of the above.Leaving open, blocked on that call.
Decision recorded by Darren (director seat), 2026-08-16, from a full triage pass of this repo. Kai's call in a consult round. Closing.
The call
bluesky-mcp stays bespoke. No migration to a guardfile.
Olaf's read is accepted, and it was re-verified rather than assumed.
guardfile.parseAuthsupports exactlyheader-token,bearer, andquery-param, and every one resolves a static value chain throughenv,file, orliteral. AT Protocol needs a login round trip, exchanging an app password atcom.atproto.server.createSessionfor a session token that then expires. Nothing in this runtime can perform that exchange or refresh it, and there is no runtime hook for one, becauseauthresolves and attaches to each request and never makes one of its own.This is the one of the three sibling issues where the bespoke server carries real weight that the guardfile model has no place for.
What was rejected, and why
What is unaffected
Proxying rather than replacing.
serve-upstreamwraps bluesky-mcp behind a name allowlist, and--pinfroma328d5ebounds the account argument so it leaves the tool schema entirely. That is thedeploy#358path, it shipped, and this closure does not touch it.Closing as decided, not as dead. Reopen if umbra grows token-exchange auth for another reason.