Skip to main content
Glama

homcp — a higher-order MCP server you can rename, on Cloudflare, in one click

Deploy to Cloudflare

One Worker that speaks MCP (2026-07-28 + the 2025 lane claude.ai still uses), does OAuth for claude.ai and Claude Code, remembers things, and can create, hide, show and proxy tools at runtime. Deploy it as thor-memory, odin-memory, or whatever you like — the name is yours, the code never hard-codes it.

What you get

  • OAuth 2.1 out of the box (CIMD + DCR, PKCE S256). claude.ai and Claude Code connect with your owner passphrase and receive revocable tokens. An optional static bearer token serves scripts and CI.

  • Memory: remember, recall (full-text search with a LIKE fallback), read_memory, revise_memory, forget_memory, memory_stats.

  • Tools that make tools: define_tool (kinds: template, http, mcp proxy, compose) → call_toolpromote_tool. New tools are callable immediately and hidden from the model's tool list until you promote them (budget of 12 listed definitions).

  • Three layers of control: built-ins → per-deploy overrides → per-connection overrides. Disable a tool for everyone, or hide it for one client only. Six tools are protected so a client can always switch things back on.

  • Stateless by design: a fresh MCP server per request, registry and memories in D1, OAuth state in KV, no Durable Objects. Deploy is wrangler deploy plus migrations.

  • Renameable: serverInfo.name, the approval page, the landing page and the install snippets follow one setting you can change without redeploying.

Related MCP server: remote-mcp-server-authless

