mirror of
https://github.com/Mintplex-Labs/anything-llm.git
synced 2026-07-19 14:13:35 -04:00
[GH-ISSUE #4579] [BUG]: MCP servers fail to load from anythingllm_mcp_servers.json in Docker (TypeError: Cannot convert undefined or null to object) #2911
Closed
opened 2026-02-22 18:31:47 -05:00 by yindo
·
4 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
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#2911
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 25, 2025).
Original GitHub issue: https://github.com/Mintplex-Labs/anything-llm/issues/4579
Originally assigned to: @shatfield4 on GitHub.
How are you running AnythingLLM?
Docker (local)
What happened?
Description
In AnythingLLM v1.9.0 (Docker build), the file
/app/server/storage/plugins/anythingllm_mcp_servers.json
is correctly detected by the backend, but the MCP Hypervisor fails to parse it and throws a TypeError when booting MCP servers.
As a result, no MCP servers are loaded or started.
Error Log:
[backend] info: [MCPHypervisor] MCP Config File: /app/server/storage/plugins/anythingllm_mcp_servers.json [backend] error: Error listing MCP servers: TypeError: Cannot convert undefined or null to object at get mcpServerConfigs [as mcpServerConfigs] (/app/server/utils/MCP/hypervisor/index.js:104:19) at MCPCompatibilityLayer.bootMCPServers (/app/server/utils/MCP/hypervisor/index.js:390:36) at MCPCompatibilityLayer.reloadMCPServers (/app/server/utils/MCP/hypervisor/index.js:138:16)Expected Behavior
AnythingLLM should:
Properly parse the JSON config file,
Load each MCP server definition listed under mcpServers, and
Automatically boot those servers according to the configuration.
Actual Behavior
The file is detected and logged by the MCP Hypervisor.
The JSON is valid and accessible inside the container.
Still, the process crashes with a TypeError and no MCP servers are initialized.
Environment
AnythingLLM version: v1.9.0 (Docker)
Host OS: Ubuntu Server 22.04
Docker network: danny_ai-net
Mounted volume: /opt/anythingllm/storage:/app/server/storage
Container name: anythingllm
MCP Config Example
The file has been verified with jq and is valid JSON.
Possible Cause
In /app/server/utils/MCP/hypervisor/index.js,
the mcpServerConfigs getter seems to receive undefined, likely due to an initialization or fallback issue when the plugin directory is empty or when the JSON parser doesn’t correctly handle the file’s structure inside Docker volumes.
Workaround
No stable workaround found.
The error persists even with a valid JSON file, correct volume mount, and proper permissions.
Additional Notes
MCP support was announced in v1.9.0 but may not be fully functional in the Docker build.
This issue prevents all MCP server configurations from loading in containerized setups.
Please confirm if the MCP parser initialization is missing or mis-referencing the storage path in Docker
builds.Are there known steps to reproduce?
Steps to Reproduce
Run the official AnythingLLM Docker image (mintplexlabs/anythingllm:1.9.0)
Mount a valid storage directory to /app/server/storage, e.g.:
-v /opt/anythingllm/storage:/app/server/storageInside that storage path, create the file:
/app/server/storage/plugins/anythingllm_mcp_servers.jsonAdd a valid MCP config such as:
Restart the container:
docker restart anythingllmCheck the logs:
docker logs -n 50 anythingllm | grep MCPResult:
The backend throws
TypeError: Cannot convert undefined or null to objectPossible Cause / Fix Ideas
The getter mcpServerConfigs in
/app/server/utils/MCP/hypervisor/index.jslikely receives undefined because the MCP parser doesn’t handle an existing JSON object correctly when the plugin folder is empty or uninitialized.
Adding a simple null-check or fallback could fix the crash:
It’s also possible that this._configs is initialized after the JSON file is parsed, causing the first access to fail.
Confirming that storage/plugins is properly resolved in Docker (not overwritten at runtime) might also help.
@danny0094 commented on GitHub (Oct 27, 2025):
Additional Observations
Both files exist and contain identical JSON content:
Despite that, the Hypervisor logs always show:
[MCPHypervisor] Successfully started 0 MCP servers: []The container runs under the non-root user anythingllm.
File permissions were checked and confirmed — also tested with docker exec -u root with no difference.
When the same JSON file is placed under /app/server/storage/mcp_servers.json,
the MCP servers show up correctly in the UI, which means the issue only affects the Hypervisor path.
Wrapping the JSON array in an object like
{ "mcpServers": [ ... ] }changes the error from
Cannot convert undefined or null to object
to
Cannot read properties of undefined (reading 'anythingllm'),
indicating that bootMCPServers() is expecting an object with keys (e.g. anythingllm) instead of an array.
It seems the Docker build’s Hypervisor (running as anythingllm user) fails to parse the MCP config as intended,
while the legacy JSON path still works fine.
The problem appears isolated to MCPCompatibilityLayer.bootMCPServers() in the Docker runtime.
@danny0094 commented on GitHub (Oct 28, 2025):
Additional test with a customized HTTP bridge
To further narrow down the problem, a FastAPI-based HTTP bridge was implemented between AnythingLLM and a simple MCP server.
The goal was to determine whether the TypeError was caused by malformed JSON responses or by the Docker build's internal MCP parser.
Bridge-Code (mcp-http-bridge.py):
[
{
"name": "MCP-Bridge",
"description": "HTTP Bridge for local MCP communication.",
"url": "http://mcp-http-bridge:4001",
"status": "active",
"type": "streamable",
"commands": []
},
{
"name": "MCP-Time",
"description": "A simple time and date server via HTTP bridge.",
"url": "http://mcp-time:4000",
"status": "active",
"type": "streamable",
"commands": []
}
]
[MCPHypervisor] MCP Config File: /app/server/storage/plugins/anythingllm_mcp_servers.json
[MCPHypervisor] Pruning 0 MCP servers...
[MCPHypervisor] Error force reloading MCP servers: TypeError: Cannot convert undefined or null to object
@danny0094 commented on GitHub (Oct 29, 2025):
Additional hypothesis (pending verification)
After reviewing the MCP boot sequence and Docker startup behavior, I suspect a potential race condition in the AnythingLLM Docker build:
The MCP Hypervisor may attempt to read /app/server/storage/plugins/anythingllm_mcp_servers.json before the file contents are fully loaded or synchronized from the mounted volume.In this scenario, the file exists but is still empty or uninitialized when bootMCPServers() calls the getter mcpServerConfigs, causing this._configs (or this._configs.mcpServers) to be undefined at runtime — resulting in the TypeError: Cannot convert undefined or null to object.
This would explain why the same JSON under /app/server/storage/mcp_servers.json loads successfully — that file is parsed later in the init sequence, after storage sync.
I’ll run a few additional tests to confirm this hypothesis (e.g., delaying the bootMCPServers() call or logging _configs initialization timing) when I have some free time.
Just wanted to document this possible cause for the dev team in the meantime.
@shatfield4 commented on GitHub (Oct 29, 2025):
So after testing this in as many ways as possible, I've come to the conclusion that you are creating the
anythingllm_mcp_servers.jsonfile in an incorrect format before the initialization of this file is run inside the docker image. The only time I was able to get the error you are showing with[backend] error: Error listing MCP servers: TypeError: Cannot convert undefined or null to objectis if I provide an invalid mcp config with just {} or invalid JSON in the config.I also see you noted that you have both of these files:
/app/server/storage/mcp_servers.json/app/server/storage/plugins/anythingllm_mcp_servers.jsonbut only this one should exist:
/app/server/storage/plugins/anythingllm_mcp_servers.jsonWhen starting up the docker image fresh, if you visit the
/settings/agentspage it will run the initialization for that file for you and create all the correct file structures that we expect. I have tested this with your configs you provided and it works as it should.The only thing that I ran into (which you will probably run into too) is that when running AnythingLLM via Docker container, we do not currently support mcp servers that are run inside of docker. You will most likely run into the
spawn docker ENOENTerror. This is because we cannot start and access docker containers from inside then AnythingLLM docker container at the moment.See this comment and this comment for more info on how you can solve this.
Closing for now but if there is any more information you can provide then we'd be more than happy to reopen this issue.
[BUG]: MCP servers fail to load from anythingllm_mcp_servers.json in Docker (TypeError: Cannot convert undefined or null to object)to [GH-ISSUE #4579] [BUG]: MCP servers fail to load from anythingllm_mcp_servers.json in Docker (TypeError: Cannot convert undefined or null to object)