Gå til hovedinnhold

Ekstern MCP-server

fremforge kjører en server for Model Context Protocol på:

https://frem.sh/_app/mcp

Den gir en AI-assistent lesetilgang til organisasjonens data i fremforge: sikkerhetsfunn, komponentoversikten, utrullinger, pakketilgang, policyer, runner-bruk og CI-logger. Det er ingenting å installere. Serveren er ekstern og bruker transporten Streamable HTTP.

Hva verktøyene er

Hvert verktøy er én operasjon i fremforges REST-API, og et verktøykall er det samme REST-kallet utført med tokenet ditt. Verktøyet kan gjøre nøyaktig det tokenet ditt kan gjøre gjennom https://frem.sh/_app/api/v1, med de samme scopene, de samme grensene for antall kall og det samme revisjonssporet. En 403 fra REST-API-et kommer tilbake som en verktøyfeil med den samme forklaringen.

  • Skrivebeskyttet, bortsett fra noen få skriveverktøy. Verktøyene er GET-operasjoner som er merket readOnlyHint for klienten din. Noen få navngitte skriveverktøy kan handle som deg, men bare etter at du har gitt samtykke til hvert enkelt når du logger inn, og bare der eierne av organisasjonen din tillater det.
  • 43 verktøy, for eksempel whoami, explain_pull_request, list_events (hendelsesfeeden), list_merge_holds, list_sast_findings, list_dependency_findings, list_secret_findings, search_components, list_vulnerable_components, get_dependency_paths, list_repo_deployments, get_actions_run_logs, get_org_policy, get_package_access, get_org_settings (en organisasjons innstillinger for Active work, merge-hold, utgivelsestog, risikonivå, AI-koblinger og AI-funksjoner, med det du har lov til å se) og get_my_settings (dine egne brytere for Active work). Klienten din viser alle sammen, med beskrivelser, når den kobler til.
  • Ikke inkludert: Git-repositoryer, issues, innholdet i pull requests og lister over workflow-kjøringer. Disse leveres av Forgejo-API-et på https://frem.sh/api/v1, ikke av fremforge-API-et. Hvorfor en pull request ikke blir merget, er inkludert: se Hvorfor en pull request ikke blir merget.
  • Store resultater kuttes ved 100 000 tegn, med en merknad om det. Bruk verktøyets argumenter limit, cursor eller filtre for å snevre dem inn.

Hvorfor en pull request ikke blir merget

Verktøyet explain_pull_request svarer på hvorfor en pull request ikke er merget. Det er REST-kallet:

curl -sS https://frem.sh/_app/api/v1/orgs/<org>/repos/<repo>/pulls/<number>/why \
  -H "Authorization: Bearer $FREMFORGE_TOKEN"

Det krever scopet findings:read. Med en kobling med innlogging er lesetilgang til repositoryet nok.

Svaret leser de samme fakta som avgjør om noe blir merget: merge-køens egen status, de påkrevde sjekkene på head-commiten, godkjenninger, om auto-merge er aktivert, konflikter og en åpen issue merket release-freeze i repositoryet. En assistent får ett svar i stedet for å måtte sette det sammen fra listen over sjekker.

{
  "repo": "acme/api",
  "number": 42,
  "state": "failed",
  "next_action": "update the branch from main and re-run \"code-build / build (pull_request)\"",
  "reasons": [
    {
      "code": "stale_base_check",
      "kind": "failure",
      "source": "pr",
      "check": "code-build / build (pull_request)",
      "detail": "Required check \"code-build / build (pull_request)\" failed on an old base: main has moved since it ran.",
      "next_action": "update the branch from main and re-run \"code-build / build (pull_request)\""
    },
    {
      "code": "not_armed",
      "kind": "info",
      "source": "pr",
      "detail": "Auto-merge is not armed.",
      "next_action": "arm auto-merge once the reasons above are cleared"
    }
  ],
  "queue": null,
  "checks": { "required": ["code-build / build (pull_request)", "fremforge/dep-scan"], "passed": 1, "pending": 0, "failed": 1 },
  "approvals": { "required": 1, "approved": 1, "waived": false },
  "armed": false,
  "incomplete": []
}
  • state er en av mergeable, waiting, blocked, failed, merged eller closed.
  • reasons listes med feil først, deretter blokkeringer og så ventetilstander. Hver årsak har en code, en kort detail og en next_action.
  • Koder fra pull requesten:
    • required_check_failed og required_check_pending.
    • stale_base_check: en påkrevd sjekk ble rød, og base-branchen har flyttet seg siden sjekken startet. Oppdater branchen og kjør sjekken på nytt før du feilsøker den.
    • approvals_missing: next_action sier hvem du skal spørre.
    • conflict, draft, armed og not_armed.
  • Kode fra repositoryet: freeze.
  • Koder fra merge-køen (source: "queue"): group_failed, pending_timeout, failing_checks, own_checks_timeout, conflict, draft, approvals, no_permission, protected_files, merge_style, renovate og agit. En fjerning som forklaringen ikke kjenner igjen, har koden queue_removed.
  • queue gir posisjonen, lengden og et forventet tidspunkt mens pull requesten står i merge-køen.
  • incomplete nevner alle fakta som ikke kunne leses, for eksempel freeze eller approvals. Svaret kan da mangle en årsak. Ingenting gjettes.

