From 1d52d364296ee640b3df1be85eb156a02aa5d070 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Tue, 2 Jun 2026 13:44:08 +0000 Subject: [PATCH] fix(proxy): accept mcp_rpm_limit in generate_key_helper_fn NewUserRequest and GenerateKeyRequest inherit mcp_rpm_limit from GenerateRequestBase, so /user/new and /key/generate forwarded the field to generate_key_helper_fn, which did not accept it and returned a 500 ("unexpected keyword argument 'mcp_rpm_limit'"). Accept the param and store it in metadata, matching model_rpm_limit/model_tpm_limit, so the limit is persisted where get_key_mcp_rpm_limit reads it. --- .../proxy/management_endpoints/key_management_endpoints.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/litellm/proxy/management_endpoints/key_management_endpoints.py b/litellm/proxy/management_endpoints/key_management_endpoints.py index 93b552e6f4c..80ded0bdd16 100644 --- a/litellm/proxy/management_endpoints/key_management_endpoints.py +++ b/litellm/proxy/management_endpoints/key_management_endpoints.py @@ -3404,6 +3404,7 @@ async def generate_key_helper_fn( # noqa: PLR0915 model_max_budget: Optional[dict] = {}, model_rpm_limit: Optional[dict] = None, model_tpm_limit: Optional[dict] = None, + mcp_rpm_limit: Optional[dict] = None, guardrails: Optional[list] = None, policies: Optional[list] = None, prompts: Optional[list] = None, @@ -3482,6 +3483,9 @@ async def generate_key_helper_fn( # noqa: PLR0915 if model_tpm_limit is not None: metadata = metadata or {} metadata["model_tpm_limit"] = model_tpm_limit + if mcp_rpm_limit is not None: + metadata = metadata or {} + metadata["mcp_rpm_limit"] = mcp_rpm_limit if guardrails is not None: metadata = metadata or {} metadata["guardrails"] = guardrails