From 5e214e4d7e73b4d728757c00ec96a661c33f72f5 Mon Sep 17 00:00:00 2001 From: Nathan Schneider Date: Sun, 18 Oct 2026 20:52:48 -0600 Subject: [PATCH] Add inference-image MCP server (accessible image generation) + proper favicon sizes - mcp/image_server.py: generate_image tool via the co-op gateway; per-member key injected through customUserVars (IC_API_KEY) -> env; verified standalone (handshake, tools/list, real 1024x1024 + 1536x1024 images, error paths) - librechat.yaml: register inference-image with startup:false (per-user credentials), 120s timeout - assets/: real favicon sizes (16/32/192), opaque apple-touch 180, padded maskable 512 --- README.md | 30 ++-- assets/apple-touch-icon-180x180.png | Bin 6756 -> 12749 bytes assets/favicon-16x16.png | Bin 6756 -> 719 bytes assets/favicon-32x32.png | Bin 6756 -> 1742 bytes assets/icon-192x192.png | Bin 6756 -> 15663 bytes assets/maskable-icon.png | Bin 6756 -> 30796 bytes librechat.yaml | 23 ++- mcp/image_server.py | 210 ++++++++++++++++++++++++++++ 8 files changed, 249 insertions(+), 14 deletions(-) create mode 100644 mcp/image_server.py diff --git a/README.md b/README.md index cff29a5..6fe01c1 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ from this directory. | App config | `/app/data/librechat.yaml` (volume) | yes | `librechat.yaml` | | Env vars (env-file wins!) | `/app/data/env` (volume, sourced LAST by start.sh) | yes | changed lines documented below | | Env vars (Cloudron-managed) | `cloudron env` (process env) | yes | documented below | -| MCP docs server | `/app/data/mcp/server.py` (volume) | yes | `mcp/server.py` | +| MCP servers | `/app/data/mcp/server.py` + `/app/data/mcp/image_server.py` (volume) | yes | `mcp/` | | Brand assets (logo, favicons) | baked into image overlay | no — rebuilt per image | `assets/` | | CloudronManifest.json | repo only (used by `cloudron update`) | n/a | byte-identical copy of the OFFICIAL appstore manifest | @@ -106,13 +106,21 @@ Set via `cloudron env set` (process env): keys, 8 chat modelSpecs (emoji convention shared with models.md). `regolo/qwen-image` is deliberately NOT in the chat picker (image models are not chat models; chat-calling it was the source of the old 500s). -- **Image generation**: LibreChat exposes image gen through an **Agent with - the "OpenAI Image Tools" tool**, not a chat-picker button. Members create - an agent, add the tool, and paste their co-op key on first use. -- **MCP**: `inference-docs` (stdio, `/app/data/mcp/server.py`, tool - `search_docs`) is admin-configured; members may add their own via the MCP - Settings panel (the "bring your own tools" pattern). Permissions seeded via - `interface.mcpServers` (use/create true, share false). +- **Image generation — two paths**: + 1. **MCP tool (easiest)**: `inference-image` server (tool `generate_image`) + — members select it in the composer's **+** palette and just ask. No + agent setup. First use: save your co-op key in the MCP panel + (customUserVars `IC_API_KEY`, injected per-user into the server process + env; `startup: false` because the key only exists per-user after they + configure it). Bills to the member's own key (~1–2¢/image at 1024²). + 2. **Agent tool**: LibreChat's built-in "OpenAI Image Tools" (env + `IMAGE_GEN_OAI_BASEURL`/`IMAGE_GEN_OAI_MODEL` → gateway; no admin key, + members paste their own). Note LibreChat v0.8.8 renders the generated + image only inside the agent conversation. +- **MCP**: `inference-docs` (tool `search_docs`, starts at boot) and + `inference-image` (tool `generate_image`, per-user startup). Members may + add their own via the MCP Settings panel ("bring your own tools"). + Permissions seeded via `interface.mcpServers` (use/create true, share false). - **Speech**: TTS `tinfoil/voxtral-tts` (voice `casual_female`), STT `tinfoil/whisper-large-v3-turbo`, both via the gateway with the capped key. - **Web search**: SearXNG (self-hosted) + keyless Keenable scraper, no reranker. @@ -124,10 +132,10 @@ Set via `cloudron env set` (process env): ## Known state / limitations -- `patches/`, `logo.png`, `logo-coop.png`, `logo.svg` (repo root) are legacy - leftovers from the abandoned 2026-10-18 hand-built-image attempt — unused, - pending cleanup. - The `[schedules]` Redis guard error is resolved by `SCHEDULES_SINGLE_PROCESS=true` (above). - The `RAG API not reachable` warning is expected (no rag_api addon); it only affects LibreChat's own file-RAG, which we do not use. +- The `inference-image` MCP server logs `Tools: undefined` at boot — expected: + with `startup: false` it registers but only spawns per-user after a member + saves their key and reinitializes in the MCP panel. diff --git a/assets/apple-touch-icon-180x180.png b/assets/apple-touch-icon-180x180.png index 63278129959f29921b57decddc30575f504e3550..8db2e7d2f5fdb678cd6397303368afc3421df622 100644 GIT binary patch literal 12749 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 diff --git a/assets/favicon-16x16.png b/assets/favicon-16x16.png index 63278129959f29921b57decddc30575f504e3550..46a744bcceba13bbad0957b6ea92f981dbe86269 100644 GIT binary patch literal 719 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 diff --git a/assets/favicon-32x32.png b/assets/favicon-32x32.png index 63278129959f29921b57decddc30575f504e3550..e0abe83e3fe9c23c82d5469f32c81ea1d990730c 100644 GIT binary patch literal 1742 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 diff --git a/assets/icon-192x192.png b/assets/icon-192x192.png index 63278129959f29921b57decddc30575f504e3550..2b23ed74c7668e42d70747d647f995669350747c 100644 GIT binary patch literal 15663 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 diff --git a/assets/maskable-icon.png b/assets/maskable-icon.png index 63278129959f29921b57decddc30575f504e3550..7e40eb2cefe8c7df86a3f82b12bb206cc66fe0f7 100644 GIT binary patch literal 30796 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 literal 6756 zcmb7Jc|4SB-~ZkB3^9_WvE>|V3MERkGfyEI9b>B#i8fnAr4li>6WNaz*|U|1G>E7y zlbmu|RhCj&+K9?jgNZToUbmjl^PJ~>-uHPwuYcxu-E+-#U%&PH{r$wVepxR|n?nNt z*$uW- zwXdVmUlL&uDrKKwm=LYPzcKP>^Qp@rj~-e0aFhDt@8$-dj5G5O&DWM|i``$5GJk~Dtf6IIzM*bl9tnzcU_oo3P4wWiHF&pYOewtZ6wm7<3^YxL*cdwp{#h<3SY)*rF z$3$zN;W9&^_V3IBcES?a*RGHK5yTR#W7i%R8QcZ_=IhkZ*;@7&LIhpcH|BE+CAc3n zCrZ`Y?SSvPa%W=s>}X5=)0H_MibSNH2Ti{Uy}r#M<@B{c;5!>0XqW+@*zEy1qJq5K z`TN{qu-IzsvmsJoB3_=W;7wc_^R8fmNxtn(bw6dV8`(0%Q%m62%ufs=H^GiNv(p|p zanow+we>mD%SVRrKE51OzC8879N-23B>ittztM3X9w0Qx*So`CQmO~pi{aDh- zBa^o8@t$6)Our#%H}lZ+(uZ8Od_~si(aoVBF>f7oIzIgc%7M8dRq(5LoxQ^5PYOQx zL!WE1=ox*LF=g)+n-$Hz%gQ`n(U$O}$INOp&j9Mn0^8p#Q>K*3u zy%Ydx12C!6n7^->t=e1mM%- zwo&3Tz!}PW-v2|Lf89XtJr<-bPoPXk_x$fd!{;@yYfLcp<{jtAw}P8<8Rix< zU{1H9KqY9MHqcm*AEkIxd?(Nl=gy*mi;J#6TqkD@bx}AdRZEF1KRYYH<-S_Tuh8i4 z{T3Ou*Z^3p5&6#%V(xM}=+Cti*kn@T9)v?a5m&IPIUN6-r}2xZ>Cxf5IltiF^`XMK zh39F#5F1!4rtgNk&fpc>+TWDmgzuFW?M#5wH|L0`Qah^nOP~Q>k+%$MPPSP-Wz6hd z!931Rd=X<$hx~+Y?Q$yDf(9?WQlE-TN9)U*w@4E&{;uohIiL7V{$_`Vov#_eOB)Ol zJ}BL`gRKr25Ycp~Yc3fUcMN``yweAULPHm?VMNpB+`m}*A142cz-k$|;c#(!D_2RQ z_vql7=0)co$)*1Nmn?gZS^cObdI_;0`MOOIdcBFVC|F$rWs4K^NuCSD+#bCca{0`c zt91s#&_DJHFE#?*=CQszk$a$%=GQMbNxH_Q*6h+qo<_ne<%-_2AJvqa^zqB&9Wt8t zG50YQ>mE<8n2s(GFri!fB?{(Rvq>9w+l+FD(BTwK+Dw){t}GggNS^c6z6 zGdq1O=N!fLAA%e>!DBBLPh`$X3l**!R`pVnp+l{j%A<}{hu=a zFEzmA#GPfDVJX2*!_O^xBmBeIj-S=-96`0GcHA>Og>~OPMIvtFk33PeZ@C8z-b0lM zwIUy78kkh4MJ*I&#^YSNcikb2TRY))0dNT&56L(aX5#5lE|o0W+yb8*a7=3&n=(%m8p&uIGA%Hr-WZ_jLWmu@tIhS zxl)ZC*SB9TXFw62CLA@$e;;7>8>+oW10Z8t^+v|{ZJ!v?7> zb5$9Sl1s89O;s-~Pv-c4Opk)Dh8e^GR0+)^UZHS936YWLfX_`Wk7CEKh2UJAAyxF7 zI70_`OC*TP{u1KF*3h>?f>`ACL$r*PA>N0@utz2(<60yM@4}c7-xox!XHVe7^`Mca zO}SL$e8%j@&1|IxYJlvNb1K$Hmmr2v_#5t!ex^=lSYHOtaD9A>tyDx!okf<~3MVM> zPUU%yF2ZVVvCZtHLxrL*U%TqRw|OaMoKC@ygIkO^%+ry{O+(o*dKb3dkt7UlR!woj z0x-AZ;sRT}zV1HDaQ6fVczpo$_qOvq)5flh)5JaF5hc3>U3F_R&M={ELo|FovLfG` z#i{*ypL+1+U1O1&v}<)#hNEttNUkGN`*(R!tXn#fR?L^u>r2a%*-dnB#fjU6G2*J~ zvlmAb8VB^EP<&)FzvQxI-1UKO`ZTe_J|)J&E<*16w)4soFef2&!m}o$yvwhCbSiCD zpdK-Y4hb1wB>ZpRX?GquJWzXG?AE)iQPW@}M%d`&i8kxrSKadI#3o#S0|uqT5fh%) znG_us0L}N{%36thWV~12k$*EBeP-iUp0ad7@G1!?G3@ScxV^fZ$-7^aeTWWVYx^Tr z{uiM%?C7_Gaj8e`83W&56~C@k`yk3VjdS;!HmRNo3qUDgw11UR(vP$AiA~m_@0&Ne z(}3lXdJi1m6H;{W-4)$2A!TZ_X)@$9-(dp{tnUk&m%iCKbaDK{jgG0ViN-Hewth5N zO8*}HYRA=WdikXGd-@$v@&4mJU&rj}&Vm%D-gS*C7p*bkw$5J6?P2@G(w=WmZlNe# zHbX$#vwmXq+nte~btdV^#yz?ppA1=#qtdev_OpGh=Jj4T$7E}u(1E3c} zK-Ueb)iaxReO%#~X5l_*;=)G93Ge{L|LeL4uNGft6r2zwozFH$Mb(9#^Cs|T2KFtsQ;>^K=BbaLJqrw>( zvAuZTc_;R%P1+E*9_!0|!j2VXECKmrIJauy=rJ;L+tTq9TZj8BFGvBuzZMjSe-=4< zLu;#~)3|q;F zT{((v6VVz)QZFYCoSSK)BjL67N{qO)Gcf=;wq_C5(D|)_$?eI@RpfaCd2xbqqV*#{A^v2ds>kZ|yaAy_*a|^l`3=-&9knnRANlsd6Pp1e3FU z_pPm!$VkLZ;_Zu*8d46vRjEAbGh>G%XjR4yqdPtiOMBZr{;EpVu;3di7XJq|Qk* zIXt4RUpCOYhI6qq(VyQG)H7i%5Pc~4FjXF=bmEDnu|l)>SxxVo-z;Mhgu$Sn?8gRc ztsOj0C!@)QN@XuHhtpYsGOVf7?Z55C!Wy({dvL2dVa38)@k^^&?B&*2Mk*fM;H#(A z?04yqLY$(|_!{4IE??~|Zc@3$j&V<=TVGFWt$^cyhG^}VQxg~w@ehL6W_~#4Vw2U+ zA{(Z*JXr>QZZCdaq;ar#Bcqzf{<9q6zg(rj2tseZ$(DP-9weba>D97qhW6MB@vfqqN`5qDh$FAx-iG~Qll;8qwo_h)jB3? zc}=_apaU37X^b6?cHEMFIg=$LnC-%~Jev$mOIIDzcKbCUDgY4%u-f^ClvE_4N{3$z zT_vL}7^`WJ9cV~oen!EMrEGP(&6*B2K z@r@2^^`|K@k!}DXt_uVy1~@!I;!{K6=5y)5PQ(ysncYo8IBI@c$ap?CwJx6^_r0=8iu9u)L z3Ls$C6Ie9FHtJ}T0qiiCz|>!t`ZdWx86g%)U4E^w#H*V#Qjlm~2&AP}lcIK*KL@%13HLd>3Ht`M_$Q zY3yRU`gmLz=e7GQcKL{AZ+hwlVCbGiLu7iCm~#-nl+YsqQQeE=s$nni9Ovrm3bK^aMM6{in($azFz?dGSpS8&w-O&5-mMR#`-SqG}Si3inw=Zq1FQQKZ) z(VTR$W0p_gg&`^O0s+(}VN7R~~JgtX@^ed?}ez2&_NijNOcUes{sc?msb1)!jPYG&rmGt&8Bd7Z&GCX39@gp9j_% zJa`L7QC?fPS&zwh%Zs(8LuukRTqox`@~mw?+t&dBZ1B$##Js{Z0_CQ^D~_0Gr4fSa zTWGRELbnbAi$l_?dcvp)^Z>R0I*3p{A)C=VXg%yfVtYXYxkerjd3s$ci7qsL?uJsW zA_iw{F1O+9?jzd1z5 zGEP0hw34^=_r7Ul#;`xUz+YFOJ~+3ZT{1Q=|In`~^|E#Bu;r6tOVqq0`I-;Fl-C8W}kTU)Kyf+Iy ze?P(&MeL@)v4mhe1r5s3utRlQ;_T~2Kz4!;ZOcYadP}@7B%8$Y9^D6cKrz6&J=d}h zs}Y$b<7)G~_qCTp;cHN#B{K5MfIvD*>P*j%RAwn~`dF+C>S|2cVz27YMP@wi#Dbv;Iy+NoeS<*fD{z4!b*)il9Ssj820|)8N!hMWa7lxos0tYSlNnQI!vs`Ga9tJw<+Jepf%OKV! zYzNl5yEL({E==)vh^V~R2%tGwo&V>lCSULum7au?}n;_+ff65EXmdf!_tHP~% zOPg9}pvl*^2Cd>tH=FFH`ce!iaNwTCMC@t>AAKt9oGmCmvg2~TJhaT?)qb=3be;}; p?T_PM-nyRu2|nt+9saKA|4=bVnwK$&{(A%)tbeh(yw>Zt{{k;cUjP6A diff --git a/librechat.yaml b/librechat.yaml index f10cf05..51ae08f 100644 --- a/librechat.yaml +++ b/librechat.yaml @@ -160,11 +160,28 @@ webSearch: scraperProvider: "keenable" rerankerType: "none" -# MCP servers (admin-configured). The docs server is the same stdlib-only -# Python server Open WebUI uses; it lives on the persistent volume at -# /app/data/mcp/server.py so it survives image updates. +# MCP servers (admin-configured, on the persistent volume so they survive +# image updates). Members opt in per conversation via the composer's + +# palette; each user gets their own isolated server connection. mcpServers: inference-docs: command: /app/code/venv/bin/python3 args: ["/app/data/mcp/server.py"] timeout: 60000 + # Accessible image generation: one click in the + palette, no agent setup. + # Each member's own co-op key is injected per-user via customUserVars → + # env, so images bill to the member's own balance (chat-endpoint model). + inference-image: + command: /app/code/venv/bin/python3 + args: ["/app/data/mcp/image_server.py"] + timeout: 120000 + # Per-user credentials aren't available at boot; each member initializes + # their own connection after saving their key in the MCP panel. + startup: false + customUserVars: + IC_API_KEY: + title: "Inference Co-op API key" + description: "Your co-op API key — create one in the Member Dashboard. Used for image generation; bills to your own balance." + sensitive: true + env: + IC_API_KEY: "{{IC_API_KEY}}" diff --git a/mcp/image_server.py b/mcp/image_server.py new file mode 100644 index 0000000..ecbb40c --- /dev/null +++ b/mcp/image_server.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python3 +"""Inference Cooperative image-generation MCP server (stdio, stdlib-only). + +Exposes a `generate_image` tool that calls the co-op gateway +(`regolo/qwen-image` via POST /v1/images/generations). Each member's own +co-op API key is injected per-user by LibreChat as the IC_API_KEY env var +(`customUserVars` + `env` in librechat.yaml), so usage bills to the member's +own LiteLLM team budget — the same model as the chat endpoint. + +Design notes (mirrors mcp/server.py, the docs server): +- stdio transport: newline-delimited JSON-RPC 2.0; logging to stderr only. +- No third-party dependencies. The image is returned inline as MCP image + content (base64 PNG), which LibreChat renders directly in the chat. +""" + +import base64 +import json +import os +import sys +import urllib.error +import urllib.request + +GATEWAY_IMAGES_URL = "https://gateway.inference.coop/v1/images/generations" +MODEL = "regolo/qwen-image" +REQUEST_TIMEOUT = 90 +ALLOWED_SIZES = ("1024x1024", "1536x1024", "1024x1536") +DEFAULT_SIZE = "1024x1024" +DASHBOARD_URL = "https://dashboard.inference.coop" + +SERVER_NAME = "inference-cooperative-image" +SERVER_VERSION = "1.0.0" + + +def log(msg): + sys.stderr.write(f"[inference-image-mcp] {msg}\n") + sys.stderr.flush() + + +def tool_generate_image(args): + key = (os.environ.get("IC_API_KEY") or "").strip() + if not key: + return { + "content": [{ + "type": "text", + "text": ( + "No Inference Co-op API key configured yet. Open the MCP panel " + f"(inference-image) and save your key — create one at {DASHBOARD_URL}. " + "Your key is only visible to you, and image generation bills to your " + "own co-op balance." + ), + }], + "isError": True, + } + + prompt = str(args.get("prompt") or "").strip() + if not prompt: + return {"content": [{"type": "text", "text": "Provide a prompt for the image."}]} + + size = str(args.get("size") or DEFAULT_SIZE).strip() + if size not in ALLOWED_SIZES: + return { + "content": [{ + "type": "text", + "text": f"Unsupported size '{size}'. Use one of: {', '.join(ALLOWED_SIZES)}.", + }], + "isError": True, + } + + body = json.dumps({"model": MODEL, "prompt": prompt, "n": 1, "size": size}).encode() + req = urllib.request.Request( + GATEWAY_IMAGES_URL, + data=body, + headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"}, + ) + try: + with urllib.request.urlopen(req, timeout=REQUEST_TIMEOUT) as resp: + data = json.loads(resp.read().decode("utf-8")) + except urllib.error.HTTPError as exc: + detail = exc.read().decode("utf-8", "replace")[:400] + log(f"gateway HTTP {exc.code}: {detail}") + hint = "Check that your co-op API key is valid and has balance." + if exc.code == 401: + hint = f"Your key was rejected — re-save it in the MCP panel (create one at {DASHBOARD_URL})." + elif exc.code == 429: + hint = "Budget or rate limit reached on your key." + return { + "content": [{"type": "text", "text": f"Image generation failed (HTTP {exc.code}). {hint}"}], + "isError": True, + } + except Exception as exc: # noqa: BLE001 - report transport errors in-band + log(f"gateway error: {exc}") + return { + "content": [{"type": "text", "text": f"Image generation failed: {exc}"}], + "isError": True, + } + + items = (data or {}).get("data") or [] + if not items: + return {"content": [{"type": "text", "text": "The gateway returned no image."}], "isError": True} + + item = items[0] + content = [] + if item.get("b64_json"): + content.append({"type": "image", "data": item["b64_json"], "mimeType": "image/png"}) + notes = [f"Generated with {MODEL} ({size}) — billed to your co-op key."] + if item.get("revised_prompt"): + notes.append(f"Prompt: {item['revised_prompt']}") + if not item.get("b64_json") and item.get("url"): + notes.append(f"Image URL: {item['url']}") + content.append({"type": "text", "text": " ".join(notes)}) + return {"content": content} + + +TOOLS = [ + { + "name": "generate_image", + "description": ( + "Generate an image from a text prompt (regolo/qwen-image via the Inference " + "Co-op gateway, EU renewable-powered). Costs roughly 1-2 cents per image, " + "billed to your own co-op API key." + ), + "inputSchema": { + "type": "object", + "properties": { + "prompt": {"type": "string", "description": "What to draw"}, + "size": { + "type": "string", + "enum": list(ALLOWED_SIZES), + "description": "Image size (default 1024x1024)", + }, + }, + "required": ["prompt"], + }, + } +] + +TOOLS_HANDLERS = {"generate_image": tool_generate_image} + + +def handle(msg): + method = msg.get("method") + msg_id = msg.get("id") + + if method == "initialize": + return { + "jsonrpc": "2.0", + "id": msg_id, + "result": { + "protocolVersion": "2024-11-05", + "capabilities": {"tools": {}}, + "serverInfo": {"name": SERVER_NAME, "version": SERVER_VERSION}, + }, + } + if method == "ping": + return {"jsonrpc": "2.0", "id": msg_id, "result": {}} + if method == "tools/list": + return {"jsonrpc": "2.0", "id": msg_id, "result": {"tools": TOOLS}} + if method == "tools/call": + params = msg.get("params") or {} + name = params.get("name") + handler = TOOLS_HANDLERS.get(name) + if not handler: + return { + "jsonrpc": "2.0", + "id": msg_id, + "error": {"code": -32602, "message": f"Unknown tool: {name}"}, + } + try: + result = handler(params.get("arguments") or {}) + return {"jsonrpc": "2.0", "id": msg_id, "result": result} + except Exception as exc: # noqa: BLE001 - report tool errors in-band + log(f"tool error: {exc}") + return { + "jsonrpc": "2.0", + "id": msg_id, + "result": {"content": [{"type": "text", "text": f"Tool failed: {exc}"}], "isError": True}, + } + if method and method.startswith("notifications/"): + return None + if msg_id is not None: + return {"jsonrpc": "2.0", "id": msg_id, "error": {"code": -32601, "message": "Method not found"}} + return None + + +def main(): + log("starting (stdio)") + for line in sys.stdin: + line = line.strip() + if not line: + continue + try: + msg = json.loads(line) + except json.JSONDecodeError as exc: + log(f"bad json: {exc}") + continue + try: + resp = handle(msg) + except Exception as exc: # noqa: BLE001 - never crash the protocol loop + log(f"handler crash: {exc}") + if msg.get("id") is not None: + resp = {"jsonrpc": "2.0", "id": msg["id"], "error": {"code": -32603, "message": "Internal error"}} + else: + resp = None + if resp is not None: + sys.stdout.write(json.dumps(resp) + "\n") + sys.stdout.flush() + + +if __name__ == "__main__": + main()