The full GitLab REST API as a JSRPC capability. 1,047 operations, 51 namespaces, generated from GitLab's official OpenAPI v2 spec.
How-to
Install
Click the Deploy button above.
Set the API key
wrangler secret put GITLAB_API_KEY
Bind from a caller Worker
Call any GitLab endpoint
const { result, evidence } = await env.GITLAB.mergeRequests.createNote({ id: "cloudflare/ai-agents/lee", mergeRequestIid: 4172, body: "LGTM", }); const { result: issue } = await env.GITLAB.issues.create({ id: "cloudflare/ai-agents/lee", title: "Add capa-jira", description: "See parent epic.", }); const { result: pipeline } = await env.GITLAB.pipelines.retry({ id: "cloudflare/ai-agents/lee", pipeline_id: 12345, });
Connect to a self-managed instance (e.g. gitlab.cfdata.org)
wrangler secret put GITLAB_BASE_URL_OVERRIDE # https://gitlab.cfdata.org wrangler secret put CF_ACCESS_CLIENT_ID # Cloudflare Access service token wrangler secret put CF_ACCESS_CLIENT_SECRET # Cloudflare Access service token secret
The runtime will send CF-Access-Client-Id and CF-Access-Client-Secret headers on every request when both secrets are present.
Add a custom evidence override
Edit src/overrides.ts:
export const overrides = { mergeRequests: { merge: { asserts: [ equals("state", "merged"), ], }, }, };
Regenerate from the latest GitLab spec
cd ../../tools/codegen
bun src/cli.ts \
--spec https://docs.gitlab.com/api/openapi/openapi_v2.yaml \
--out ../../capabilities/gitlab \
--name gitlab \
--base-url https://gitlab.com \
--prefix /api/v4 \
--auth private-token \
--content-type jsonReference
Coverage
| Count | |
|---|---|
| Operations | 1,047 |
| Namespaces | 51 |
| Worker bundle (uncompressed) | 581 KiB |
| Worker bundle (gzipped) | 51 KiB |
| Source spec version | GitLab API vv4 (Swagger 2.0) |
Evidence overrides applied
These methods get richer assertions than the generic HTTP-status check:
| Method | Assertions |
|---|---|
mergeRequests.createNote |
id exists, id is number, body exists |
mergeRequests.update |
id exists, iid exists |
mergeRequests.approve |
state == approved |
issues.create |
id exists, iid exists, state == opened |
issues.update |
id exists, iid exists |
pipelines.retry |
id exists, status exists |
Every other operation gets a generic httpStatus 2xx assertion.
Required secrets
| Secret | Source |
|---|---|
GITLAB_API_KEY |
GitLab → User Settings → Access Tokens |
Optional secrets (self-managed / cfdata)
| Secret | When needed |
|---|---|
GITLAB_BASE_URL_OVERRIDE |
Self-managed GitLab (e.g. https://gitlab.cfdata.org) |
CF_ACCESS_CLIENT_ID |
Cloudflare Access in front of GitLab |
CF_ACCESS_CLIENT_SECRET |
Cloudflare Access in front of GitLab |
Public HTTP route
fetch() returns 404. The Worker is JSRPC-only.
Generated files (do not edit)
| File | Purpose |
|---|---|
src/generated/schema.gen.ts |
openapi-typescript output, full type tree |
src/generated/capability.gen.ts |
RpcTarget classes + WorkerEntrypoint |
src/generated/manifest.gen.ts |
operationId → metadata map |
src/generated/runtime.ts |
Evidence-aware fetch helper |
Editable files
| File | Purpose |
|---|---|
src/index.ts |
Worker entry, applies overrides |
src/overrides.ts |
Per-method evidence overrides |
wrangler.jsonc |
Deployment config |