For den rå listen over sjekker for en hvilken som helst branch, tag eller commit har koblinger med innlogging også get_commit_status, som returnerer Forgejos samlede status.

Token

Serveren godtar et API-token for fremforge (ffp_…) som bearer-token. Opprett et på https://frem.sh/<org>/_admin/api-tokens med Lag token, og gi det lese-scopene for verktøyene du vil bruke. Beskrivelsen av hvert verktøy nevner scopet det trenger, for eksempel findings:read, components:read, policy:read eller runners:read.

Annen legitimasjon blir avvist, inkludert Git-tilgangstokener (personlige tilgangstokener fra Forgejo) og OAuth-tokener fra Forgejo. Med et API-token er Forgejo-verktøyene (repositoryer, pull requests, issues) ikke tilgjengelige: de krever koblingen med innlogging.

Begynn med verktøyet whoami. Det viser hvilken organisasjon og hvilke scopes tokenet har.

Claude Code

claude mcp add --transport http fremforge https://frem.sh/_app/mcp \
  --header "Authorization: Bearer ffp_<your-token>"

Eller i .mcp.json:

{
  "mcpServers": {
    "fremforge": {
      "type": "http",
      "url": "https://frem.sh/_app/mcp",
      "headers": { "Authorization": "Bearer ${FREMFORGE_TOKEN}" }
    }
  }
}

Cursor

I ~/.cursor/mcp.json (eller .cursor/mcp.json i et prosjekt):

{
  "mcpServers": {
    "fremforge": {
      "url": "https://frem.sh/_app/mcp",
      "headers": { "Authorization": "Bearer ffp_<your-token>" }
    }
  }
}

Logg inn i stedet for å bruke et token. Utelat headers, så logger Cursor deg inn med OAuth. Ifølge MCP-dokumentasjonen støtter Cursor OAuth for servere som krever det:

{
  "mcpServers": {
    "fremforge": { "url": "https://frem.sh/_app/mcp" }
  }
}

Cursor registrerer seg selv hos frem.sh, så du trenger ingen klient-ID. Deretter åpner Cursor frem.sh i nettleseren din, og du logger inn og gir tilgang som beskrevet i Innlogging og samtykke. Når du er innlogget, får Cursor også de skrivebeskyttede Forgejo-verktøyene. Skrivebordsappen mottar innloggingen på din egen maskin; Cursor på nett og Cursor Agents mottar den på cursor.com. For å slutte fjerner du serveren eller slår den av under Customize, og trekker den også tilbake på frem.sh.

Mistral

Le Chat. En administrator legger til en egendefinert MCP-kobling:

  1. Server-URL: https://frem.sh/_app/mcp
  2. Autentisering: HTTP Bearer Token, med ffp_…-tokenet ditt.

Le Chat deler verktøy inn i lese- og skrivefunksjoner. Alle fremforge-verktøyene er skrivebeskyttede.

Agents-API og SDK. Send tokenet som en header. I Python-SDK-en gir du MCPClientStreamableHTTP en StreamableHTTPServerParams(url="https://frem.sh/_app/mcp", headers={"Authorization": "Bearer ffp_…"}). Når du registrerer en Studio-kobling (POST /v1/connectors), legger du den samme headeren i headers.

Le Chat kan også logge deg inn med OAuth i stedet for et token: se Le Chat.

Koblinger med innlogging: claude.ai, ChatGPT, Le Chat

Chatapper som legger til en MCP-server som kobling, logger deg inn med OAuth i stedet for et token. fremforge er autorisasjonsserveren for https://frem.sh/_app/mcp. Den støtter Client ID Metadata Documents, så en kobling som identifiserer seg med et publisert dokument, trenger ingen registrering. Den støtter også dynamisk klientregistrering for koblinger som registrerer seg selv. Du skriver aldri inn en klient-ID eller en klienthemmelighet.

Innlogging og samtykke