Deploy in ten minutes

  1. Click the button. On the setup page: Project name is the Worker name (name #1, it becomes the hostname); set the D1 database to "+ Create new" (the page pre-selects an existing database whose name matches, which would share its data); type a real OWNER_PASSPHRASE (the field is empty on purpose — generate one with openssl rand -base64 24); optionally set MCP_SERVER_NAME, for example thor-memory (name #2 — when empty the first label of the hostname is used). The deploy command is auto-detected as npm run deploy.

  2. Wait for the build. npm run deploy runs wrangler deploy and then applies the D1 migrations. Open https://<worker>.<you>.workers.dev/.

  3. The landing page prints the exact commands for this deploy. Copy the two Claude Code lines and click Add to claude.ai. Both ask for your passphrase once.

Verify from a shell:

curl -s https://YOUR-WORKER/.well-known/oauth-authorization-server | jq .client_id_metadata_document_supported   # true
curl -s https://YOUR-WORKER/health | jq -c '[.ok, .schema, .name]'                                              # [true,"ok","thor-memory"]

Connect

Claude Code (user scope = every project)

claude mcp add --transport http --scope user thor-memory https://YOUR-WORKER/mcp
claude mcp login thor-memory

thor-memory is your client key (name #3): tools show up as mcp__thor-memory__recall and so on. Pick any short key; the landing page suggests the server's own name so the two match. Run /mcp inside Claude Code to reconnect or refresh the tool list. Details: docs/CLAUDE_CODE.md.

claude.ai

Open the prefilled modal (replace the host):

https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=thor-memory&connectorUrl=https%3A%2F%2FYOUR-WORKER%2Fmcp

or go to Customize → Connectors → Add → Add custom connector, type the name and the URL, and Continue. Step 2 keeps "Always required" and "Use Anthropic hosted client metadata (CIMD)" — both are detected automatically. Add creates the connector; Connect opens the approval page. The full click path and the traps (the URL must be unique in your organisation, the path must be exactly /mcp) are in docs/CLAUDE_AI.md.

Codex

codex mcp add thor-memory --url https://YOUR-WORKER/mcp && codex mcp login thor-memory

See docs/CODEX.md, including the static-token route for headless use.

Or use the script

scripts/connect-mcp.sh claude  https://YOUR-WORKER/mcp [key]   # Claude Code, user scope, then OAuth
scripts/connect-mcp.sh codex   https://YOUR-WORKER/mcp [key]   # Codex, then OAuth
scripts/connect-mcp.sh project https://YOUR-WORKER/mcp [key]   # writes ./.mcp.json for this repository

The key defaults to the first DNS label of the host. Never pass tokens to the script.

Plugin

/plugin marketplace add Soul-Brews-Studio/higher-order-mcp
/plugin install homcp@homcp --config server_url=https://YOUR-WORKER/mcp

Plugin-scoped tools carry the long prefix mcp__plugin_homcp_homcp__…; prefer the user-scope key when you care about tool-name length. See plugin/README.md.

Override per project

The same key in a repository's .mcp.json shadows the user-scope entry (precedence: local > project > user > plugin; entries are not merged):

{ "mcpServers": { "thor-memory": { "type": "http", "url": "${HOMCP_URL:-https://odin-memory.example.workers.dev/mcp}" } } }

Claude Code warns "same name in more than one scope" — that is expected; sign in once per endpoint. scripts/connect-mcp.sh project <url> thor-memory writes this file, and examples/project.mcp.json is a copy you can edit.

Create your first tool

Ask Claude:

Define a tool called standup that returns my standup template with a project argument, then promote it.

Claude calls define_tool (the tool is hidden but callable through call_tool) and then promote_tool (now it is in the tool list). Clients cache the list: in Claude Code run /mcp and reconnect; in claude.ai open the connector menu → Refresh tools list → start a new chat. How the kinds, the template language, the budget and the layers work: docs/HIGHER_ORDER.md.

Rename

Three names matter — the Worker name / hostname, the instance identity, and the client key — and they are independent. docs/NAMES.md explains who sets which and what changes when. The short version: ask Claude for set_identity {name:"odin-memory"} (or use the owner console at /owner) and the server is renamed without a redeploy; tool names, data and tokens stay as they are.

Static token (optional)

For cron jobs, CI or any client without a browser:

wrangler secret put MCP_API_TOKEN          # a long random value
claude mcp add --transport http --scope user thor-memory-token https://YOUR-WORKER/mcp --header "Authorization: Bearer $HOMCP_TOKEN"

The token is compared in constant time before OAuth is consulted; whoami reports via:"token" so transcripts can be audited. Leave the secret unset to keep OAuth as the only door.

Owner console

https://YOUR-WORKER/owner — sign in with the owner passphrase to rename the instance, enable/disable/promote/demote/remove tools at the deploy layer, delete upstreams, revoke OAuth grants, read the audit log and download a redacted export. Every change notifies connected clients that the tool list changed.

Local development

npm install
cp .dev.vars.example .dev.vars        # set OWNER_PASSPHRASE
npm run db:migrate:local
npm run dev                           # http://localhost:8787
npm run check                         # name guard + tsc + vitest
npm run deploy                        # wrangler deploy + remote migrations

Tests run in the Workers runtime (@cloudflare/vitest-pool-workers) with the real migrations; every request goes through SELF.fetch("https://homcp.test/...").

How it works · Limits & security · Operations

Repository layout

src/worker.ts            static-token door, then the OAuthProvider
src/oauth/provider.ts    OAuth 2.1 (CIMD + DCR, PKCE), /mcp behind it
src/mcp/                 stateless MCP handler, per-request server factory, principal, result helpers
src/registry/            D1 registry, catalog resolution (layers), names, dispatch, kinds, upstream client
src/tools/builtin/       the 22 built-in tools (meta, forge, identity, upstreams, memory)
src/memory/              memory store (FTS5 with LIKE fallback)
src/web/                 landing page, consent page, owner console, snippets
migrations/              D1 schema (registry, memory)
scripts/                 deploy.mjs, connect-mcp.sh, check-names.mjs
plugin/                  Claude Code plugin; .claude-plugin/marketplace.json makes this repo a marketplace
test/                    vitest + workers pool

License

MIT — see LICENSE.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Soul-Brews-Studio/higher-order-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server