mirror of
https://github.com/Mintplex-Labs/anything-llm.git
synced 2026-07-19 22:23:50 -04:00
[GH-ISSUE #4602] DummyMCP – A Safe, Minimal MCP Test Server for AnythingLLM in docker #2926
Closed
opened 2026-02-22 18:31:52 -05:00 by yindo
·
6 comments
No Branch/Tag Specified
master
5846-bug-when-scrolling-up-scrolling-jumps
refactor-remove-workspace-pfp
5969-bug-stopgenerationbutton-disappears-on-the-first-prompt-that-initiates-an-agent-session
2235-bug-how-to-upload-a-folder-with-subfolders-with-files-to-anythingllm
5990-workspace-update-fails-with-unknown-argument-router_id-v1130v1150-intel-mac
opencomputer-examples
pg
feat/image-generation-translations
feat/image-generation
5924-bug-meeting-summary-fails-with-sincludes-is-not-a-function-when-default-llm-is-anthropic-claude
render
feat/uniform-modal-component
5883-bug-unescaped-content-in-json-strings-being-passed-to-document-generator-tools
5901-bug-api-update-embeddings-fails-prisma-argument-filename-is-missing-on-workspace_documentscreate-desktop-windows-v1141
hybrid-search
1981-translations
5752-bug-prompts-to-local-jan-endpoint-unresponsive
feat-disable-native-tool-calling-env-var
5676-bug-non-ollama-agent-providers-do-not-parse-and-present-reasoning-content
feat/markdown-web-scraping
5717-bug-apiv1documentupload-silently-drops-metadata-field-in-desktop-1130-arg-count-mismatch-nested-payload-key
fix/aibitat-context-overflow
5711-bug-erratic-deepseek-v4-flash-the-agent-model-failed-to-respond-400-the-reasoning_content
5631-feat-custom-api-request-timeouts-for-ai-providers
feat-reasoning-control
feat-agent-clarifying-questions-translations
5583-bug-lm-studio-provider-does-not-present-reasoning-output
5313-normalize-translations
feat/memory-translations
5305-lemonade-embedding-engine-swallows-errors-falsely-reports-documents-as-embedded
5060-bug-agent-interactions-agent-are-not-persisted-to-thread-history-via-api
pptx-subagent
feat-render-images-from-mcp-tool-results
stt-provider-expansion-openai-api-compatible
feat-file-search-agent-tool
feat-native-embedder-job-queue
5189-normalize-translations
feat-file-search-agent-tool-translations
i18n-eslint
5140-auto-migration
5112-bug-openrouter-failed-message-bug
3506-feat-parameters-for-openrouter-models
4992-feat-preserve-scroll-position
4973-bug-markdown-numbered-list-display-in-reasoning-pane
desktop
4938-bug-pending-chat-rerendering-ui-bug
quickstart-env
node-llama-cpp-in-container-cuda
node-llama-cpp-in-container
ollama-in-container
4817-feat-set-cooldown-per-mcp-server
4845-keyboard-shortcuts-to-navigate-in-chat
4844-feat-reorder-threads-by-latest-interaction
standardize-username-constraints-normalize-translations
4792-feat-refactor-workspacepfp-image
1382-embed-ip-improvements
1382-bug-embed-api-improvements
refactor-eslint-frontend
4687-feat-refactor-vector-db-providers
4615-feat-disable-apidocs-with-environment-variable
4559-feat-agent-web-search-enable-ordering-of-results
4599-bug-ollama-race-condition-bug
4572-bug-lmstudio-provided-llm-stopped-working-with-anything-llm-after-upgrading-to-190
4508-agent-youtube-transcript-analysis
4497-feat-workspace-names
frontend-eslint
ollama-lmstudio-auto-context-window
4431-validate-vector-database-connectioN
2019-slash-command-keyboard-selection
microsoft-foundry-provider
4431-validate-vector-database-connection
4325-sys-prompt-var-improvements
3209-feat-apiv1workspacestream-chat-sources-citations
4210-bug-voice-to-text-overwrite
4136-feat-jan-as-a-backend-server-option
4172-feat-openai-o3-support
1.8.3-rerelease
web-push-notifications-service
tasks
3955-feat-jinaai-embedder-provider-support
3921-feat-agent-skills-uiux-improvements
3901-bug-validfunccall-checks-optional-arguments
keyboard-dev
1787-custom-roles-and-permissions
add-jira-slack-data-connector
office-extension-wip
lightmode-dropdown-color-update
3586-bug-agent-flow-function-description-provided-by-user-is-not-seen-in-the-llm-query
3463-bug-agent-continues-to-run-if-request-failed-even-after-exit
3439-feat-call-variables-within-the-flow-api-block-url-field
3282-manager-view-models-workspace
3280-token-counting-server-side-truncation-improvements
3147-bug-embedded-chat-widget---not-considering-query-mode-option-always-working-in-chat-mode
2995-feat-disable-temperature-setting-for-deepseek-r1-deepseek-reasoner-model
2827-feat-perplexity-citations
2866-feat-finally-a-gemini-models-endpoint
2647-feat-hpp-header-for-a-c++-code-file-mime-addition
lancedb-revert
1656-feat-implement-tooltip-ui-designs
2011-feat-bump-perplexity-models
1873-feat-auto-add-and-watch-folder-for-document-uploads
1297-feat-gemini-agent-support
1759-bug-ui-bug-fixes
1686-feat-implement-winston-for-logging
1536-bug-toggling-on-users-can-delete-workspaces-does-not-take-effect
agent-ui-mobile-styles
1522-feat-chromadb-support
1595-bug-unable-to-get-live-web-search-and-browsing-agent-working-using-google-custom-search-engine-error-getaddrinfo-enotfound-http-errno-3008
1582-bug-lm-studio-does-not-allow-for-different-model-selection
1312-bug-usernames-should-not-be-case-sensitive-when-logging-in
1029-feat-hf-serverless-inference-api
1086-feat-implement-normalized-input-fields
knowledge-graph-support
644-bug-uploaded-file-name-does-not-match-the-displayed-file-name-after-the-upload
v1.15.0
v1.14.2
v1.14.1
v1.14.0
v1.13.0
v1.12.1
v1.12.0
v1.11.2
v1.11.1
v1.11.0
v1.10.0
v1.9.1
v1.9.0
v1.8.5
v1.8.4
v1.8.3
v1.8.2
v1.8.1
v1.8.0
v1.7.8
v1.7.6
v1.7.5
v1.7.4
v1.4.0
v1.3.0
v1.2.4
v1.2.3
v1.2.2
v1.2.1
v1.2.0
v1.1.1
v1.1.0
v1.0.0
Labels
Clear labels
Desktop
Docker
Integration Request
Integration Request
OS: Linux
OS: Mobile
OS: Windows
UI/UX
blocked
bug
bug
core-team-only
documentation
duplicate
embed-widget
enhancement
feature request
github_actions
good first issue
investigating
needs info / can't replicate
possible bug
pull-request
question
stage: specifications
wontfix
Mirrored from GitHub Pull Request
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Mintplex-Labs/anything-llm#2926
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @danny0094 on GitHub (Oct 31, 2025).
Original GitHub issue: https://github.com/Mintplex-Labs/anything-llm/issues/4602
Update / Fix proposal: Working Docker-compatible MCP Bridge + DummyMCP
Hey team
I was made aware a few days ago that Anythingllm cannot influence other Docker instances via Docker.
This means that MCP support via Docker is currently not possible.
So I looked for a solution to fix it.
Primarily for myself. But I also wanted to share it with you.
I’ve been experimenting with a safe way to get AnythingLLM to talk to MCP servers from inside Docker, without triggering the
spawn docker ENOENTlimitation.So I thought, well, if Anythingllm isn't allowed to make outgoing calls, it needs a new solution. A bridge. So I designed a mini HTTP bridge and a dummy MCP server for testing.
The bridge runs in the same container as Anythingllm, and the "receiver," which acts as a dummy MCP server, also runs in its own container.
Completely isolated and secure.
Requests and responses are sent.
Key points:
tools/list,ping, etc.mcp-http-bridgepatternoverview:
anythingllm (container)
│
├─ mini-bridge (container, port 4100)
│ ↳ forwards MCP JSON-RPC requests
│
└─ dummy-mcp (container, port 4200)
↳ responds: “MCP is alive ”
mini_bridge.py
dummy_mcp.py
If there's interest, I'll continue to update this; otherwise, I'll just keep doing it for myself.
I have no idea when or how the Docker update will be released by the development team.
repository
https://github.com/danny0094/mcp-bridge-stack
@sonusainidevops commented on GitHub (Nov 1, 2025):
Nice idea to continue for development
@danny0094 commented on GitHub (Nov 1, 2025):
I am already testing the function with a convenient MCP registration.
mcp_registry.jsonThe reason is that MCP Docker can be implemented as easily as possible.
like Claude : mcp_registry.json
The goal is to make it as easy as possible for everyone to implement an MCP server in AnythingLMM.
The folder structure in the test environment currently looks like this:
├── docker-compose.yml
├── mini_bridge/
│ ├── mini_bridge.py
│ ├── Dockerfile
│ └── config/
│ └── mcp_registry.json
└── dummy_MCP/
└── Dockerfile
The goal of the project is to serve as a clean template for the development and connection of custom MCP modules (e.g., Docs, Time, Weather, etc.) with AnythingLLM.
@danny0094 commented on GitHub (Nov 1, 2025):
Okay, at the moment it looks very good.
The bridge is running inside the container and is successfully sending and receiving from the container.
curl -X POST http://localhost:4100/time \ also confirms everything correctly:
I would like to point this out again:
Each MCP server runs in its own isolated Docker container, completely separated from AnythingLLM and from each other.
The Mini-Bridge acts as a single, controlled communication gateway — it forwards only validated JSON-RPC requests and returns responses without exposing internal Docker or system access.
This design provides:
I’ll keep improving this project as my own independent solution.
If the AnythingLLM team finds the idea useful, feel free to build on it or integrate parts of it.
I plan to publish the full setup on GitHub in the coming days.
As you can see, the tool output is still returned a bit unnaturally instead of a fully formatted chat response — once that’s refined, the public release will follow.
@danny0094 commented on GitHub (Nov 2, 2025):
Feel free to look at the code:
https://github.com/danny0094/mcp-bridge-stack/tree/main
news:
prompt injektor:
A prompt-wrapper intercepts outgoing AnythingLLM requests, appends a short system prompt that instructs the model to decide if the query requires an MCP tool call, and forwards the augmented input to the model. The model must return a structured decision (tool id + confidence). The bridge then routes the request to the chosen MCP only if the decision meets configured checks (allowed tools, minimum confidence, timeout). This keeps AnythingLLM unmodified while enabling model-driven routing.
MCP Hub
The MCP-Hub acts as the central registry and coordination layer for all local MCP modules.
It maintains a live list of available MCP servers, checks their status, and routes requests from the Mini-Bridge or the Decision-Agent to the correct module.
Main features:
Central registry of all MCP endpoints (with auto-reload)
/list and /status APIs for monitoring
/route endpoint for direct routing control
Optional authentication and access rules
This service is designed to scale — multiple bridges or decision agents can connect to the same hub to share MCP state and routing information.
Dual-Model Architecture
The system uses two models working together:
Decision Model – a lightweight local model (e.g. Gemma 3 270M)
It analyzes every user query and decides whether the request should trigger an MCP tool (like time, docs, or weather).
It does not generate text for the user — it only outputs a structured JSON decision, such as:
{"tool": "time", "confidence": 0.92}
Main Model – a larger reasoning model (e.g. Gemma 3 12B or DeepSeek R1 8B)
This one handles the actual conversation, reasoning, and responses to the user.
It receives data from the MCP results (if the Decision Model triggered one) and integrates it naturally into its response.
Workflow:
AnythingLLM sends user input → Mini-Bridge
Mini-Bridge passes it to the Decision Model
Decision Model decides which MCP tool to use
Mini-Bridge forwards to that MCP → gets result
Result goes to the Main Model → final answer to user
This separation allows lightweight models to handle tool routing quickly,
while the larger model focuses purely on reasoning and creativity.
Benefits: lower latency, less resource use, modular scaling, clearer logic flow.
For the devs or curious people, if you want to test the code, make sure you set the correct paths in docker-compose and in the prompt_injector folder in Python:
Environment Variables
sets your models
This test environment does not need to be on the same computer as ollama. The important thing is that you run everything on the same network.
The mcp_hub currently contains the static tool register:
Statische Tool-Registry (dynamically expandable later)
Enter your test MCP server there.
You will find the following in minibridge.py:
@Suranoviremblastiran commented on GitHub (Nov 4, 2025):
I can't get AnythingLLM to even know about MCP servers, everything is configured but somehow the prompt part where the tools are explained to the LLM is missing... I did change my system prompts - did I remove anything by accident - or where is it included?
@danny0094 commented on GitHub (Nov 4, 2025):
Which file did you change exactly?
Otherwise, try this:
docker logs -n 100 anythingllm | grep MCP
and show me the log
or:
Docker compose down
and:
docker compose up
The live log is important.
If you have deleted a line in the code, the easiest thing to do is of course to reinstall Docker Compose.
Did it work before the change?
I'll be releasing an update in the next few days that includes automatic MCP usage. The prompt settings will be simplified there anyway.
Did you use the linked PYS files, or my Git repository?
DummyMCP – A Safe, Minimal MCP Test Server for AnythingLLM in dockerto [GH-ISSUE #4602] DummyMCP – A Safe, Minimal MCP Test Server for AnythingLLM in docker