litellm-mcp
MCP server for the LiteLLM proxy, enabling agents to administer resources like keys, teams, users, models, and proxy settings through risk-graded meta-tools.
README
litellm-mcp
MCP server for the LiteLLM proxy. It is a development-and-operations surface for LiteLLM resources - creating, configuring, testing, invoking, observing, and cleaning up virtual keys, teams, users, orgs, customers, budgets, models, credentials, tags, guardrails, spend/usage, cache, health, proxy settings, the MCP gateway registry (backend servers, toolsets, access groups), prompts, and the platform areas (policies, evals, A2A agent registry, workflow runs, CloudZero export) - as risk-graded meta-tools an agent can drive.
Bulk inference and the OpenAI-compatible surface (chat/completions,
embeddings, files, batches, assistants, vector stores, provider
pass-throughs) stay out of scope: agents already have model access through
their LLM client. What comes in is one-shot, dev-loop invocation that
closes a loop through the MCP alone - test_prompt renders and runs a
dotprompt, invoke_agent sends an A2A message/send. Both are graded as
litellm_execute (they spend inference) and return bounded output, never a
raw stream.
Built on the v2.5 MCP server family: five meta-tools dispatched by
operation + params, strict Pydantic validation, per-op help and JSON
schema introspection, list slimming with truncation metadata, and
write-response verification.
Operations
211 operations total: 210 grouped across the five meta-tools, plus one
root litellm_version op. The count is machine-checked - it equals
len(OPS) in codegen/inventory.py (210) plus the hand-written root op,
and equals the summed grep -c "^@_op" src/litellm_mcp/tools/*.py (211).
| Meta-tool | Risk | Ops |
|---|---|---|
litellm_read |
safe | 94 |
litellm_write |
medium | 55 |
litellm_execute |
medium | 23 |
litellm_delete |
high | 26 |
litellm_admin |
high | 12 |
litellm_read(safe): lists, infos, spend/usage, health, settings reads, token/cost utils, MCP gateway registry reads, prompt registry reads (list/get/versions), agent daily activity.litellm_write(medium): create/update for keys, teams, users, orgs, customers, budgets, models, credentials, tags, guardrails, fallbacks, MCP servers/toolsets, access groups, policies, evals, agents, workflows, and prompts (create/update/patch).litellm_execute(medium): block/unblock toggles, key regenerate/reset, connection tests, targeted cache delete, applying a guardrail to text, and one-shot dev-loop invocation (test a prompt, invoke an agent) with bounded output.litellm_delete(high): irreversible deletes and cache flushall.litellm_admin(high): proxy-global settings, allowed IPs, global spend reset, bulk user update.
Root: litellm_version returns {"mcp": <package version>, "service": GET /health/readiness}. On LiteLLM v1.93.0 the readiness payload is
{status, db} (that image carries no LiteLLM version field).
Install
uvx --refresh \
--extra-index-url https://nikitatsym.github.io/litellm-mcp/simple \
litellm-mcp
Add the following to your MCP client configuration (Claude Desktop, Cursor, Claude Code, or any MCP-compatible client):
{
"mcpServers": {
"litellm": {
"command": "uvx",
"args": [
"--refresh",
"--extra-index-url",
"https://nikitatsym.github.io/litellm-mcp/simple",
"litellm-mcp"
],
"env": {
"LITELLM_URL": "https://litellm.example.com",
"LITELLM_API_KEY": "sk-your-admin-key"
}
}
}
}
Or use the interactive Setup Page to generate the config.
Configuration
| Variable | Required | Description |
|---|---|---|
LITELLM_URL |
Yes | Base URL of the LiteLLM proxy (no trailing slash) |
LITELLM_API_KEY |
Yes | Admin bearer key (master or admin virtual key) |
Both are read lazily: the server imports and lists ops without them, and
fails on the first call that reaches the proxy. LITELLM_API_KEY is sent
as Authorization: Bearer.
Minting an admin key
This MCP drives the proxy administration surface, so it needs an
admin-scoped key, not a plain inference key. The master key works, but a
dedicated virtual key with the proxy_admin role is easier to rotate and
scope.
- Admin UI: Virtual Keys -> Create New Key, assign the
proxy_adminrole (or a role carrying admin permissions), and copy the key (shown once). - API, calling with the master key:
curl -X POST "$LITELLM_URL/key/generate" \
-H "Authorization: Bearer $LITELLM_MASTER_KEY" \
-H "Content-Type: application/json" \
-d '{"user_role": "proxy_admin", "key_alias": "mcp-admin"}'
Using the tools
Each meta-tool takes operation (a PascalCase op name, or help /
schema) plus params (a dict):
litellm_read(operation="help")
litellm_read(operation="help", params={"search": "spend"})
litellm_read(operation="schema", params={"op": "ListKeys"})
litellm_read(operation="ListKeys", params={"team_id": "..."})
litellm_write(operation="GenerateKey", params={"team_id": "..."})
litellm_execute(operation="BlockKey", params={"key": "sk-..."})
litellm_delete(operation="DeleteKeys", params={"keys": ["sk-..."]})
operation="help" lists the group's ops; add params={"search": "foo"}
to filter by substring across names and docstrings (it also hints at
matches in other groups). operation="schema" returns one op's full JSON
Schema. Params are validated strictly via Pydantic: unknown keys, wrong
types, and missing required fields all surface as a ValueError with
field-level detail pointing at operation='schema'.
v2.5 dispatch model
operation='help'renders every op's signature with typed params and a description bullet per field; thesearchparam filters the listing.operation='schema'returns the full JSON Schema for one op (additionalProperties: false, descriptions embedded).- Omitted-vs-null. Optional body params default to an internal
_UNSETsentinel. Omitting a param drops it from the request; passing an explicitnullsurvives to the wire as JSONnull- so a caller can clear a nullable field distinctly from leaving it untouched. - List slimming. List ops return a slimmed row projection plus
truncation metadata (
{"total", "returned", "truncated"}), and secret-bearing fields (credentials, static headers, env vars) are dropped from list output. This keeps large responses within an agent's context budget. - Write verification. Create/update ops presence-check that the fields they sent are echoed in the stored row the proxy returns; a silently dropped field raises with the full dotted path, so a partial write cannot pass unnoticed.
Upstream feature gating
Some endpoints depend on the LiteLLM edition or on extra provider config.
Observed on the OSS ghcr.io/berriai/litellm:v1.93.0 image; the MCP does
not special-case them - the upstream error propagates verbatim as an
APIError with the body intact.
Enterprise-licensed (fail on the OSS image without LITELLM_LICENSE):
GlobalSpendReport(GET /global/spend/report) - 400, "You must be a LiteLLM Enterprise user".RegenerateKey(POST /key/regenerate) - 500, "Regenerating Virtual Keys is an Enterprise feature".
Present but needs external provider credentials:
evals(CreateEval/CreateEvalRunand the run/get/delete family) - the create body is accepted, then the run fails 500 "OPENAI_API_KEY is required for Evals API". Unusable without a real provider key on the proxy.
Working end to end on OSS (exercised by the integration smokes): keys, teams, users, budgets, models, tags, spend logs, the MCP gateway (servers, health, access groups), policies (create/attach/resolve/delete), A2A agents, workflow runs, and CloudZero settings.
Development
Requires uv. Enable the pre-commit hook once per clone (it runs the full gate on every commit):
git config core.hooksPath .githooks
dev.py is the task entry point:
uv run python dev.py check # lint + mypy + codegen sync + tackbox + tests
uv run python dev.py lint # ruff + mypy + codegen sync gate + tackbox
uv run python dev.py test # unit tests only (no docker)
uv run python dev.py e2e # integration smokes (needs the stack up)
Integration tests run against an ephemeral LiteLLM + Postgres stack. The npm scripts wrap the compose lifecycle:
npm run litellm:up # compose up -d --wait (first run pulls + migrates)
uv run python dev.py e2e
npm run litellm:down # tear down + remove volumes
npm run litellm:logs # follow container logs
Codegen
The tool surface is generated, not hand-transcribed.
codegen/inventory.py fixes the operation list; the judgment layer (param
descriptions, docstring bodies, slim specs, verify skip sets, override
list) lives as plain data in codegen/annotations.py, slims.py,
verify.py, overrides.py, and bodyless_ok.py. codegen/generate.py is
a pure function of the committed OpenAPI snapshot
(codegen/openapi-v1.93.0.json) plus that data, emitting the
src/litellm_mcp/tools/_generated_*.py modules. Generated files are never
hand-edited; ops that need bespoke logic are listed in
codegen/overrides.py and implemented by hand in tools/overrides.py.
The sync gate (uv run python -m codegen.check, part of dev.py lint)
regenerates into a temp dir and fails unless the result is byte-identical
to the committed tree - so a hand-edit of a generated file, a stale data
key, or a drifted snapshot all fail the build. To change the surface: edit
the data (or the snapshot), regenerate, and commit the diff.
License
MIT - see LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。