Koblingen åpner frem.sh i nettleseren din. Det som skjer videre, er det samme for alle koblinger:

  1. Logg inn på frem.sh som vanlig, med organisasjonens single sign-on og andre faktor der det gjelder. Er du allerede innlogget, hoppes dette steget over.
  2. Samtykkesiden i fremforge viser navnet på koblingen, adressen den vil sende deg tilbake til, og hva den kan gjøre: lese, som deg, de dataene og repositoryene i fremforge som du kan lese. Hvis koblingen identifiserte seg med et metadatadokument, viser siden hele adressen til dokumentet. fremforge har ikke bekreftet navnet, så gi bare tilgang hvis det er du selv som legger til koblingen.
  3. Velg Tillat. Du kommer tilbake til chatappen, og koblingen vises som tilkoblet.

En tilkoblet assistent kan bruke verktøyene ovenfor, i tillegg til skrivebeskyttede Forgejo-verktøy: list_repos, get_repo, get_repo_tree, get_file_contents, list_branches, list_commits, get_commit, get_commit_diff, get_commit_status, list_pull_requests, get_pull_request, get_pull_request_diff, list_pull_request_files, list_pull_request_reviews, list_issues, get_issue, list_issue_comments, list_workflow_runs, get_workflow_run og list_workflow_jobs. Den kan ikke endre noe.

Den har nøyaktig den tilgangen du har gjennom API-et. Organisasjonsverktøyene svarer for organisasjonene du eier, og skrivebeskyttet der du er revisor. Forgejo-verktøyene svarer for repositoryene Forgejo lar deg lese. IP-tillatelseslisten til organisasjonen din gjelder for koblingen på samme måte som for deg.

Koblingen handler på dine vegne og har ingen egen identitet. En revisjonshendelse som kallene dens skriver, oppgir deg som actor, med koblingen som en detalj: fields.agent er mcp-client:<client id>. Revisjonsloggen i administrasjonen viser slike hendelser med merket via agent.

Koblingen får aldri passordet ditt til frem.sh eller tokenene dine. Dens egen tilgang varer én time om gangen og fornyes i bakgrunnen.

claude.ai

Egendefinerte koblinger fungerer i Claude på nett, i Claude Desktop og i Cowork. Gratisabonnementer tillater én egendefinert kobling. Claudes veiledning for egendefinerte koblinger har de gjeldende stegene:

  1. Pro og Max: gå til Customize → Connectors, velg + Add og deretter Add custom connector. Team og Enterprise: en eier går til Organization settings → Connectors, velger Add og deretter Custom → Web. Medlemmene finner så koblingen under Customize → Connectors og velger Connect.
  2. Gi den et navn, for eksempel fremforge, og skriv inn server-URL-en https://frem.sh/_app/mcp.
  3. For OAuth-klienten beholder du Use Claude’s published identity. Register automatically fungerer også. La request headers stå tomme.
  4. Velg Add, og logg deretter inn og gi tilgang som beskrevet i Innlogging og samtykke.

For å bruke den velger du + i en chat, deretter Connectors, og slår på fremforge for den samtalen. For å fjerne den bruker du Remove eller menyen ved siden av koblingen på den samme siden, og trekker den også tilbake på frem.sh.

ChatGPT

ChatGPT kaller egendefinerte MCP-servere for plugins eller apper. For å legge til en trengs utviklermodus, og på Business-, Enterprise- og Edu-abonnementer kan det hende at en administrator for arbeidsområdet må tillate det. OpenAIs veiledning for å koble en MCP-server til ChatGPT har de gjeldende stegene:

  1. Åpne ChatGPT Plugins, velg + og deretter Add custom MCP server.
  2. Skriv inn et navn og en beskrivelse. Under Connection velger du Public endpoint og skriver inn https://frem.sh/_app/mcp.
  3. Velg OAuth for autentisering. ChatGPT finner innloggingen til frem.sh via serveren, så det trengs ingen klient-ID. Bekreft risikovarselet og velg Create as a plugin.
  4. Logg inn og gi tilgang som beskrevet i Innlogging og samtykke.

ChatGPT viser verktøyene den fant. For å bruke dem skriver du @ i en ny samtale og velger pluginen. For å fjerne den kobler du den fra eller sletter den i appinnstillingene i ChatGPT, og trekker den også tilbake på frem.sh.

Le Chat

I Le Chat er det en administrator som legger til egendefinerte koblinger. På abonnementene Free, Pro og Student er kontoeieren administrator. Mistrals dokumentasjon for MCP-koblinger har de gjeldende stegene:

  1. Åpne Connectors, velg + Add Connector og bytt til fanen Custom MCP Connector.
  2. Skriv inn et navn på koblingen uten mellomrom, for eksempel fremforge, og server-URL-en https://frem.sh/_app/mcp.
  3. Velg Connect. Le Chat oppdager OAuth 2.1 og registrerer seg selv.
  4. Logg inn og gi tilgang som beskrevet i Innlogging og samtykke.

