stacken.docs

Styrning för en växande portfölj av AI-tjänster

stacken.ai ↗

API · 17 operationer

mcp-gateway

Genererad ur services/mcp-gateway/openapi.json, kontraktsversion 0.1.0. Auth-modell och anropare står i atlasen.

GET /healthz

Healthz

SvarBeskrivningKropp
200Successful Response{ [nyckel]: string } application/json

GET /readyz

Readyz

SvarBeskrivningKropp
200Successful Responseany application/json

POST /v1/admin/knowledge/preview

Knowledge Preview Endpoint

ParameterITypKrävs
authorizationheaderstring | nullnej

Kropp: PreviewRequest application/json

SvarBeskrivningKropp
200Successful Responseany application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/admin/mcp-servers

List Servers

List all MCP servers for the tenant.

ParameterITypKrävs
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseServerResponse[] application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/admin/mcp-servers

Register

Register a new MCP server and run initial tool discovery. Discovery is part of the create transaction: if the server is unreachable the registration is rolled back and a 503 is returned. This keeps the mcp_servers row consistent with its tools from the start. To register a server that is not yet reachable, the operator must ensure the server is running before calling this endpoint, or use the PATCH + rediscover endpoints after the server comes online.

ParameterITypKrävs
authorizationheaderstring | nullnej

Kropp: RegisterServerRequest application/json

SvarBeskrivningKropp
201Successful ResponseServerResponse application/json
422Validation ErrorHTTPValidationError application/json

DELETE /v1/admin/mcp-servers/{server_id}

Delete Server

Soft-delete a server: set status=disabled, hide all tools, evict from registry.

ParameterITypKrävs
server_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
204Successful Response—
422Validation ErrorHTTPValidationError application/json

GET /v1/admin/mcp-servers/{server_id}

Get Server

Get a single MCP server with tools populated.

ParameterITypKrävs
server_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseServerResponse application/json
422Validation ErrorHTTPValidationError application/json

PATCH /v1/admin/mcp-servers/{server_id}

Patch Server

Partially update a server's description, status, egress_allowlist, or auth_config.

ParameterITypKrävs
server_idpathstring (uuid)ja
authorizationheaderstring | nullnej

Kropp: PatchServerRequest application/json

SvarBeskrivningKropp
200Successful ResponseServerResponse application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/admin/mcp-servers/{server_id}/grants

List Grants

Serverns behörigheter, med personen bakom varje subjektbunden grant. Tenant-predikatet ligger i SQL på BÅDA leden: `_load_tenant_server` för servern och `AccessGrant.tenant_id` för raderna. Ingen databasinvariant binder de två (`D-70` `Kvarstår 7`), så predikatet ÄR isoleringen här.

ParameterITypKrävs
server_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseGrantOut[] application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/admin/mcp-servers/{server_id}/grants

Create Grant

Ge en person eller en grupp åtkomst till serverns verktyg (`P19`). **`tenant_id` tas ur `ctx`, aldrig ur bodyn**, och servern laddas med tenant-predikat. Kombinationen "grant för tenant A på tenant B:s server" är därför inte konstruerbar genom ytan — vilket är det enda skyddet som finns, eftersom ingen FK binder de två (`D-70` `Kvarstår 7`). Den sammansatta FK:n är en migrering mot befintliga rader och kräver ett eget vägval. **Auditraden skrivs FÖRE `commit()`**, samma audit-first-invariant som `app/services/tool_call.py`. Kedjan bor i plattforms-databasen och granten i den tenant-lokala, så EN transaktion är fysiskt omöjlig — ordningen är det som gör felfallet fail-closed. Faller skrivningen finns ingen grant, bara ett 500. Motsatt ordning hade lämnat en behörighetsändring utan spår, vilket är precis det den hårda regeln förbjuder. Raden bär den beviljade personens id — aldrig e-posten (GDPR first).

ParameterITypKrävs
server_idpathstring (uuid)ja
authorizationheaderstring | nullnej

Kropp: GrantCreate application/json

SvarBeskrivningKropp
201Successful ResponseGrantOut application/json
422Validation ErrorHTTPValidationError application/json

DELETE /v1/admin/mcp-servers/{server_id}/grants/{grant_id}

