From d7182820f5f1bf2949b7647871498e014ce34cb5 Mon Sep 17 00:00:00 2001 From: Josh Knapp Date: Sun, 26 Jul 2026 20:19:20 -0700 Subject: [PATCH] feat: add Claude Code plugin with pre-registered Authentik OAuth client MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude Code's .mcp.json now accepts an `oauth` block with a pre-registered clientId, so the plugin no longer depends on RFC 7591 Dynamic Client Registration (still unshipped in Authentik — goauthentik/authentik#8751, milestoned for 2026.8.0). This lets users install shared-memory as a plugin instead of running the `claude mcp add --client-id ...` one-liner by hand. OIDC_CLIENT_ID_MCP is a Public PKCE client, so committing it is safe; no secret is involved. callbackPort 33418 matches the documented one-liner and is covered by the loopback redirect regex on the Authentik provider. Verified: both manifests pass `claude plugin validate`, and a local-path marketplace install on Claude Code 2.1.220 preserves the oauth block through to the installed cache. Remote (git-sourced) marketplace install is still untested — see anthropics/claude-ai-mcp#359. Co-Authored-By: Claude Opus 5 (1M context) --- .claude-plugin/marketplace.json | 16 ++++++++++++++++ plugin/.claude-plugin/plugin.json | 10 ++++++++++ plugin/.mcp.json | 12 ++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 .claude-plugin/marketplace.json create mode 100644 plugin/.claude-plugin/plugin.json create mode 100644 plugin/.mcp.json diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json new file mode 100644 index 0000000..c81698e --- /dev/null +++ b/.claude-plugin/marketplace.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://anthropic.com/claude-code/marketplace.schema.json", + "name": "dnspegasus", + "description": "Self-hosted Claude Code plugins for the dnspegasus.net infrastructure.", + "owner": { + "name": "jknapp", + "url": "https://repo.anhonesthost.net/jknapp/shared-memory" + }, + "plugins": [ + { + "name": "shared-memory", + "source": "./plugin", + "description": "Shared persistent memory and snippet library for Claude Code sessions, backed by memory.dnspegasus.net and authenticated with Authentik OIDC." + } + ] +} diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json new file mode 100644 index 0000000..b0076d1 --- /dev/null +++ b/plugin/.claude-plugin/plugin.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://anthropic.com/claude-code/plugin.schema.json", + "name": "shared-memory", + "version": "0.1.0", + "description": "Shared persistent memory and snippet library for Claude Code sessions, backed by memory.dnspegasus.net and authenticated with Authentik OIDC.", + "author": { + "name": "jknapp" + }, + "homepage": "https://memory.dnspegasus.net" +} diff --git a/plugin/.mcp.json b/plugin/.mcp.json new file mode 100644 index 0000000..38a481c --- /dev/null +++ b/plugin/.mcp.json @@ -0,0 +1,12 @@ +{ + "mcpServers": { + "shared-memory": { + "type": "http", + "url": "https://memory.dnspegasus.net/api/mcp", + "oauth": { + "clientId": "5rkRS3rJhn3Ci9swWkxYMIrZ9OggsjOGy3cIOhYY", + "callbackPort": 33418 + } + } + } +}