Hver bruker kan forhåndsgodkjenne funksjoner under Connectors → My Connectors, i fanen Functions for koblingen. Ellers spør Le Chat før hvert kall. Alle fremforge-funksjonene er skrivebeskyttede. For å slutte å bruke den fjerner du den på Connectors-siden og trekker den også tilbake på frem.sh. Le Chat godtar også et ffp_-token som HTTP bearer-token i stedet for innlogging, som i Mistral ovenfor.

Skrivebordsapper og omdirigeringer

En skrivebords- eller kommandolinjeklient som logger inn via nettleseren, trenger å få koden tilbake på den samme enheten. fremforge godtar to typer omdirigeringer for dette:

  • Loopback: http://127.0.0.1/…, http://[::1]/… eller http://localhost/…. Porten ignoreres ved sammenligningen, så en klient kan lytte på hvilken som helst ledig port (RFC 8252 avsnitt 7.3). Claude Code og skrivebordsappen til Cursor fungerer på denne måten.
  • App-skjemaer, som cursor://…, vscode://… eller com.example.app:/callback, for klienter uten klienthemmelighet. De må samsvare nøyaktig, port inkludert. Samtykkesiden nevner skjemaet og advarer om at enhver installert app kan gjøre krav på det, så gi bare tilgang for en app du kobler til selv.

Noen skjemaer godtas aldri som omdirigering, uansett store eller små bokstaver:

  • skjemaer som en nettleser eller operativsystemet behandler som innhold eller navigasjon: javascript, data, file, blob, ftp, about, ws, wss, vbscript, view-source, chrome, chrome-extension, moz-extension og intent;
  • fremforges egne navn: fremforge, frem og sh.frem;
  • http mot noe annet enn en loopback-adresse.

PKCE er påkrevd i alle tilfeller.

Blokker koblinger for en organisasjon

Koblinger er tillatt som standard. En eier kan blokkere dem under Organisasjonsadministrasjon → Sikkerhet → AI-koblinger, eller med PUT /orgs/{org}/policy og {"ai_connectors": {"access": "blocked"}}. Så lenge de er blokkert, blir alle koblingskall mot organisasjonens data, inkludert repositoryene, avvist med 403. API-tokener påvirkes ikke. Hver endring registreres i revisjonsloggen som tenant.ai_connectors.blocked eller tenant.ai_connectors.allowed.

Trekk tilbake en kobling

Når du trekker tilbake en kobling, avsluttes alle øktene dens på én gang. List opp koblingene dine, og slett den du vil trekke tilbake, med legitimasjon som bærer identiteten din, for eksempel den som fremforge auth login lagrer:

curl -sS https://frem.sh/_app/api/v1/users/me/connector-grants -H "Authorization: Bearer $TOKEN"
curl -sS -X DELETE https://frem.sh/_app/api/v1/users/me/connector-grants/<id> -H "Authorization: Bearer $TOKEN"

For å koble den til igjen legger du den til på nytt; den ber da om samtykke på nytt. Hvis du tilbakekaller fremforges koblingsapplikasjon under Autoriserte OAuth2-applikasjoner på frem.sh/user/settings/applications, eller kontoen din deaktiveres, avsluttes også alle koblingene dine neste gang en av dem brukes.

Kontroller tilkoblingen

curl -sS https://frem.sh/_app/mcp \
  -H "Authorization: Bearer $FREMFORGE_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"whoami","arguments":{}}}'

Feil

Du serBetydning
HTTP 401 med WWW-Authenticate: BearerIngen token, eller et ukjent, utløpt eller tilbakekalt token. Headerens resource_metadata viser koblinger veien til innlogging.
Et verktøyresultat som begynner med HTTP 403Tokenet er gyldig, men mangler verktøyets scope, eller har ikke tilgang til den organisasjonen. Verktøybeskrivelsen nevner scopet.
Et verktøyresultat som begynner med HTTP 404Organisasjonen, repositoryet eller objektet finnes ikke, eller tokenet kan ikke se det.
HTTP 405 på GETForventet. Serveren er tilstandsløs og svarer bare på POST.

Suverenitet

Leverandøren av assistenten din mottar det verktøyene returnerer, på samme måte som den mottar filene du åpner. fremforge sender ikke dataene dine til noen AI-leverandør. MCP-serveren er en del av fremforge-API-et og kjører på den samme plattformen i EU.