Delete Grant

Ta tillbaka en behörighet. Hård radering — en grant är ett tillstånd, inte en liggare. Spåret ligger i auditkedjan, som är append-only; raden i `access_grants` behöver inte bära sin egen historik.

ParameterITypKrävs
server_idpathstring (uuid)ja
grant_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
204Successful Response—
422Validation ErrorHTTPValidationError application/json

POST /v1/admin/mcp-servers/{server_id}/rediscover

Rediscover

Trigger tools/list and upsert for an existing server.

ParameterITypKrävs
server_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseServerResponse application/json
422Validation ErrorHTTPValidationError application/json

PATCH /v1/admin/mcp-servers/{server_id}/tools/{tool_name}/scope

Update Tool Scope

Update the scope of a single tool on a server.

ParameterITypKrävs
server_idpathstring (uuid)ja
tool_namepathstringja
authorizationheaderstring | nullnej

Kropp: ToolScopeUpdate application/json

SvarBeskrivningKropp
204Successful Response—
422Validation ErrorHTTPValidationError application/json

GET /v1/admin/tool-usage

Get Tool Usage

Aggregerad verktygsanvändning för anroparens EGEN tenant. `period` är valfri (`YYYY-MM`); utelämnad ⇒ INNEVARANDE MÅNAD (samma default som llm-gatewayens `tenant_usage_report` — Task 6 slår ihop de två halvorna för SAMMA period, så "utelämnad" måste betyda samma sak på båda sidor). Formatfel ⇒ 400: `tool_usage_report` reser `ValueError` (regeln bor i `_month_start_local`, delad logik med SQL-fönstret), och den fångas HÄR — inte en dubblerad regex i routern som kan glida isär från den som faktiskt styr frågan.

ParameterITypKrävs
periodquerystring | nullnej
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseToolUsageOut application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/operator/tenants/{tenant_id}/tool-usage

Get Tool Usage For Operator

Samma aggregat som `/v1/admin/tool-usage`, för operatörens fakturakörning (P48). Tenanten är instansens, prövad mot sökvägen i `require_operator_usage_read`. Läsningen auditeras FÖRE svaret: går raden inte att skriva lämnar inga siffror tjänsten (503). Rapporten räknas först, så att ett formatfel på `period` ger 400 utan en auditrad för en läsning som aldrig skedde.

ParameterITypKrävs
tenant_idpathstringja
periodquerystring | nullnej
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseToolUsageOut application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/tools

List Tools

ParameterITypKrävs
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseToolListResponse application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/tools/call

Call Tool

ParameterITypKrävs
authorizationheaderstring | nullnej

Kropp: ToolCallRequest application/json

SvarBeskrivningKropp
200Successful ResponseToolCallResponse application/json
422Validation ErrorHTTPValidationError application/json

Scheman

AuthConfig

Registreringens auth_config — STRIKT. Svarsvägen använder `AuthConfigView`. Strikthet hör hemma där ny data kommer in. Läsvägen är tolerant med flit; skälet står i `AuthConfigView`.

FältTypKrävs
password_secret_refstring | nullnej
tokenstring | nullnej
token_secret_refstring | nullnej
type"none" | "bearer" | "basic"nej
username_secret_refstring | nullnej

AuthConfigView

Svarsvägens auth_config — TOLERANT med flit, till skillnad från `AuthConfig`. Två skäl, båda mätta i `P15`: 1. **Läsvägen får inte 500:a på gammal data.** `AuthConfig` är strikt sedan `P15` (en `bearer` utan källa avvisas). Rader skrivna innan den regeln fanns bryter mot den, och `_to_response*` bygger sitt svar UR raden. En strikt svarsmodell hade gjort registret oläsbart precis när någon försöker städa det. 2. **Modellen har inget `token`-fält.** `AuthConfig` bär ett, för dev-lägets inline-token. Att svarsvägen använder en modell som inte KAN uttrycka en hemlighet är starkare än att komma ihåg att inte fylla i den.

FältTypKrävs
password_secret_refstring | nullnej
token_secret_refstring | nullnej
typestringnej
username_secret_refstring | nullnej

ClassCountOut

FältTypKrävs
callsintegerja
information_classstring | nullja

GrantCreate

