Global mcp framework
Generisches Framework zum Erstellen von Custom-MCP-Servern als Cloudflare Worker mit @cloudflare/workers-oauth-provider (OAuth 2.1), stateless Streamable-HTTP und einer gemeinsamen Foundation als versionierte Git-Tag-Dependency. IMMER laden, sobald ein MCP-Server in diesem Stack erstellt, verdrahtet, auf eine neue Foundation gebumpt oder debuggt wird — auch wenn das Wort Skill nicht fällt. Trigger u.a.: Custom MCP-Server bauen, Cloudflare Worker MCP, workers-oauth-provider, OAUTH_KV, OAuth 2.1 inbound, /authorize Login, Provider-Wiring, stateless Transport, sessionIdGenerator, "Session terminated", "Server misconfigured", "Authorization failed" nach Consent, neuen Connector anlegen, Foundation-Tag bumpen, wrangler.jsonc für MCP, KV-Namespace MCP_OAUTH, Discovery-Check well-known. Gilt für jeden neuen Custom-MCP-Server in diesem Stack.From its SKILL.md
npx -y skills add wemwi/skill-library --skill global-mcp-frameworkAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
10.5 KB, ~2.8k tokens by cl100k_base, as published. Nobody here has run it
global-mcp-framework
Architektur-Wissen und Arbeitsabläufe zum Erstellen von Custom-MCP-Servern auf diesem
Stack. Jeder Server ist ein eigener Cloudflare Worker, der eine gemeinsame Foundation
(<foundation-repo>) als versionierte Git-Dependency (Tag) einbindet und nur
noch service-spezifisch verdrahtet: Tools + Login-Titel + Outbound-Secret.
Betrieb ist web-only — kein lokaler Rechner, kein VPS, kein Terminal. Alles läuft
über Claude Code (Git/PR), GitHub-Web (Merge/Tag) und das Cloudflare-Dashboard
(KV/Secrets/Logs). Bei jeder Anweisung gilt deshalb: keine wrangler tail-/SSH-
Schritte vorschlagen, sondern die Dashboard-Entsprechung.
Abgrenzung zu global-git-conventions
Dieser Skill regelt nur die MCP-Mechanik (OAuth, Transport, KV, Secrets,
Naming, Folder-Struktur, Cloudflare-Build). Alles typ-übergreifende —
README-Pflichtsektionen, SemVer/Tags, CHANGELOG, Release-Automation
(release-please) und der GitHub-About-Block — lebt in global-git-conventions
und wird von hier nur referenziert, nie dupliziert (Single Source of Truth).
Konkret heißt das: das *-mcp-README-Template steht dort (assets/readme/mcp.md),
Tags entstehen ausschließlich über release-please, und der hier beschriebene
Cloudflare-Build ist davon unabhängig (siehe references/deploy.md).
So findest du das richtige Detail
Diese SKILL.md ist der Einstieg. Die Tiefe liegt in references/ — pro Sorge eine
Datei, damit ein Debug-Fall genau eine Datei lädt statt aller. Lies gezielt:
| Aufgabe / Symptom | Datei |
|---|---|
OAuth-Provider verdrahten, /authorize-Login bauen, was der Provider selbst macht | references/auth.md |
| Transport-Setup, "Session terminated" beim Tool-Call | references/transport.md |
| KV-Binding/Namespace, KV-Hygiene (kein Cron auf Free Plan); R2 presigned Download (großer Payload statt base64) | references/storage.md |
| Inbound-Hash vs. Outbound-Key setzen, "Authorization failed" nach Consent | references/secrets.md |
| Repo-Layout, Workers-Builds Root directory, Deploy command, PR/Merge/Build, Foundation-Tag bumpen, Build-Cache-Falle, Non-Production-Branch-Builds abschalten, Renovate-Dependency-PR failt (Lockfile-Drift) | references/deploy.md |
Repo-/Naming-Standard (Worker/Tool/Secret), Folder-Struktur, Connector-URL, login-Config | references/conventions.md |
| Irgendein Fehlersymptom, Discovery-Check, Live-Logs, verifizierte CF-Fakten | references/diagnostics.md |
Vorlagen zum Kopieren liegen in assets/: provider-wiring.ts, server.ts,
wrangler.jsonc, package.json.template, tsconfig.json.template, empty-ai.js,
hooks/. Das README-Template liegt nicht hier, sondern in global-git-conventions
(assets/readme/mcp.md).
Workflow: Neuen Custom-MCP-Server anlegen
Reihenfolge einhalten — Name verifizieren vor Anlegen, Secret vor Connector, Build
verifizieren vor Push, Connector-Test immer im frischen Chat. Primärquelle für den
Code ist immer das server-template/ der Foundation; die Dateien in assets/ sind
nur kommentierte Spiegel davon. Bei Abweichung gilt das server-template/.
- Name verifizieren — Über den Cloudflare-MCP
workers_listaufrufen. Existiert der Worker schon, exakt diesen Namen übernehmen; sonst den geplanten Namen festlegen.nameinwrangler.jsonc=nameinpackage.json= Repo = Cloudflare- Service. Nie raten. Details:references/conventions.md. - KV — KV-Namespace anlegen (per Cloudflare-MCP
kv_namespace_createoder im Dashboard, KonventionMCP_OAUTH_<SERVICE>) und inwrangler.jsoncmit BindingOAUTH_KVverdrahten. Details:references/storage.md. - Repo + Wiring —
server-template/der Foundation kopieren.src/index.ts(Provider-Wiring viacreateOAuthWorker, Spiegel:assets/provider-wiring.ts),src/server.ts(Tools +TOOL_ALLOWLIST, Spiegel:assets/server.ts),wrangler.jsonc(Spiegel:assets/wrangler.jsonc),src/empty-ai.js(Spiegel:assets/empty-ai.js). Foundation als Git-Tag inpackage.json(Spiegel:assets/package.json.template),tsconfig.json(Spiegel:assets/tsconfig.json.template). Konzepte:references/auth.md,references/transport.md. Repo-Layout (wrangler.jsonc im Build-Root):references/deploy.md. - Secrets —
MCP_AUTH_PASSWORD_HASH(SHA-256-Hex) und das Outbound-Secret am Worker setzen. Outbound-Secret nicht zu setzen ist die häufigste Ursache für "Authorization failed" nach dem Consent. Details:references/secrets.md. - Build verifizieren — Vor dem Push:
npm run typecheckundnpx wrangler deploy --dry-runmüssen grün sein. Das reproduziert die Cloudflare-Build-Fehler ("entry not found" / "static files") lokal. Die Gate-Hooks imserver-template(assets/hooks/) erzwingen das. Details:references/deploy.md. - Connector — In claude.ai den Connector auf
https://<service>-mcp.<account>.workers.dev/mcpzeigen lassen, Transport streamable-http, kein Token-Feld (OAuth). Vor dem Connect den Discovery-Check fahren (references/diagnostics.md). - Test im frischen Chat — Funktionstest NIE im Debug-Thread, immer in einem neuen Chat (klebende MCP-Sessions verfälschen sonst das Ergebnis). Erst wenn ein echter Tool-Call durchläuft, gilt der Server als verifiziert.
Goldene Regeln (zeitlos)
- Funktionstest immer im frischen Chat. Das ist der einzige verlässliche Funktionstest — ein langer Debug-Thread kann eine alte MCP-Session festhalten.
- Discovery-Check vor dem Connect. Die beiden
.well-known-Endpunkte im Browser öffnen; sauberes JSON heißt: Wiring ist live und öffentlich erreichbar. - Foundation-Bumps sind bewusst, nicht automatisch. Eine neue Foundation-Version
schlägt erst durch, wenn der Konsument seine
package.jsonaktiv bumpt und neu baut. - Provider nicht nachbauen.
/token,/registerund beide.well-known-Routen liefert@cloudflare/workers-oauth-providerselbst. Selbst gebaut wird nur die/authorize-Login-Seite. - Namen nie erfinden. Vor dem Setzen von
nameworkers_list(Cloudflare-MCP) fahren und den echten Service-Namen übernehmen.namemuss inwrangler.jsonc,package.json, Repo und Cloudflare-Service identisch sein. Ausnahme (mehrere Worker aus einem Repo via Environments):nameund KV divergieren proenv-Block, der Repo-namebleibt die gemeinsame Basis — siehereferences/deploy.md. - Tool-
nameohne Punkt, ohne Prefix. Jeder Tool-nameund jederTOOL_ALLOWLIST-Eintrag muss^[a-zA-Z0-9_-]{1,64}$erfüllen — kein Punkt, kein Leerzeichen, kein camelCase. Konvention<verb>_<objekt>, snake_case, kein Service-Prefix (z.B.create_invoice,list_files). Objekt nie weglassen (list_files, nichtlist). Ein Punkt baut serverseitig durch, wird aber an der Frontend-Grenze abgewiesen (FrontendRemoteMcpToolDefinition.name) — fällt also erst beim Verbinden auf. Der Pre-Push-Gate-Hook erzwingt die Regel. name≠title. Dernameist die maschinenlesbare Aufruf-ID (snake_case, regex-streng). Dertitleist der menschenlesbare Anzeigename im Connector (Title Case, Leerzeichen erlaubt: „Create Invoice", „Inspect URL"). Lesbarkeit lebt imtitle, deshalb braucht dernamekein Prefix. Dertitleunterliegt der Regex NICHT und steht nie in derTOOL_ALLOWLIST.- Infra-Namen tragen den Anbieter, Tool-Namen nicht. Worker, KV-Namespace und
Secrets sind infra-lesbar → Anbieter/Aussteller im Namen (
google-sheets-mcp,MCP_OAUTH_GOOGLE_SHEETS,GOOGLE_REFRESH_TOKEN). Tool-names sind modell-lesbar → kurzes<verb>_<objekt>ohne Anbieter und ohne Service-Prefix (append_row, nichtsheets_append_row); die Server-Zuordnung macht der Connector-Namespace. Secret =<AUSSTELLER>_<TYP>, nicht nach Worker benannt (GOOGLE_…, nichtGSC_…). Details:references/conventions.md,references/secrets.md. - Fremdimporte laufen über die Fassade, nie direkt. Consumer importieren
zausmcp-foundation/schemaundMcpServerausmcp-foundation/sdk— nie direkt auszododer@modelcontextprotocol/sdk. Die einzige Laufzeit-Dependency im Consumer istmcp-foundation(plus repo-eigene Libs); SDK und zod stehen nicht mehr in den Consumer-dependencies. Die Foundation führt sie als eigene Deps und re-exportiert über die beiden Subpaths. Deroverrides-Pin ("@modelcontextprotocol/sdk": "1.29.0", explizite Version) bleibt Pflicht — er deduppt gegen denagents-SDK-Pin und wirkt nur vom Consumer-Root. Details:references/conventions.md,references/deploy.md. - Build nie ungeprüft pushen.
npm run typecheck+npx wrangler deploy --dry-runmüssen grün sein, bevor gepusht wird — der Cloudflare-Build wirft sonst dieselben Fehler erst nach dem Merge. Die Gate-Hooks (assets/hooks/) machen das verbindlich. - server-template ist die Wahrheit. Die
assets/-Dateien sind Spiegel; bei Abweichung gilt dasserver-template/der Foundation. Keine Asset-Drift dulden. - Non-Production-Branch-Builds aus, Lockfiles konsistent halten. Reine MCP-Worker
brauchen keine Preview-URLs — Cloudflares Branch-Builds für Renovate-Dependency-PRs
erzeugen nur fehlschlagende Builds (Lockfile hinkt dem Range-Bump hinterher). Pro
Worker in Settings → Build → Branch control die Checkbox „Builds for non-production
branches" deaktivieren (kein globales Toggle, nicht per MCP erreichbar). Das ist aber
nur Symptom-Kosmetik: den Drift selbst verhindert saubere Renovate-Lockfile-Pflege plus
Konsistenz-Check vor jedem Dependency-Merge — sonst failt der Bump im
main-Build. Details:references/deploy.md.
What ships with it: 17 files
53.3 KB alongside SKILL.md, 4 of them executable
assets/
- empty-ai.jsruns710 B
- hooks/pre-push-gate.shruns2.3 KB
- hooks/README.md942 B
- hooks/settings.json254 B
- package.json.template500 B
- provider-wiring.tsruns1.8 KB
- README.template.md1.1 KB
- server.tsruns2.4 KB
- tsconfig.json.template377 B
- wrangler.jsonc1.7 KB
references/
- auth.md4.1 KB
- conventions.md11.1 KB
- deploy.md11.2 KB
- diagnostics.md3.3 KB
- secrets.md4.3 KB
- storage.md6.1 KB
- transport.md1.2 KB