From 509240885b7f99b281d1704dd8d0f29eb8337497 Mon Sep 17 00:00:00 2001 From: ryan-crabbe-berri Date: Tue, 14 Jul 2026 09:33:54 -0700 Subject: [PATCH] fix(proxy): register a lazy feature whose module a sibling already imported generate_snapshot skipped registration when the feature's module was already in sys.modules, treating "imported" as "registered". Importing one feature can drag a sibling in as a side effect: loading vector_stores imports its neighbour vector_store_management. That module was therefore never registered, contributed no routes, and the fragment was dropped from the snapshot entirely, taking POST /vector_store/new, /info, /update and /delete out of the OpenAPI spec. The Terraform provider audit caught them as "not served by the proxy". Gate on the set of modules loaded before registration began instead of live sys.modules, so a sibling import during the loop no longer masks a feature. This is the invariant the runtime loader already keeps explicitly in app.state.lazy_loaded. A route-prefix check would not work here: policy_engine and guardrails both own /policies/usage, so the first to register would mask the second. The snapshot gains back vector_store_management (33 fragments, not 32). --- litellm/proxy/_lazy_openapi_snapshot.json | 1955 ++++++++++++++++- litellm/proxy/_lazy_openapi_snapshot.py | 19 +- .../proxy/test_lazy_openapi_snapshot.py | 35 +- ui/litellm-dashboard/src/lib/http/schema.d.ts | 1165 +++++++++- 4 files changed, 3140 insertions(+), 34 deletions(-) diff --git a/litellm/proxy/_lazy_openapi_snapshot.json b/litellm/proxy/_lazy_openapi_snapshot.json index 3733cfffe41..e07d2fd0dfc 100644 --- a/litellm/proxy/_lazy_openapi_snapshot.json +++ b/litellm/proxy/_lazy_openapi_snapshot.json @@ -14869,13 +14869,446 @@ }, "mcp_byok_oauth": { "components": { - "schemas": {} + "schemas": { + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "title": "Detail", + "type": "array" + } + }, + "title": "HTTPValidationError", + "type": "object" + }, + "ValidationError": { + "properties": { + "ctx": { + "title": "Context", + "type": "object" + }, + "input": { + "title": "Input" + }, + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "title": "Location", + "type": "array" + }, + "msg": { + "title": "Message", + "type": "string" + }, + "type": { + "title": "Error Type", + "type": "string" + } + }, + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError", + "type": "object" + } + } }, - "paths": {} + "paths": { + "/.well-known/oauth-authorization-server": { + "get": { + "description": "OAuth authorization server discovery endpoint.\n\nSupports both legacy pattern (/{server_name}) and root endpoint.", + "operationId": "oauth_authorization_server_mcp__well_known_oauth_authorization_server_get", + "parameters": [ + { + "in": "query", + "name": "mcp_server_name", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mcp Server Name" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Authorization Server Mcp", + "tags": [ + "mcp_byok_oauth" + ] + } + }, + "/.well-known/oauth-authorization-server/mcp/{mcp_server_name}": { + "get": { + "description": "OAuth authorization server discovery endpoint using standard MCP URL pattern.\n\nStandard pattern: /mcp/{server_name}\nDiscovery path: /.well-known/oauth-authorization-server/mcp/{server_name}", + "operationId": "oauth_authorization_server_mcp_standard__well_known_oauth_authorization_server_mcp__mcp_server_name__get", + "parameters": [ + { + "in": "path", + "name": "mcp_server_name", + "required": true, + "schema": { + "title": "Mcp Server Name", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Authorization Server Mcp Standard", + "tags": [ + "mcp_byok_oauth" + ] + } + }, + "/.well-known/oauth-authorization-server/{mcp_server_name}": { + "get": { + "description": "OAuth authorization server discovery endpoint.\n\nSupports both legacy pattern (/{server_name}) and root endpoint.", + "operationId": "oauth_authorization_server_mcp__well_known_oauth_authorization_server__mcp_server_name__get", + "parameters": [ + { + "in": "path", + "name": "mcp_server_name", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mcp Server Name" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Authorization Server Mcp", + "tags": [ + "mcp_byok_oauth" + ] + } + }, + "/.well-known/oauth-authorization-server/{mcp_server_name}/mcp": { + "get": { + "description": "OAuth authorization server discovery for legacy /{server_name}/mcp pattern.", + "operationId": "oauth_authorization_server_legacy__well_known_oauth_authorization_server__mcp_server_name__mcp_get", + "parameters": [ + { + "in": "path", + "name": "mcp_server_name", + "required": true, + "schema": { + "title": "Mcp Server Name", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Authorization Server Legacy", + "tags": [ + "mcp_byok_oauth" + ] + } + }, + "/.well-known/oauth-protected-resource": { + "get": { + "description": "OAuth protected resource discovery endpoint using LiteLLM legacy URL pattern.\n\nLegacy pattern: /{server_name}/mcp\nDiscovery path: /.well-known/oauth-protected-resource/{server_name}/mcp\n\nThis endpoint is kept for backward compatibility. New integrations should\nuse the standard MCP pattern (/mcp/{server_name}) instead.", + "operationId": "oauth_protected_resource_mcp__well_known_oauth_protected_resource_get", + "parameters": [ + { + "in": "query", + "name": "mcp_server_name", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mcp Server Name" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Protected Resource Mcp", + "tags": [ + "mcp_byok_oauth" + ] + } + }, + "/.well-known/oauth-protected-resource/mcp/{mcp_server_name}": { + "get": { + "description": "OAuth protected resource discovery endpoint using standard MCP URL pattern.\n\nStandard pattern: /mcp/{server_name}\nDiscovery path: /.well-known/oauth-protected-resource/mcp/{server_name}\n\nThis endpoint is compliant with MCP specification and works with standard\nMCP clients like mcp-inspector and VSCode Copilot.", + "operationId": "oauth_protected_resource_mcp_standard__well_known_oauth_protected_resource_mcp__mcp_server_name__get", + "parameters": [ + { + "in": "path", + "name": "mcp_server_name", + "required": true, + "schema": { + "title": "Mcp Server Name", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Protected Resource Mcp Standard", + "tags": [ + "mcp_byok_oauth" + ] + } + }, + "/.well-known/oauth-protected-resource/{mcp_server_name}/mcp": { + "get": { + "description": "OAuth protected resource discovery endpoint using LiteLLM legacy URL pattern.\n\nLegacy pattern: /{server_name}/mcp\nDiscovery path: /.well-known/oauth-protected-resource/{server_name}/mcp\n\nThis endpoint is kept for backward compatibility. New integrations should\nuse the standard MCP pattern (/mcp/{server_name}) instead.", + "operationId": "oauth_protected_resource_mcp__well_known_oauth_protected_resource__mcp_server_name__mcp_get", + "parameters": [ + { + "in": "path", + "name": "mcp_server_name", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mcp Server Name" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Protected Resource Mcp", + "tags": [ + "mcp_byok_oauth" + ] + } + } + } }, "mcp_discoverable": { "components": { "schemas": { + "Body_token_endpoint_token_post": { + "properties": { + "client_id": { + "title": "Client Id", + "type": "string" + }, + "client_secret": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Client Secret" + }, + "code": { + "title": "Code", + "type": "string" + }, + "code_verifier": { + "title": "Code Verifier", + "type": "string" + }, + "grant_type": { + "title": "Grant Type", + "type": "string" + }, + "redirect_uri": { + "title": "Redirect Uri", + "type": "string" + }, + "refresh_token": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Refresh Token" + }, + "scope": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Scope" + } + }, + "required": [ + "grant_type", + "client_id" + ], + "title": "Body_token_endpoint_token_post", + "type": "object" + }, "CallbacksByType": { "properties": { "failure": { @@ -14907,10 +15340,675 @@ ], "title": "CallbacksByType", "type": "object" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "title": "Detail", + "type": "array" + } + }, + "title": "HTTPValidationError", + "type": "object" + }, + "ValidationError": { + "properties": { + "ctx": { + "title": "Context", + "type": "object" + }, + "input": { + "title": "Input" + }, + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "title": "Location", + "type": "array" + }, + "msg": { + "title": "Message", + "type": "string" + }, + "type": { + "title": "Error Type", + "type": "string" + } + }, + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError", + "type": "object" } } }, "paths": { + "/.well-known/jwks.json": { + "get": { + "description": "JSON Web Key Set endpoint.\n\nReturns the RSA public key used by MCPJWTSigner to sign outbound MCP tokens.\nMCP servers and gateways use this endpoint to verify liteLLM-issued JWTs.\n\nReturns an empty key set if MCPJWTSigner is not configured.", + "operationId": "jwks_json__well_known_jwks_json_get", + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + } + }, + "summary": "Jwks Json", + "tags": [ + "mcp_discoverable" + ] + } + }, + "/.well-known/oauth-authorization-server": { + "get": { + "description": "OAuth authorization server discovery endpoint.\n\nSupports both legacy pattern (/{server_name}) and root endpoint.", + "operationId": "oauth_authorization_server_mcp__well_known_oauth_authorization_server_get_2", + "parameters": [ + { + "in": "query", + "name": "mcp_server_name", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mcp Server Name" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Authorization Server Mcp", + "tags": [ + "mcp_discoverable" + ] + } + }, + "/.well-known/oauth-authorization-server/mcp/{mcp_server_name}": { + "get": { + "description": "OAuth authorization server discovery endpoint using standard MCP URL pattern.\n\nStandard pattern: /mcp/{server_name}\nDiscovery path: /.well-known/oauth-authorization-server/mcp/{server_name}", + "operationId": "oauth_authorization_server_mcp_standard__well_known_oauth_authorization_server_mcp__mcp_server_name__get_2", + "parameters": [ + { + "in": "path", + "name": "mcp_server_name", + "required": true, + "schema": { + "title": "Mcp Server Name", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Authorization Server Mcp Standard", + "tags": [ + "mcp_discoverable" + ] + } + }, + "/.well-known/oauth-authorization-server/{mcp_server_name}": { + "get": { + "description": "OAuth authorization server discovery endpoint.\n\nSupports both legacy pattern (/{server_name}) and root endpoint.", + "operationId": "oauth_authorization_server_mcp__well_known_oauth_authorization_server__mcp_server_name__get_2", + "parameters": [ + { + "in": "path", + "name": "mcp_server_name", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mcp Server Name" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Authorization Server Mcp", + "tags": [ + "mcp_discoverable" + ] + } + }, + "/.well-known/oauth-authorization-server/{mcp_server_name}/mcp": { + "get": { + "description": "OAuth authorization server discovery for legacy /{server_name}/mcp pattern.", + "operationId": "oauth_authorization_server_legacy__well_known_oauth_authorization_server__mcp_server_name__mcp_get_2", + "parameters": [ + { + "in": "path", + "name": "mcp_server_name", + "required": true, + "schema": { + "title": "Mcp Server Name", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Authorization Server Legacy", + "tags": [ + "mcp_discoverable" + ] + } + }, + "/.well-known/oauth-protected-resource": { + "get": { + "description": "OAuth protected resource discovery endpoint using LiteLLM legacy URL pattern.\n\nLegacy pattern: /{server_name}/mcp\nDiscovery path: /.well-known/oauth-protected-resource/{server_name}/mcp\n\nThis endpoint is kept for backward compatibility. New integrations should\nuse the standard MCP pattern (/mcp/{server_name}) instead.", + "operationId": "oauth_protected_resource_mcp__well_known_oauth_protected_resource_get_2", + "parameters": [ + { + "in": "query", + "name": "mcp_server_name", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mcp Server Name" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Protected Resource Mcp", + "tags": [ + "mcp_discoverable" + ] + } + }, + "/.well-known/oauth-protected-resource/mcp/{mcp_server_name}": { + "get": { + "description": "OAuth protected resource discovery endpoint using standard MCP URL pattern.\n\nStandard pattern: /mcp/{server_name}\nDiscovery path: /.well-known/oauth-protected-resource/mcp/{server_name}\n\nThis endpoint is compliant with MCP specification and works with standard\nMCP clients like mcp-inspector and VSCode Copilot.", + "operationId": "oauth_protected_resource_mcp_standard__well_known_oauth_protected_resource_mcp__mcp_server_name__get_2", + "parameters": [ + { + "in": "path", + "name": "mcp_server_name", + "required": true, + "schema": { + "title": "Mcp Server Name", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Protected Resource Mcp Standard", + "tags": [ + "mcp_discoverable" + ] + } + }, + "/.well-known/oauth-protected-resource/{mcp_server_name}/mcp": { + "get": { + "description": "OAuth protected resource discovery endpoint using LiteLLM legacy URL pattern.\n\nLegacy pattern: /{server_name}/mcp\nDiscovery path: /.well-known/oauth-protected-resource/{server_name}/mcp\n\nThis endpoint is kept for backward compatibility. New integrations should\nuse the standard MCP pattern (/mcp/{server_name}) instead.", + "operationId": "oauth_protected_resource_mcp__well_known_oauth_protected_resource__mcp_server_name__mcp_get_2", + "parameters": [ + { + "in": "path", + "name": "mcp_server_name", + "required": true, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mcp Server Name" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Oauth Protected Resource Mcp", + "tags": [ + "mcp_discoverable" + ] + } + }, + "/.well-known/openid-configuration": { + "get": { + "operationId": "openid_configuration__well_known_openid_configuration_get", + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + } + }, + "summary": "Openid Configuration", + "tags": [ + "mcp_discoverable" + ] + } + }, + "/authorize": { + "get": { + "operationId": "authorize_authorize_get", + "parameters": [ + { + "in": "query", + "name": "redirect_uri", + "required": true, + "schema": { + "title": "Redirect Uri", + "type": "string" + } + }, + { + "in": "query", + "name": "client_id", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Client Id" + } + }, + { + "in": "query", + "name": "state", + "required": false, + "schema": { + "default": "", + "title": "State", + "type": "string" + } + }, + { + "in": "query", + "name": "mcp_server_name", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mcp Server Name" + } + }, + { + "in": "query", + "name": "code_challenge", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Code Challenge" + } + }, + { + "in": "query", + "name": "code_challenge_method", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Code Challenge Method" + } + }, + { + "in": "query", + "name": "response_type", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Response Type" + } + }, + { + "in": "query", + "name": "scope", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Scope" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Authorize", + "tags": [ + "mcp_discoverable" + ] + } + }, + "/callback": { + "get": { + "description": "OAuth 2.0 authorization response handler for MCP loopback clients.\n\nAccepts either:\n\n- A successful authorization response (``code`` + ``state``), which is\n forwarded back to the validated client ``redirect_uri`` with the\n original (un-wrapped) ``state``.\n- An error response (``error``[+``error_description``/``error_uri``]), per\n RFC 6749 \u00a74.1.2.1. When ``state`` is present and decodes to a trusted\n ``redirect_uri``, the error params are propagated back to the client so\n its OAuth library can surface them. Otherwise we render an HTML error\n page so the user is not left on an opaque 422 / blank screen.", + "operationId": "callback_callback_get", + "parameters": [ + { + "in": "query", + "name": "code", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Code" + } + }, + { + "in": "query", + "name": "state", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "State" + } + }, + { + "in": "query", + "name": "error", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error" + } + }, + { + "in": "query", + "name": "error_description", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error Description" + } + }, + { + "in": "query", + "name": "error_uri", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error Uri" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Callback", + "tags": [ + "mcp_discoverable" + ] + } + }, "/callbacks/configs": { "get": { "description": "Get Available Callback Configurations\n\nReturns the configuration details for all available logging callbacks,\nincluding supported parameters, field types, and descriptions.", @@ -14962,6 +16060,111 @@ "mcp_discoverable" ] } + }, + "/register": { + "post": { + "operationId": "register_client_register_post", + "parameters": [ + { + "in": "query", + "name": "mcp_server_name", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mcp Server Name" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Register Client", + "tags": [ + "mcp_discoverable" + ] + } + }, + "/token": { + "post": { + "description": "Accept the authorization code from client and exchange it for OAuth token.\nSupports PKCE flow by forwarding code_verifier to upstream provider.\n\n1. Call the token endpoint with PKCE parameters\n2. Store the user's token in the db - and generate a LiteLLM virtual key\n3. Return the token\n4. Return a virtual key in this response", + "operationId": "token_endpoint_token_post", + "parameters": [ + { + "in": "query", + "name": "mcp_server_name", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mcp Server Name" + } + } + ], + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Body_token_endpoint_token_post" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "summary": "Token Endpoint", + "tags": [ + "mcp_discoverable" + ] + } } } }, @@ -31562,6 +32765,754 @@ } } }, + "vector_store_management": { + "components": { + "schemas": { + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "title": "Detail", + "type": "array" + } + }, + "title": "HTTPValidationError", + "type": "object" + }, + "LiteLLM_ManagedVectorStore": { + "description": "LiteLLM managed vector store object - this is is the object stored in the database", + "properties": { + "created_at": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "custom_llm_provider": { + "title": "Custom Llm Provider", + "type": "string" + }, + "litellm_credential_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Litellm Credential Name" + }, + "litellm_params": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Litellm Params" + }, + "team_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Team Id" + }, + "updated_at": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "user_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User Id" + }, + "vector_store_description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Vector Store Description" + }, + "vector_store_id": { + "title": "Vector Store Id", + "type": "string" + }, + "vector_store_metadata": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Vector Store Metadata" + }, + "vector_store_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Vector Store Name" + } + }, + "title": "LiteLLM_ManagedVectorStore", + "type": "object" + }, + "LiteLLM_ManagedVectorStoreListResponse": { + "description": "Response format for listing vector stores", + "properties": { + "current_page": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Current Page" + }, + "data": { + "items": { + "$ref": "#/components/schemas/LiteLLM_ManagedVectorStore" + }, + "title": "Data", + "type": "array" + }, + "object": { + "const": "list", + "title": "Object", + "type": "string" + }, + "total_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Total Count" + }, + "total_pages": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Total Pages" + } + }, + "title": "LiteLLM_ManagedVectorStoreListResponse", + "type": "object" + }, + "LiteLLM_ManagedVectorStoresTable": { + "properties": { + "created_at": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Created At" + }, + "custom_llm_provider": { + "title": "Custom Llm Provider", + "type": "string" + }, + "litellm_credential_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Litellm Credential Name" + }, + "litellm_params": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Litellm Params" + }, + "team_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Team Id" + }, + "updated_at": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Updated At" + }, + "user_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User Id" + }, + "vector_store_description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Vector Store Description" + }, + "vector_store_id": { + "title": "Vector Store Id", + "type": "string" + }, + "vector_store_metadata": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Vector Store Metadata" + }, + "vector_store_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Vector Store Name" + } + }, + "required": [ + "vector_store_id", + "custom_llm_provider" + ], + "title": "LiteLLM_ManagedVectorStoresTable", + "type": "object" + }, + "ResponseLiteLLM_ManagedVectorStore": { + "properties": { + "vector_store": { + "$ref": "#/components/schemas/LiteLLM_ManagedVectorStoresTable" + } + }, + "title": "ResponseLiteLLM_ManagedVectorStore", + "type": "object" + }, + "ValidationError": { + "properties": { + "ctx": { + "title": "Context", + "type": "object" + }, + "input": { + "title": "Input" + }, + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "title": "Location", + "type": "array" + }, + "msg": { + "title": "Message", + "type": "string" + }, + "type": { + "title": "Error Type", + "type": "string" + } + }, + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError", + "type": "object" + }, + "VectorStoreDeleteRequest": { + "properties": { + "vector_store_id": { + "title": "Vector Store Id", + "type": "string" + } + }, + "required": [ + "vector_store_id" + ], + "title": "VectorStoreDeleteRequest", + "type": "object" + }, + "VectorStoreInfoRequest": { + "properties": { + "vector_store_id": { + "title": "Vector Store Id", + "type": "string" + } + }, + "required": [ + "vector_store_id" + ], + "title": "VectorStoreInfoRequest", + "type": "object" + }, + "VectorStoreUpdateRequest": { + "properties": { + "custom_llm_provider": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Custom Llm Provider" + }, + "vector_store_description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Vector Store Description" + }, + "vector_store_id": { + "title": "Vector Store Id", + "type": "string" + }, + "vector_store_metadata": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Vector Store Metadata" + }, + "vector_store_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Vector Store Name" + } + }, + "required": [ + "vector_store_id" + ], + "title": "VectorStoreUpdateRequest", + "type": "object" + } + } + }, + "paths": { + "/v1/vector_store/list": { + "get": { + "description": "List all available vector stores with optional filtering and pagination.\nCombines both in-memory vector stores and those stored in the database.\nDatabase is the source of truth - deleted stores are removed from memory, updated stores sync to memory.\n\nParameters:\n- page: int - Page number for pagination (default: 1)\n- page_size: int - Number of items per page (default: 100)", + "operationId": "list_vector_stores_v1_vector_store_list_get", + "parameters": [ + { + "in": "query", + "name": "page", + "required": false, + "schema": { + "default": 1, + "title": "Page", + "type": "integer" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "schema": { + "default": 100, + "title": "Page Size", + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LiteLLM_ManagedVectorStoreListResponse" + } + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ], + "summary": "List Vector Stores", + "tags": [ + "vector_store_management" + ] + } + }, + "/vector_store/delete": { + "post": { + "description": "Delete a vector store from both database and in-memory registry.\n\nParameters:\n- vector_store_id: str - ID of the vector store to delete", + "operationId": "delete_vector_store_vector_store_delete_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VectorStoreDeleteRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ], + "summary": "Delete Vector Store", + "tags": [ + "vector_store_management" + ] + } + }, + "/vector_store/info": { + "post": { + "description": "Return a single vector store's details", + "operationId": "get_vector_store_info_vector_store_info_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VectorStoreInfoRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResponseLiteLLM_ManagedVectorStore" + } + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ], + "summary": "Get Vector Store Info", + "tags": [ + "vector_store_management" + ] + } + }, + "/vector_store/list": { + "get": { + "description": "List all available vector stores with optional filtering and pagination.\nCombines both in-memory vector stores and those stored in the database.\nDatabase is the source of truth - deleted stores are removed from memory, updated stores sync to memory.\n\nParameters:\n- page: int - Page number for pagination (default: 1)\n- page_size: int - Number of items per page (default: 100)", + "operationId": "list_vector_stores_vector_store_list_get", + "parameters": [ + { + "in": "query", + "name": "page", + "required": false, + "schema": { + "default": 1, + "title": "Page", + "type": "integer" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "schema": { + "default": 100, + "title": "Page Size", + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LiteLLM_ManagedVectorStoreListResponse" + } + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ], + "summary": "List Vector Stores", + "tags": [ + "vector_store_management" + ] + } + }, + "/vector_store/new": { + "post": { + "description": "Create a new vector store.\n\nParameters:\n- vector_store_id: str - Unique identifier for the vector store\n- custom_llm_provider: str - Provider of the vector store\n- vector_store_name: Optional[str] - Name of the vector store\n- vector_store_description: Optional[str] - Description of the vector store\n- vector_store_metadata: Optional[Dict] - Additional metadata for the vector store", + "operationId": "new_vector_store_vector_store_new_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LiteLLM_ManagedVectorStore" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ], + "summary": "New Vector Store", + "tags": [ + "vector_store_management" + ] + } + }, + "/vector_store/update": { + "post": { + "description": "Update vector store details in both database and in-memory registry.\nThe updated data is immediately synchronized to the in-memory registry.", + "operationId": "update_vector_store_vector_store_update_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VectorStoreUpdateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful Response" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + "description": "Validation Error" + } + }, + "security": [ + { + "APIKeyHeader": [] + } + ], + "summary": "Update Vector Store", + "tags": [ + "vector_store_management" + ] + } + } + } + }, "vector_stores": { "components": { "schemas": { diff --git a/litellm/proxy/_lazy_openapi_snapshot.py b/litellm/proxy/_lazy_openapi_snapshot.py index a687ff2abaf..de782d1d288 100644 --- a/litellm/proxy/_lazy_openapi_snapshot.py +++ b/litellm/proxy/_lazy_openapi_snapshot.py @@ -85,11 +85,19 @@ def _normalize_operation_ids(paths: Dict[str, Dict]) -> None: break -def _register_lazy_feature(app, feat) -> tuple[str, str] | None: - """Import and register one lazy feature. Returns (name, error) if it could not be loaded.""" +def _register_lazy_feature(app, feat, preloaded: frozenset) -> tuple[str, str] | None: + """Import and register one lazy feature. Returns (name, error) if it could not be loaded. + + `preloaded` is the set of module paths imported before registration began, not live + sys.modules. Importing one feature can drag a sibling in as a side effect (loading + vector_stores imports vector_store_management), and an imported-but-unregistered + module contributes no routes, so its fragment would silently vanish from the + snapshot. The runtime loader has the same invariant and tracks it explicitly in + app.state.lazy_loaded. + """ import importlib - if feat.module_path in sys.modules: + if feat.module_path in preloaded: return None try: feat.register_fn(app, importlib.import_module(feat.module_path)) @@ -110,8 +118,11 @@ def generate_snapshot(*, strict: bool = False) -> dict[str, dict]: from litellm.proxy._lazy_features import LAZY_FEATURES from litellm.proxy.proxy_server import app, ensure_unique_openapi_operation_ids + preloaded = frozenset(sys.modules) skipped = tuple( - result for result in (_register_lazy_feature(app, feat) for feat in LAZY_FEATURES) if result is not None + result + for result in (_register_lazy_feature(app, feat, preloaded) for feat in LAZY_FEATURES) + if result is not None ) for name, error in skipped: sys.stderr.write(f"warning: skip {name}: {error}\n") diff --git a/tests/test_litellm/proxy/test_lazy_openapi_snapshot.py b/tests/test_litellm/proxy/test_lazy_openapi_snapshot.py index e402b3bc163..89d7da7bafe 100644 --- a/tests/test_litellm/proxy/test_lazy_openapi_snapshot.py +++ b/tests/test_litellm/proxy/test_lazy_openapi_snapshot.py @@ -127,19 +127,34 @@ class TestDriftedFeatures: class TestRegisterLazyFeature: - def test_skips_a_module_that_is_already_imported(self): + def test_skips_a_feature_that_was_already_loaded_before_registration_began(self): feature = SimpleNamespace(name="ok", module_path="json", register_fn=lambda app, module: None) - assert _register_lazy_feature(SimpleNamespace(), feature) is None + assert _register_lazy_feature(SimpleNamespace(), feature, frozenset({"json"})) is None - def test_registers_a_module_that_imports_cleanly(self, monkeypatch): + def test_registers_a_module_that_imports_cleanly(self): registered = [] feature = SimpleNamespace( name="ok", module_path="json", register_fn=lambda app, module: registered.append(module.__name__) ) - monkeypatch.delitem(sys.modules, "json", raising=False) - assert _register_lazy_feature(SimpleNamespace(), feature) is None + assert _register_lazy_feature(SimpleNamespace(), feature, frozenset()) is None + assert registered == ["json"] + + def test_registers_a_module_a_sibling_feature_dragged_into_sys_modules(self): + """Regression: importing vector_stores imports vector_store_management as a side effect. + + Gating on live sys.modules treated that as "already registered", so its router was + never included, it contributed no routes, and generate_snapshot dropped its whole + fragment; POST /vector_store/new and friends disappeared from the OpenAPI spec. + """ + registered = [] + feature = SimpleNamespace( + name="sibling", module_path="json", register_fn=lambda app, module: registered.append(module.__name__) + ) + + assert "json" in sys.modules # imported, but nobody registered its routes + assert _register_lazy_feature(SimpleNamespace(), feature, preloaded=frozenset()) is None assert registered == ["json"] def test_reports_the_feature_and_error_when_the_module_is_missing(self): @@ -147,21 +162,23 @@ class TestRegisterLazyFeature: name="broken", module_path="litellm_no_such_module", register_fn=lambda app, module: None ) - result = _register_lazy_feature(SimpleNamespace(), feature) + result = _register_lazy_feature(SimpleNamespace(), feature, frozenset()) assert result is not None name, error = result assert name == "broken" assert "ModuleNotFoundError" in error - def test_reports_the_error_when_registration_raises(self, monkeypatch): + def test_reports_the_error_when_registration_raises(self): def _raise(app, module): raise ValueError("router blew up") feature = SimpleNamespace(name="broken", module_path="json", register_fn=_raise) - monkeypatch.delitem(sys.modules, "json", raising=False) - assert _register_lazy_feature(SimpleNamespace(), feature) == ("broken", "ValueError: router blew up") + assert _register_lazy_feature(SimpleNamespace(), feature, frozenset()) == ( + "broken", + "ValueError: router blew up", + ) class TestCheckSnapshot: diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index 094df5d371e..3af58bf012e 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -21,6 +21,31 @@ export interface paths { patch?: never; trace?: never; }; + "/.well-known/jwks.json": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Jwks Json + * @description JSON Web Key Set endpoint. + * + * Returns the RSA public key used by MCPJWTSigner to sign outbound MCP tokens. + * MCP servers and gateways use this endpoint to verify liteLLM-issued JWTs. + * + * Returns an empty key set if MCPJWTSigner is not configured. + */ + get: operations["jwks_json__well_known_jwks_json_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/.well-known/litellm-ui-config": { parameters: { query?: never; @@ -38,6 +63,188 @@ export interface paths { patch?: never; trace?: never; }; + "/.well-known/oauth-authorization-server": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Oauth Authorization Server Mcp + * @description OAuth authorization server discovery endpoint. + * + * Supports both legacy pattern (/{server_name}) and root endpoint. + */ + get: operations["oauth_authorization_server_mcp__well_known_oauth_authorization_server_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/.well-known/oauth-authorization-server/mcp/{mcp_server_name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Oauth Authorization Server Mcp Standard + * @description OAuth authorization server discovery endpoint using standard MCP URL pattern. + * + * Standard pattern: /mcp/{server_name} + * Discovery path: /.well-known/oauth-authorization-server/mcp/{server_name} + */ + get: operations["oauth_authorization_server_mcp_standard__well_known_oauth_authorization_server_mcp__mcp_server_name__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/.well-known/oauth-authorization-server/{mcp_server_name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Oauth Authorization Server Mcp + * @description OAuth authorization server discovery endpoint. + * + * Supports both legacy pattern (/{server_name}) and root endpoint. + */ + get: operations["oauth_authorization_server_mcp__well_known_oauth_authorization_server__mcp_server_name__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/.well-known/oauth-authorization-server/{mcp_server_name}/mcp": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Oauth Authorization Server Legacy + * @description OAuth authorization server discovery for legacy /{server_name}/mcp pattern. + */ + get: operations["oauth_authorization_server_legacy__well_known_oauth_authorization_server__mcp_server_name__mcp_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/.well-known/oauth-protected-resource": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Oauth Protected Resource Mcp + * @description OAuth protected resource discovery endpoint using LiteLLM legacy URL pattern. + * + * Legacy pattern: /{server_name}/mcp + * Discovery path: /.well-known/oauth-protected-resource/{server_name}/mcp + * + * This endpoint is kept for backward compatibility. New integrations should + * use the standard MCP pattern (/mcp/{server_name}) instead. + */ + get: operations["oauth_protected_resource_mcp__well_known_oauth_protected_resource_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/.well-known/oauth-protected-resource/mcp/{mcp_server_name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Oauth Protected Resource Mcp Standard + * @description OAuth protected resource discovery endpoint using standard MCP URL pattern. + * + * Standard pattern: /mcp/{server_name} + * Discovery path: /.well-known/oauth-protected-resource/mcp/{server_name} + * + * This endpoint is compliant with MCP specification and works with standard + * MCP clients like mcp-inspector and VSCode Copilot. + */ + get: operations["oauth_protected_resource_mcp_standard__well_known_oauth_protected_resource_mcp__mcp_server_name__get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/.well-known/oauth-protected-resource/{mcp_server_name}/mcp": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Oauth Protected Resource Mcp + * @description OAuth protected resource discovery endpoint using LiteLLM legacy URL pattern. + * + * Legacy pattern: /{server_name}/mcp + * Discovery path: /.well-known/oauth-protected-resource/{server_name}/mcp + * + * This endpoint is kept for backward compatibility. New integrations should + * use the standard MCP pattern (/mcp/{server_name}) instead. + */ + get: operations["oauth_protected_resource_mcp__well_known_oauth_protected_resource__mcp_server_name__mcp_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/.well-known/openid-configuration": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Openid Configuration */ + get: operations["openid_configuration__well_known_openid_configuration_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/a2a/{agent_id}": { parameters: { query?: never; @@ -760,6 +967,23 @@ export interface paths { patch?: never; trace?: never; }; + "/authorize": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Authorize */ + get: operations["authorize_authorize_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/azure/{endpoint}": { parameters: { query?: never; @@ -1319,6 +1543,37 @@ export interface paths { patch?: never; trace?: never; }; + "/callback": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Callback + * @description OAuth 2.0 authorization response handler for MCP loopback clients. + * + * Accepts either: + * + * - A successful authorization response (``code`` + ``state``), which is + * forwarded back to the validated client ``redirect_uri`` with the + * original (un-wrapped) ``state``. + * - An error response (``error``[+``error_description``/``error_uri``]), per + * RFC 6749 ยง4.1.2.1. When ``state`` is present and decodes to a trusted + * ``redirect_uri``, the error params are propagated back to the client so + * its OAuth library can surface them. Otherwise we render an HTML error + * page so the user is not left on an opaque 422 / blank screen. + */ + get: operations["callback_callback_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/callbacks/configs": { parameters: { query?: never; @@ -11121,6 +11376,23 @@ export interface paths { patch?: never; trace?: never; }; + "/register": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Register Client */ + post: operations["register_client_register_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/reload/anthropic_beta_headers": { parameters: { query?: never; @@ -14180,6 +14452,32 @@ export interface paths { patch?: never; trace?: never; }; + "/token": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Token Endpoint + * @description Accept the authorization code from client and exchange it for OAuth token. + * Supports PKCE flow by forwarding code_verifier to upstream provider. + * + * 1. Call the token endpoint with PKCE parameters + * 2. Store the user's token in the db - and generate a LiteLLM virtual key + * 3. Return the token + * 4. Return a virtual key in this response + */ + post: operations["token_endpoint_token_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/toolset/{toolset_name}/mcp": { parameters: { query?: never; @@ -18108,6 +18406,32 @@ export interface paths { patch?: never; trace?: never; }; + "/v1/vector_store/list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List Vector Stores + * @description List all available vector stores with optional filtering and pagination. + * Combines both in-memory vector stores and those stored in the database. + * Database is the source of truth - deleted stores are removed from memory, updated stores sync to memory. + * + * Parameters: + * - page: int - Page number for pagination (default: 1) + * - page_size: int - Number of items per page (default: 100) + */ + get: operations["list_vector_stores_v1_vector_store_list_get"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/v1/vector_stores": { parameters: { query?: never; @@ -19305,32 +19629,67 @@ export interface paths { patch?: never; trace?: never; }; - "/vector_store/": { + "/vector_store/delete": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** vector_store_management */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; + get?: never; + put?: never; + /** + * Delete Vector Store + * @description Delete a vector store from both database and in-memory registry. + * + * Parameters: + * - vector_store_id: str - ID of the vector store to delete + */ + post: operations["delete_vector_store_vector_store_delete_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/vector_store/info": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; + get?: never; + put?: never; + /** + * Get Vector Store Info + * @description Return a single vector store's details + */ + post: operations["get_vector_store_info_vector_store_info_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/vector_store/list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List Vector Stores + * @description List all available vector stores with optional filtering and pagination. + * Combines both in-memory vector stores and those stored in the database. + * Database is the source of truth - deleted stores are removed from memory, updated stores sync to memory. + * + * Parameters: + * - page: int - Page number for pagination (default: 1) + * - page_size: int - Number of items per page (default: 100) + */ + get: operations["list_vector_stores_vector_store_list_get"]; put?: never; post?: never; delete?: never; @@ -19339,6 +19698,54 @@ export interface paths { patch?: never; trace?: never; }; + "/vector_store/new": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * New Vector Store + * @description Create a new vector store. + * + * Parameters: + * - vector_store_id: str - Unique identifier for the vector store + * - custom_llm_provider: str - Provider of the vector store + * - vector_store_name: Optional[str] - Name of the vector store + * - vector_store_description: Optional[str] - Description of the vector store + * - vector_store_metadata: Optional[Dict] - Additional metadata for the vector store + */ + post: operations["new_vector_store_vector_store_new_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/vector_store/update": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Update Vector Store + * @description Update vector store details in both database and in-memory registry. + * The updated data is immediately synchronized to the in-memory registry. + */ + post: operations["update_vector_store_vector_store_update_post"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/vector_stores": { parameters: { query?: never; @@ -21228,6 +21635,25 @@ export interface components { [key: string]: unknown; }; }; + /** Body_token_endpoint_token_post */ + Body_token_endpoint_token_post: { + /** Client Id */ + client_id: string; + /** Client Secret */ + client_secret?: string | null; + /** Code */ + code?: string; + /** Code Verifier */ + code_verifier?: string; + /** Grant Type */ + grant_type: string; + /** Redirect Uri */ + redirect_uri?: string; + /** Refresh Token */ + refresh_token?: string | null; + /** Scope */ + scope?: string | null; + }; /** Body_upload_logo_upload_logo_post */ Body_upload_logo_upload_logo_post: { /** File */ @@ -25302,6 +25728,86 @@ export interface components { /** Url */ url?: string | null; }; + /** + * LiteLLM_ManagedVectorStore + * @description LiteLLM managed vector store object - this is is the object stored in the database + */ + LiteLLM_ManagedVectorStore: { + /** Created At */ + created_at?: string | null; + /** Custom Llm Provider */ + custom_llm_provider?: string; + /** Litellm Credential Name */ + litellm_credential_name?: string | null; + /** Litellm Params */ + litellm_params?: { + [key: string]: unknown; + } | null; + /** Team Id */ + team_id?: string | null; + /** Updated At */ + updated_at?: string | null; + /** User Id */ + user_id?: string | null; + /** Vector Store Description */ + vector_store_description?: string | null; + /** Vector Store Id */ + vector_store_id?: string; + /** Vector Store Metadata */ + vector_store_metadata?: { + [key: string]: unknown; + } | string | null; + /** Vector Store Name */ + vector_store_name?: string | null; + }; + /** + * LiteLLM_ManagedVectorStoreListResponse + * @description Response format for listing vector stores + */ + LiteLLM_ManagedVectorStoreListResponse: { + /** Current Page */ + current_page?: number | null; + /** Data */ + data?: components["schemas"]["LiteLLM_ManagedVectorStore"][]; + /** + * Object + * @constant + */ + object?: "list"; + /** Total Count */ + total_count?: number | null; + /** Total Pages */ + total_pages?: number | null; + }; + /** LiteLLM_ManagedVectorStoresTable */ + LiteLLM_ManagedVectorStoresTable: { + /** Created At */ + created_at?: string | null; + /** Custom Llm Provider */ + custom_llm_provider: string; + /** Litellm Credential Name */ + litellm_credential_name?: string | null; + /** Litellm Params */ + litellm_params?: { + [key: string]: unknown; + } | null; + /** Team Id */ + team_id?: string | null; + /** Updated At */ + updated_at?: string | null; + /** User Id */ + user_id?: string | null; + /** Vector Store Description */ + vector_store_description?: string | null; + /** Vector Store Id */ + vector_store_id: string; + /** Vector Store Metadata */ + vector_store_metadata?: { + [key: string]: unknown; + } | null; + /** Vector Store Name */ + vector_store_name?: string | null; + }; /** LiteLLM_MemoryRow */ LiteLLM_MemoryRow: { /** Created At */ @@ -30338,6 +30844,10 @@ export interface components { /** Reset To */ reset_to: number; }; + /** ResponseLiteLLM_ManagedVectorStore */ + ResponseLiteLLM_ManagedVectorStore: { + vector_store?: components["schemas"]["LiteLLM_ManagedVectorStoresTable"]; + }; /** * ResultCounts * @description Result counts for a run @@ -33444,6 +33954,31 @@ export interface components { */ status?: string | null; }; + /** VectorStoreDeleteRequest */ + VectorStoreDeleteRequest: { + /** Vector Store Id */ + vector_store_id: string; + }; + /** VectorStoreInfoRequest */ + VectorStoreInfoRequest: { + /** Vector Store Id */ + vector_store_id: string; + }; + /** VectorStoreUpdateRequest */ + VectorStoreUpdateRequest: { + /** Custom Llm Provider */ + custom_llm_provider?: string | null; + /** Vector Store Description */ + vector_store_description?: string | null; + /** Vector Store Id */ + vector_store_id: string; + /** Vector Store Metadata */ + vector_store_metadata?: { + [key: string]: unknown; + } | null; + /** Vector Store Name */ + vector_store_name?: string | null; + }; /** WorkerRegistryEntry */ WorkerRegistryEntry: { /** Name */ @@ -33879,6 +34414,26 @@ export interface operations { }; }; }; + jwks_json__well_known_jwks_json_get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + }; + }; get_ui_config__well_known_litellm_ui_config_get: { parameters: { query?: never; @@ -33899,6 +34454,243 @@ export interface operations { }; }; }; + oauth_authorization_server_mcp__well_known_oauth_authorization_server_get: { + parameters: { + query?: { + mcp_server_name?: string | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + oauth_authorization_server_mcp_standard__well_known_oauth_authorization_server_mcp__mcp_server_name__get: { + parameters: { + query?: never; + header?: never; + path: { + mcp_server_name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + oauth_authorization_server_mcp__well_known_oauth_authorization_server__mcp_server_name__get: { + parameters: { + query?: never; + header?: never; + path: { + mcp_server_name: string | null; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + oauth_authorization_server_legacy__well_known_oauth_authorization_server__mcp_server_name__mcp_get: { + parameters: { + query?: never; + header?: never; + path: { + mcp_server_name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + oauth_protected_resource_mcp__well_known_oauth_protected_resource_get: { + parameters: { + query?: { + mcp_server_name?: string | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + oauth_protected_resource_mcp_standard__well_known_oauth_protected_resource_mcp__mcp_server_name__get: { + parameters: { + query?: never; + header?: never; + path: { + mcp_server_name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + oauth_protected_resource_mcp__well_known_oauth_protected_resource__mcp_server_name__mcp_get: { + parameters: { + query?: never; + header?: never; + path: { + mcp_server_name: string | null; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + openid_configuration__well_known_openid_configuration_get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + }; + }; invoke_agent_a2a_a2a__agent_id__post: { parameters: { query?: never; @@ -34945,6 +35737,44 @@ export interface operations { }; }; }; + authorize_authorize_get: { + parameters: { + query: { + redirect_uri: string; + client_id?: string | null; + state?: string; + mcp_server_name?: string | null; + code_challenge?: string | null; + code_challenge_method?: string | null; + response_type?: string | null; + scope?: string | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; azure_proxy_route_azure__endpoint__get: { parameters: { query?: never; @@ -35894,6 +36724,41 @@ export interface operations { }; }; }; + callback_callback_get: { + parameters: { + query?: { + code?: string | null; + state?: string | null; + error?: string | null; + error_description?: string | null; + error_uri?: string | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; get_callback_configs_callbacks_configs_get: { parameters: { query?: never; @@ -47679,6 +48544,37 @@ export interface operations { }; }; }; + register_client_register_post: { + parameters: { + query?: { + mcp_server_name?: string | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; reload_anthropic_beta_headers_reload_anthropic_beta_headers_post: { parameters: { query?: never; @@ -51082,6 +51978,41 @@ export interface operations { }; }; }; + token_endpoint_token_post: { + parameters: { + query?: { + mcp_server_name?: string | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": components["schemas"]["Body_token_endpoint_token_post"]; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; toolset_mcp_route_toolset__toolset_name__mcp_get: { parameters: { query?: never; @@ -56585,6 +57516,38 @@ export interface operations { }; }; }; + list_vector_stores_v1_vector_store_list_get: { + parameters: { + query?: { + page?: number; + page_size?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["LiteLLM_ManagedVectorStoreListResponse"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; vector_store_list_v1_vector_stores_get: { parameters: { query?: { @@ -58246,6 +59209,170 @@ export interface operations { }; }; }; + delete_vector_store_vector_store_delete_post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["VectorStoreDeleteRequest"]; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + get_vector_store_info_vector_store_info_post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["VectorStoreInfoRequest"]; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ResponseLiteLLM_ManagedVectorStore"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + list_vector_stores_vector_store_list_get: { + parameters: { + query?: { + page?: number; + page_size?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["LiteLLM_ManagedVectorStoreListResponse"]; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + new_vector_store_vector_store_new_post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["LiteLLM_ManagedVectorStore"]; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; + update_vector_store_vector_store_update_post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["VectorStoreUpdateRequest"]; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; + }; + }; vector_store_list_vector_stores_get: { parameters: { query?: {