En ny behörighet: EN person (e-post) eller EN grupp, aldrig båda (`P19`). **Ingen parameter för ett rått `subject`, och det är designen.** `access_grants.subject` är definierad att bära `platform:<auth.users.id>` (`D-99`) och konstrueras av ytan ur ett uppslaget användar-id. En människa som klistrar in en subjektsträng gissar en form som databasens CHECK sedan avvisar — och den CHECK:en är det enda som håller, eftersom modellens motsvarighet är dokumentation utan grind (`D-99` `Kvarstår 3`). `tool_name=None` betyder "alla verktyg på servern" — samma semantik som `app/services/grants.py` läser, inte en ny.

FältTypKrävs
group_namestring | nullnej
scope_cap"read_only" | "read_write" | "destructive"nej
tool_namestring | nullnej
user_emailstring | nullnej

GrantOut

En grant som den visas för en administratör. `subject` ekas ALDRIG. Det som visas är personen: `user_id` plus den upplösta `user_email`/`user_status`. Är personen inte upplösbar — raderad eller borttagen — är de två `null`, och det är hur en föräldralös grant blir SYNLIG i stället för att tyst ligga kvar (`P19`). `group_mapped` gör samma sak för grupper (`P59`): `false` när tenanten saknar mappning för gruppen, så granten aldrig kan matcha; `null` för en person-grant.

FältTypKrävs
created_atstringja
group_mappedboolean | nullja
group_namestring | nullja
idstring (uuid)ja
scope_capstringja
tool_namestring | nullja
user_emailstring | nullja
user_idstring (uuid) | nullja
user_statusstring | nullja

GroupCountOut

FältTypKrävs
callsintegerja
groupstringja

HTTPValidationError

FältTypKrävs
detailValidationError[]nej

PatchServerRequest

FältTypKrävs
auth_configAuthConfig | nullnej
descriptionstring | nullnej
egress_allowliststring[] | nullnej
identity_mode"service" | "delegated" | nullnej
status"active" | "disabled" | nullnej

PreviewRequest

K3-requestet. extra='forbid': platform_context är gateway-konstruerat (K1) — ett caller-angivet fält (t.ex. platform_context) ska 422:a, inte tyst ignoreras eller skugga gatewayens egen kontext.

FältTypKrävs
collection_idstring (uuid)ja
include_draftsbooleannej
questionstringja

RegisterServerRequest

FältTypKrävs
auth_configAuthConfignej
descriptionstring | nullnej
egress_allowliststring[]nej
endpointstringja
identity_mode"service" | "delegated"nej
namestringja
transport"sse" | "http"ja

ServerResponse

FältTypKrävs
auth_configAuthConfigViewja
descriptionstring | nullja
egress_allowliststring[]ja
endpointstringja
idstring (uuid)ja
identity_modestringja
namestringja
statusstringja
tenant_idstring (uuid)ja
toolsToolInfo[]nej
transportstringja
versionintegerja

ToolCallRequest

FältTypKrävs
assistant_idstring (uuid)ja
tool_argsobjectnej
tool_namestringja
trace_idstringja

ToolCallResponse

FältTypKrävs
audit_event_idstring (uuid)ja
resultanyja

ToolCountOut

FältTypKrävs
callsintegerja
tool_namestringja

ToolDescriptor

FältTypKrävs
descriptionstring | nullnej
input_schemaobjectja
namestringja
scopestringja

ToolInfo

FältTypKrävs
descriptionstring | nullnej
scopestringja
statusstringja
timeout_msintegerja
tool_namestringja
tool_schemaobjectja

ToolListResponse

FältTypKrävs
toolsToolDescriptor[]ja

ToolScopeUpdate

FältTypKrävs
scope"read_only" | "read_write" | "destructive"ja
tool_namestringja

ToolUsageOut

FältTypKrävs
by_groupGroupCountOut[]ja
by_information_classClassCountOut[]ja
by_toolToolCountOut[]ja
oldest_classified_atstring (date-time) | nullja
periodstring | nullja
tenant_idstringja
total_callsintegerja
turnsintegerja

ValidationError

FältTypKrävs
ctxobjectnej
inputanynej
locstring | integer[]ja
msgstringja
typestringja