{"id":"9caacb88-e664-4785-82ea-d6737e8fda40","slug":"rrp-agentic-research-framework","kind":"mcp","name":"rrp-agentic-research-framework","summary":"▎ Sandboxed multi-agent research framework for Claude Code — parallel web + local-corpus research with blocklist-checked fetches and Obsidian-ready notes. Suggested topics: claude-code mcp research-ag","owner":"rrpofficial","repoUrl":"https://github.com/rrpofficial/rrp-agentic-research-framework","license":"MIT","licenseTier":"permissive","trust":"community","stars":0,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-07-04T04:58:28.000Z","addedAt":"2026-10-22T03:12:13.077Z","logoUrl":"https://avatars.githubusercontent.com/u/38098867?v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["developer-tools","files-documents","cloud-infra"],"tags":[],"runtime":"python","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-23T23:26:03.709Z","sample":false,"url":"https://conduits.dev/tools/rrp-agentic-research-framework","language":"Python","transports":["stdio"],"install":{"pypi":"rrp-agentic-research-framework"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# rrp-agentic-research-framework\n\nA Claude Code multi-agent research framework. Give it a topic; it researches\nthe public web and (optionally) a local document corpus (PDF/EPUB/Markdown/\ntext/HTML) in parallel, and writes Obsidian-ready markdown notes. It also\nhas a strict **true-copy** mode that reproduces one public source verbatim\nvia a deterministic, non-LLM conversion pipeline with a mandatory\nword-for-word fidelity check.\n\nAll content extraction (web fetches, PDF/EPUB/HTML parsing) runs inside a\nlocked-down Docker sandbox -- non-root, read-only root filesystem, dropped\ncapabilities, no unbounded network -- so nothing it downloads or parses can\ntouch the host beyond the specific output directory you point it at. Every\nfetch is checked against a safety blocklist (a maintained malware/phishing\nfeed + a small curated piracy list + your own live-editable custom list)\nbefore it happens.\n\n## Requirements\n\n- [Docker](https://docs.docker.com/get-docker/) (daemon running, usable without needing `sudo` for your user)\n- [uv](https://docs.astral.sh/uv/) (`curl -LsSf https://astral.sh/uv/install.sh | sh`)\n- Claude Code\n\n## Install\n\n```bash\ngit clone <this-repo-url> rrp-agentic-research-framework\ncd rrp-agentic-research-framework\n./install.sh\n```\n\nThis builds the sandbox image, refreshes the safety blocklist, and activates\nthe plugin at `~/.claude/skills/rrp-agentic-research-framework/` (auto-loads as\n`rrp-agentic-research-framework@skills-dir` on your next Claude Code session). It also\nadditively patches `~/.claude/settings.json` so `/research` doesn't nag you\nfor permission on every web fetch or Bash call -- only three narrowly-scoped\nentries are added (`WebSearch`, `WebFetch`, and `Bash` restricted to this\nframework's own wrapper scripts), and the original file is backed up first.\n\nThis is a **global** install (`~/.claude/...` and `~/.local/share/...`, not\nanything project-local) -- once installed, `/research` is available from any\nproject directory on this machine, not just this repo checkout.\n\nRe-running `install.sh` any time (e.g. after `git pull`) is safe -- it's\nidempotent, and it never overwrites your `data/blocklist/custom-blocklist.txt`.\n\n## Use\n\n```\n/research \"history of the CAP theorem\"\n/research \"topic\" --corpus ~/Documents/my-papers\n/research \"topic\" --output ~/work/notes/obsidian-vaults/SoftwareEngineeringResources\n/research --true-copy https://www.gutenberg.org/cache/epub/1342/pg1342.txt\n```\n\n`/research` always asks where to save output unless you pass `--output` --\npress Enter to default to your home directory. Nothing is hardcoded to a\nspecific vault; point it at any folder, Obsidian vault or not.\n\n## Adding to your own blocklist\n\nEdit this file any time you personally spot something fishy -- it takes\neffect on the very next request, no reinstall or restart needed:\n\n```\n~/.local/share/rrp-agentic-research-framework/data/blocklist/custom-blocklist.txt\n```\n\nOne domain per line (blocks it and all subdomains), or `re:<pattern>` for a\nregex against the hostname.\n\n## Using it from another agent framework (not just this Claude Code plugin)\n\nThe deterministic tool layer -- blocklist checks, web fetch, PDF/EPUB/HTML\nconversion, true-copy, corpus search -- is also exposed as an MCP server, so\nany MCP-compatible framework can call it directly, independent of Claude\nCode's plugin/subagent system:\n\n```bash\nuv run --project ~/.local/share/rrp-agentic-research-framework rrp-agentic-research-framework-mcp\n```\n\nPoint any MCP client (Claude Desktop, another Claude Code instance,\nLangChain/AutoGen with MCP support, etc.) at that stdio command.\n\nFor local development/testing without running `install.sh` at all, this\nrepo's own `.mcp.json` registers the same server directly from the checkout\n(`uv run --project . rrp-agentic-research-framework-mcp`) -- useful for\niterating on the MCP tools themselves.\n\n## Uninstall\n\n```bash\n./uninstall.sh            # removes the plugin, sandbox image, and support\n                           # runtime; keeps your custom blocklist + audit log\n./uninstall.sh --purge-all  # also removes those\n```\n\nReverses exactly what `install.sh` added to `~/.claude/settings.json` --\nnever touches any other setting, and never touches any research notes\nyou've already generated in whatever output directory you pointed it at.\n\n## Architecture\n\n```\nrrp-agentic-research-framework/\n├── agents/                     # Claude Code subagents (LLM-reasoning layer)\n│   ├── web-researcher.md\n│   ├── offline-researcher.md\n│   └── true-copy-extractor.md\n├── commands/\n│   └── research.md             # /research orchestrator: resolves output\n│                                # location, dispatches subagents in parallel\n├── bin/                        # host-side wrapper scripts -> run inside Docker\n│   ├── ra-fetch-web.sh\n│   ├── ra-convert-pdf.sh / -epub.sh / -html.sh\n│   ├── ra-true-copy.sh\n│   ├── ra-index-corpus.sh / ra-search-corpus.sh\n│   ├── ra-blocklist-check.sh\n│   ├── ra-resolve-output-path.sh\n│   ├── ra-refresh-blocklist.sh\n│   ├── ra-build-image.sh\n│   └── _lib.sh                 # shared shell helpers\n├── docker/\n│   └── Dockerfile              # locked-down sandbox image (non-root,\n│                                # read-only rootfs, dropped capabilities)\n├── src/research_agent/         # deterministic Python toolkit (import name\n│   │                           # kept underscored; console scripts are\n│   │                           # rrp-agentic-research-framework[-mcp])\n│   ├── blocklist/              # blocklist checker (base feed + custom + heuristics)\n│   ├── convert/                # PDF/EPUB/HTML -> Markdown, true-copy\n│   ├── fetch/                  # web fetcher + paywall detection\n│   ├── fidelity/               # true-copy word-for-word diff check\n│   ├── frontmatter/            # Obsidian frontmatter schema + writer\n│   ├── indexing/                # local corpus search index\n│   ├── pathresolve/            # output path resolution\n│   ├── audit/                  # audit logger\n│   ├── cli.py                  # CLI entrypoint\n│   ├── config.py\n│   └── mcp_server.py           # MCP server exposing the toolkit\n├── data/blocklist/\n│   ├── static-supplement.txt   # framework-maintained piracy list\n│   └── custom-blocklist.txt    # yours; created empty on install, never\n│                                # overwritten by re-installs\n├── .claude-plugin/\n│   └── plugin.json             # plugin manifest\n├── .mcp.json                   # local-dev MCP server registration\n├── pyproject.toml              # package + console-script definitions\n├── .python-version             # pinned to 3.12 (see note below)\n├── install.sh\n├── uninstall.sh\n└── README.md\n```\n\n- `agents/web-researcher.md`, `agents/offline-researcher.md`,\n  `agents/true-copy-extractor.md` -- Claude Code subagents (the LLM-reasoning\n  layer: search, synthesize, cite -- never used for the true-copy conversion\n  itself).\n- `commands/research.md` -- the `/research` orchestrator: resolves the\n  output location, dispatches the two research subagents in parallel,\n  synthesizes their notes.\n- `src/research_agent/` -- the deterministic Python toolkit (blocklist\n  checker, web fetcher, PDF/EPUB/HTML converters, fidelity checker,\n  frontmatter writer, corpus search index, CLI, MCP server). Deliberately\n  kept as the internal import package name (`research_agent`, underscored)\n  even after the project itself was renamed -- it's never typed by a user,\n  and a distribution name differing from its import path is normal (e.g.\n  `pip install scikit-learn` imports as `sklearn`). Its own console-script\n  names are `rrp-agentic-research-framework` / `rrp-agentic-research-framework-mcp`,\n  set in `pyproject.toml`.\n- `docker/Dockerfile` + `bin/ra-*.sh` -- the sandbox: every wrapper script\n  (`ra-fetch-web.sh`, `ra-convert-{pdf,epub,html}.sh`, `ra-true-copy.sh`,\n  `ra-{index,search}-corpus.sh`, `ra-blocklist-check.sh`,\n  `ra-resolve-output-path.sh`, `ra-refresh-blocklist.sh`,\n  `ra-build-image.sh`, and the shared `_lib.sh`) runs the CLI inside a\n  `--read-only`, `--cap-drop=ALL`, `--security-opt no-new-privileges`\n  container with only the bind mounts it actually needs.\n- `data/blocklist/static-supplement.txt` -- framework-maintained piracy list;\n  `data/blocklist/custom-blocklist.txt` -- yours, created empty on install.\n- `.python-version` (pinned to 3.12) -- keeps `uv` from picking whatever\n  newest Python it finds on the host, which on a bleeding-edge interpreter\n  can lack prebuilt wheels for `lxml` and break the host-side MCP server.\n\nSee `.claude-plugin/plugin.json` for the plugin manifest, `.mcp.json` for\nthe local-dev MCP registration, and `LICENSE` (MIT) for licensing.\n"}