← MCP servers · openbmb

UltraRAG

CAUTIONgrade B · trust 82/100

A Low-Code MCP Framework for Building Complex and Innovative RAG Pipelines

deepseekdemoeasyembeddingflaskgpthuggingface transformersllm

Overview

From the repository's own README, as read at the audited commit.

<p align="center">  <picture>    <source media="(prefers-color-scheme: dark)" srcset="./docs/ultrarag_dark.svg">    <source media="(prefers-color-scheme: light)" srcset="./docs/ultrarag.svg">    <img alt="UltraRAG" src="./docs/ultrarag.svg" width="55%">  </picture></p><h3 align="center">Less Code, Lower Barrier, Faster Deployment</h3><p align="center"><a href="https://trendshift.io/repositories/18747" target="_blank"><img src="https://trendshift.io/api/badge/repositories/18747" alt="OpenBMB%2FUltraRAG | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a></p><p align="center">  <a href="https://ultrarag.github.io/"><img src="https://img.shields.io/badge/Homepage-6ABED8?style=for-the-badge&logoColor=white" alt="Homepage"/></a>&nbsp;  <a href="https://ultrarag.openbmb.cn/pages/en/getting_started/introduction"><img src="https://img.shields.io/badge/Documentation-66B89E?style=for-the-badge&logo=bookstack&logoColor=white" alt="Documentation"/></a>&nbsp;  <a href="https://modelscope.cn/datasets/UltraRAG/UltraRAG_Benchmark"><img src="https://img.shields.io/badge/Dataset-DE8EA6?style=for-the-badge&logo=databricks&logoColor=white" alt="Dataset"/></a>&nbsp;  <a href="https://github.com/OpenBMB/UltraRAG/tree/rag-paper-daily/rag-paper-daily"><img src="https://img.shields.io/badge/Paper_Daily-A48BC8?style=for-the-badge&logo=arxiv&logoColor=white" alt="Paper Daily"/></a></p><p align="center">  <a href="./docs/README_zh.md"><b>简体中文</b></a> &nbsp;|&nbsp; <b>English</b></p>---**Latest News** 🔥- **[2026.01.23]** 🎉 UltraRAG 3.0 Released: Say no to "black box" development—make every line of reasoning logic clearly visible 👉 [📖 Blog](https://github.com/OpenBMB/UltraRAG/blob/page/project/blog/en/ultrarag3_0.md)- **[2026.01.20]** 🎉 AgentCPM-Report Model Released! DeepResearch is finally localized: 8B on-device writing agent AgentCPM-Report is open-sourced 👉 [🤗 Model](https://huggingface.co/openbmb/AgentCPM-Report)<details><summary><b>Previous News</b></summary><br

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add frontend --env EXA_API_KEY=${EXA_API_KEY} --env LLM_API_KEY=${LLM_API_KEY} --env RETRIEVER_API_KEY=${RETRIEVER_API_KEY} --env TAVILY_API_KEY=${TAVILY_API_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "frontend": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "EXA_API_KEY": "${EXA_API_KEY}",
        "LLM_API_KEY": "${LLM_API_KEY}",
        "RETRIEVER_API_KEY": "${RETRIEVER_API_KEY}",
        "TAVILY_API_KEY": "${TAVILY_API_KEY}"
      }
    }
  }
}

Exposed tools (47) 41 read · 6 write · 0 destructive

ToolRiskDescription
assign_citation_idsreadAssign sequential citation IDs to passages.
assign_citation_ids_statefulreadAssign unique citation IDs to passages using stateful registry.
build_image_corpusreadBuild image corpus from PDF files by extracting pages as images.
build_mineru_corpusreadBuild text and image corpus from MinerU parsing results.
build_text_corpusreadBuild text corpus from various file formats.
check_model_statewriteCheck if model should continue or stop based on search token.
chunk_documentsreadChunk documents using various chunking strategies.
evaluatereadEvaluate predictions against ground truths using specified metrics.
evaluate_trecreadEvaluate retrieval results in TREC format using IR metrics.
evaluate_trec_pvaluewriteCompare two TREC run files using permutation test to calculate p-values.
evisrag_output_extract_from_specialreadExtract content from <answer>...</answer> tags for EvisRAG.
get_datareadLoad benchmark data from file with key mapping and optional shuffling.
get_global_memoryreadRead global memory from MEMORY.md.
greetreadGreet a person by name.
init_citation_registryreadInitialize citation registry for stateful citation assignment.
ircot_check_endreadCheck if IRCoT answers are complete based on completion phrase.
ircot_extract_ansreadExtract final answer from IRCoT responses using
ircot_get_first_sentreadExtract first sentence from answers for IRCoT pipeline.
iterretgen_nextqueryreadGenerate next query by combining previous query with answer.
merge_passageswriteMerge temporary passages into retrieved passages.
mineru_parsereadParse PDF files using MinerU tool.
output_extract_from_boxedreadExtract content from LaTeX \\boxed{} expressions in answers.
r1_searcher_checkreadCheck if r1_searcher answers are complete based on EOS tokens.
r1_searcher_query_extractreadExtract search queries from answer list using <|begin_of_query|> tags.
route1readRoute queries to state1 or state2 based on query value.
route2readRoute all queries to state2.
save_memorywriteSave one round of user-assistant dialogue into daily project memory.
search_o1_combine_final_informationreadCombine extracted final information into total list for Search-o1.
search_o1_combine_listreadCombine extracted queries and reasons into total lists for Search-o1.
search_o1_extract_final_informationreadExtract final information section from answers for Search-o1.
search_o1_init_listreadInitialize lists for Search-o1 pipeline.
search_o1_query_extractreadExtract search queries from answers using Search-o1 tags.
search_o1_reasoning_extractreadExtract reasoning content before search query tags for Search-o1.
search_r1_checkreadCheck if search-r1 answers are complete based on EOS tokens.
search_r1_query_extractreadExtract search queries from answer list using <search> tags.
surveycpm_after_extendreadProcess responses after extend-plan action in SurveyCPM pipeline.
surveycpm_after_init_planreadProcess responses after init-plan action in SurveyCPM pipeline.
surveycpm_after_writewriteProcess responses after write action in SurveyCPM pipeline.
surveycpm_check_completionreadCheck completion status based on step count only.
surveycpm_format_outputreadFormat final survey output as clean Markdown.
surveycpm_init_citation_registryreadInitialize citation registry for SurveyCPM pipeline.
surveycpm_parse_search_responsereadParse search responses from LLM for SurveyCPM pipeline.
surveycpm_process_passagesreadProcess and deduplicate passages for SurveyCPM pipeline.
surveycpm_process_passages_with_citationreadProcess passages and assign unique citation IDs for SurveyCPM.
surveycpm_state_initreadInitialize state for SurveyCPM pipeline.
surveycpm_update_statewriteUpdate state based on cursor and extend results.
webnote_check_pagereadCheck if WebNote pages are complete or incomplete.

Details

Source
openbmb/ultrarag
npm
frontend@0.0.0
PyPI
ultrarag
Transports
stdio · streamable-http
Credentials it reads
EXA_API_KEYLLM_API_KEYRETRIEVER_API_KEYTAVILY_API_KEYULTRARAG_SESSION_SECRETZHIPUAI_API_KEY
License
Apache-2.0
Stars
5,694 · pushed 0d ago

Trust audit

Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (7 observation(s))
Network
declared (7 observation(s))
Shell
declared (2 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (17)

MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
servers/retriever/src/index_backends/__init__.py:31
module = importlib.import_module(module_path, package=__package__)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
servers/retriever/src/websearch_backends/__init__.py:30
module = importlib.import_module(module_path, package=__package__)
MEDIUMFilesystem / path · fs.system_paths · CWE-22, CWE-59
Dockerfile:16
PATH="/root/.local/bin:/ultrarag/.venv/bin:${PATH}"
MEDIUMFilesystem / path · fs.system_paths · CWE-22, CWE-59
servers/corpus/src/corpus.py:52
if ".." in path_str or path_str.startswith("/etc/") or path_str.startswith("/proc/"):
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
ui/frontend/vite.config.ts:15
target: "http://127.0.0.1:5050",
LOWInventory / provenance · inv.hidden_file · CWE-1104
.env.dev
.env.dev
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/servers/benchmark/test_key_map_alignment.py:62
exec(compile(module, str(BENCHMARK_SRC), "exec"), namespace)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/servers/evaluation/test_normalize_text.py:38
exec(compile(module, str(EVALUATION_SRC), "exec"), namespace)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/llms.txt:6161
base_url: http://127.0.0.1:65501/v1 # [!code ++]
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/llms.txt:7347
base_url: http://127.0.0.1:65504/v1 # [!code ++]
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/llms.txt:7613
retriever_url: http://127.0.0.1:64501
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
ui/frontend/README.md:37
- `/api` -> `http://127.0.0.1:5050`
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
ui/frontend/package.json
@radix-ui/react-dialog, @radix-ui/react-dropdown-menu, @radix-ui/react-select, @radix-ui/react-slot, @radix-ui/react-tabs, @tanstack/react-query, @xyflow/react, class-variance-authority
Why it matters. 33 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
README.md:132
curl -LsSf https://astral.sh/uv/0.12.0/install.sh | sh
LOWSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
docs/README_zh.md:132
curl -LsSf https://astral.sh/uv/0.12.0/install.sh | sh
LOWSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
docs/llms.txt:3143
curl -LsSf https://astral.sh/uv/install.sh | sh
INFOInventory / provenance · inv.oversize · CWE-1104
ui/frontend/dist/assets/index-CJkYAW3o.js
ui/frontend/dist/assets/index-CJkYAW3o.js
Why it matters. 1905651 bytes not read

Gates applied: no_behavioural_pass.

Audited 2026-09-16 · audit v0.4.0 · source sha 80d07c4833c7 · full audit: observations/trust-audit/mcp-server/openbmb__ultrarag.json · Report an issue or request a re-scan

Audit history

DateSourceVerdictGradeScoreChange
2026-09-1680d07c4833c7CAUTIONB82first audit

Alternatives

Other servers in the same categories, safer ones first.

Questions

What is the UltraRAG MCP server?

A Low-Code MCP Framework for Building Complex and Innovative RAG Pipelines

What tools does UltraRAG expose?

47 in total: 41 read-only, 6 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is UltraRAG safe to connect to an agent?

With care. The audit graded it B (82/100) and found 17 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does UltraRAG need?

It reads EXA_API_KEY, LLM_API_KEY, RETRIEVER_API_KEY, TAVILY_API_KEY, ULTRARAG_SESSION_SECRET and ZHIPUAI_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does UltraRAG run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as frontend at 0.0.0.

How current is this page?

The grade is for one exact copy of the source (80d07c4833c7), read on 2026-09-16. The repository is watched and re-audited when it changes.

Provenance: OBSERVED · read 2026-09-16 · job trust-audit-2026-09-16