Unified external research — look up library documentation, search source code in any git repository, and check package versions from a single skill.
Routing
| Intent | Primary tool | Fallback |
|---|---|---|
| Library docs, API reference | llms-probe → WebFetch llms.txt |
context7 if no llms.txt published |
| Changelogs, breaking changes | llms-probe → WebFetch llms.txt |
gh api contents for CHANGELOG.md |
| Cross-repo code search (exact identifier) | Sourcegraph MCP keyword_search |
gh search code, then git-clone for follow-up |
| Semantic / concept query in a GitHub-hosted dep ("how does X work in lib Y") | mcp__plugin_ora_morph__github_codebase_search |
git-clone if the question keeps branching across files |
| Concept query across multi-host or GitLab/Bitbucket repos | Sourcegraph MCP nls_search with 2-5 extracted keywords |
keyword_search after picking a literal term |
| Deep dive in known repo (3+ files) | git-clone + shell tools |
Sourcegraph read_file for one-off reads |
| GitHub issues | gh issue view <N> |
gh search issues for discovery |
| GitHub PRs | gh pr view <N> |
gh search prs for discovery |
| GitHub releases (versions, dates, notes) | gh release view <tag> --repo owner/repo |
gh release list --repo owner/repo for browsing |
| Single file (known repo + path) | Sourcegraph MCP read_file |
gh api repos/.../contents/<path> (GitHub only) |
| Symbol navigation (def, references) | Sourcegraph go_to_definition / find_references |
git-clone + ast-grep |
| Git history / diff search across repos | Sourcegraph commit_search / diff_search / compare_revisions |
gh api /repos/.../commits |
| Package version, deprecation | deps-dev |
npm view for npm-only metadata |
| npm package info (non-version) | npm view <pkg> (Bash) |
WebSearch for community sentiment |
| General web lookup | WebSearch → WebFetch | — |
| Comparison / decision | llms-probe per lib + WebSearch |
context7 for additional snippets |
For mixed requests, launch all relevant tools in parallel. Probe and clone are I/O-bound — start them in the background and run WebFetch/context7/WebSearch concurrently to mask latency.
GitHub access rules
Do not use WebFetch on github.com or raw.githubusercontent.com URLs — use the right tool:
| GitHub content | Use | Never |
|---|---|---|
| Source code (exploration) | git-clone + shell tools |
browsing files via gh api contents |
| Source file (known path) | gh api repos/.../contents/<path> |
WebFetch raw.githubusercontent.com |
| Issues | gh issue view <N> --repo owner/repo |
WebFetch github.com/.../issues/N |
| Pull requests | gh pr view <N> --repo owner/repo |
WebFetch github.com/.../pull/N |
| Issue/PR search | gh search issues "q" --repo ... |
WebFetch github.com/issues?q=... |
| Releases (versions, dates, notes) | gh release view/list --repo owner/repo or gh api repos/.../releases |
WebFetch github.com/.../releases — relative timestamps on the HTML get hallucinated into training-era years |
| CHANGELOG.md | gh api repos/.../contents/CHANGELOG.md |
WebFetch blob/ or raw URLs |
Search discipline
- deps-dev for versions: when checking latest version, deprecation, or comparing installed vs latest — always use
deps-devfirst. Only fall back tonpm viewor WebSearch if deps-dev errors or the package is private. - llms.txt first, context7 fallback: for library docs, run
scripts/llms-probe.shagainst the docs domain before reaching forcontext7. Author-published llms.txt has no community-curation lag and no enrichment layer that can hallucinate. Fall back tocontext7only when probe returns nothing.
llms.txt — Author-Canonical Library Documentation
Many doc sites publish llms.txt (Markdown index of doc pages) and llms-full.txt (concatenated full content). These are author-published — no enrichment layer, no community-curation lag — so they reflect the deployed docs version exactly. Prefer them over context7 when available.
Step 1: Probe for availability
bash scripts/llms-probe.sh <docs-domain>
Outputs TSV kind \t url \t size for any found files. Probes root + common nested paths (/docs/, /en/), follows redirects, dedupes. Returns non-zero exit if nothing found.
kind |
Meaning |
|---|---|
| index | llms.txt — Markdown list of doc page URLs |
| full | llms-full.txt — entire docs corpus concatenated |
Size shows ? when the CDN strips both Content-Length and Content-Range headers (Vercel does this on react.dev) — treat ? as unknown and prefer the index path.
Step 2: Fetch based on what's there
| Found | Action |
|---|---|
llms-full.txt ≤ ~500 KB |
WebFetch it directly — single round trip, full corpus |
llms-full.txt > ~500 KB or size ? |
WebFetch llms.txt first, pick relevant section links, fetch those |
| Only index (no full) | WebFetch the index, then fetch individual page links |
| Probe failed | Fall back to context7 (next section) |
For multi-section pulls, dispatch the page WebFetch calls in parallel.
Known publishers
Confirmed live (April 2026): React (react.dev), Next.js (nextjs.org, content under /docs/), Vercel, Anthropic (docs.anthropic.com → platform.claude.com), Cloudflare (docs.cloudflare.com → developers.cloudflare.com), Supabase, Drizzle (orm.drizzle.team), Hono (hono.dev), Zod (zod.dev), Expo (docs.expo.dev), tRPC (trpc.io), shadcn/ui (ui.shadcn.com). Most Mintlify- and GitBook-hosted docs auto-publish.
Tailwind, most pre-1.0 libraries, and many community packages do not publish — those go straight to context7.
Rules
- Probe before assuming. Adoption is uneven and paths vary (root vs
/docs/vs redirects). Always runllms-probe.shand act on the TSV — never hardcode URLs. - Watch file size before fetching full. Cloudflare's
llms-full.txtis ~46 MB and Supabase reports?(chunked). A blind fetch of either blows the context window. The 500 KB threshold is a heuristic — adjust to remaining context budget. - Index → page chain for big corpora. Treat
llms.txtas a routing table: parse section headings, fetch only the page URLs that match the question.
context7 — Library Documentation (Fallback)
Reach for context7 when llms-probe.sh returns nothing — the library doesn't publish llms.txt, or its docs domain isn't reachable. Coverage spans ~33K libraries via community-curated indexes; tradeoff is an enrichment layer that can introduce inaccuracies the author-published llms.txt avoids.
Two-step workflow via the official ctx7 CLI. Requires bunx ctx7@latest login once (no API key env var).
Step 1: Resolve library ID
bunx ctx7@latest library <name> [query]
Lists library candidates with their Context7 IDs (e.g. /websites/react_dev), trust scores, and snippet counts. The optional [query] re-ranks results by relevance — pass it whenever you already know the topic. Add --json for machine-readable output.
Step 2: Fetch documentation
bunx ctx7@latest docs <libraryId> "<query>"
Returns markdown snippets ranked by relevance. Add --json for structured output. If the first answer is shallow or off-topic, retry with --research — it spins up sandboxed agents that read the source repo and run a live web search, at higher cost.
Rules:
- One-time setup:
bunx ctx7@latest login(interactive). Verify withbunx ctx7@latest whoami. - Always resolve the library ID first — IDs are not guessable.
- Write specific queries —
"useState hook with objects"beats"hooks". The query drives relevance ranking on both commands. - Use
--researchonly as a retry when the default answer was insufficient, not by default — it's slower and more expensive.
Reference: references/context7.md
Sourcegraph — Cross-Repo Search & Code Navigation (MCP)
Sourcegraph public instance exposes an HTTP MCP server at https://sourcegraph.com/.api/mcp providing 13+ tools for cross-repo search, code navigation, and git history. Configured in ora plugin's .mcp.json — tools auto-available to Clio.
Indexes 2M+ OSS repos across GitHub + GitLab + Bitbucket. Sub-second cross-repo queries, no local clone overhead.
Tools by intent:
| Intent | Tool |
|---|---|
| Search by exact identifier (AND) | keyword_search — literal match, ALL terms required. Filters: repo:, file:, lang:, rev: |
| Search by concept / vocab unknown | nls_search — OR logic + word stemming (handler matches handle). NOT semantic embedding |
| Read single file | read_file — 128KB cap; repo, path, optional revision / startLine / endLine |
| List directory | list_files |
| Find repos | list_repos |
| Symbol navigation | go_to_definition, find_references |
| Git history / diffs | commit_search, diff_search, compare_revisions |
| Contributor lookup | get_contributor_repos |
| AI synthesis over codebase | deepsearch — heavy; spawns subagents |
Rules:
- Pick
keyword_searchvsnls_searchby what you know. Concrete identifier (function/class/constant name, error string, literal phrase) →keyword_search. Vocab unknown / conceptual ("how does X work", cross-library pattern) →nls_search. Why:keyword_searchis AND + literal — missing one term zeroes the result;nls_searchis OR + stemming — broader recall but noisier ranking. - Extract keywords before
nls_search. Strip question words (how, what, where, does, is) and articles. Pass 2-5 meaningful nouns/verbs, not full sentences. Example: "how does the router match incoming requests" →router match request handler. Why: tool stems and OR-matches each term — natural-language fillers dilute the signal. - Scope with
repo:^...$anchors to avoid matching forks.repo:foo/barmatchesfoo/bar-forktoo;repo:^github\.com/foo/bar$does not. - Pattern: search → verify path →
read_file. When a search result is annotatedrepo@revision(e.g.github.com/foo/bar@abc123), split it and passrepo+revisionseparately toread_file. Omittingrevisionsilently reads HEAD of the default branch and may return different content. - Parallelize independent searches. Three repos to compare → fire three
keyword_search/nls_searchcalls in one message, not sequentially. - Discovery vs forensics —
keyword_search/nls_searchfor "find repos that…";git-clonefor tracing flow through 5+ files in one repo. - Index lag — Code published within the last ~24 hours may not be indexed. Fall back to
git-clone --refreshfor just-released versions. - Repo not indexed = fallback — If
read_filereturns null repository, drop togit-cloneorgh api contents. deepsearchis heavy — Spawns AI subagents. Use only whenkeyword_search+read_filecan't synthesize the answer and the target spans multiple repos or non-GitHub hosts. For GitHub-only synthesis usemcp__plugin_ora_morph__github_codebase_searchinstead — lighter and shaped for the same job.- Plan tier caveat — Sourcegraph docs note MCP access is part of Enterprise plans; public
sourcegraph.comMCP endpoint's free-tier behavior is unverified. If first tool call returns 401/403, drop togit-clone.
Reference: Sourcegraph MCP docs
Morph github_codebase_search — default for GitHub-hosted semantic queries
mcp__plugin_ora_morph__github_codebase_search runs Morph's WarpGrep subagent against a target public GitHub repo and returns a synthesized answer with file:line citations. Reach for it first when the question is shaped like "how does library X do Y", "where does package Z handle case W", "what's the data flow for feature V in repo R" — one morph call replaces a clone-then-grep-then-read loop.
- Use when the target repo is on GitHub and the question is conceptual / semantic ("how", "where", "what wires X to Y"). Why: morph parallelizes the per-file grep + read + synthesize the caller would otherwise do serially.
- Prefer Sourcegraph for: GitLab/Bitbucket targets, multi-repo cross-cutting searches, exact-identifier-with-filter queries (
repo:,lang:,rev:), git history / diffs. - Prefer
git-clonefor: 3+ files of follow-up exploration in one repo, ast-grep structural queries, or when the question keeps branching ("now show me where this is called, now show me the test for it"). - Trust citations, verify conclusions — morph's
file:linereferences point to real locations in the target repo, but its synthesis (what that code does, how it answers the question) can be wrong. When the answer is load-bearing, spot-check viagh api repos/.../contents/<path>orgit-clone+ Read.
git-clone — Source Code Exploration
Shallow-clone any public git repo into a local cache and explore the working tree with shell tools. Cache lives at ~/.cache/clio-repos/ and is reused across sessions.
bash scripts/git-clone.sh <repo> [--branch X] [--refresh]
The script echoes the absolute path of the cached clone. Subsequent calls for the same repo return the cached path instantly (no re-clone).
Repo argument forms:
owner/repo— GitHub shortcut (e.g.vercel/next.js)- Full HTTPS URL — works for any host (
https://gitlab.com/...,https://gitlab.jmango360.com/...) - SSH form —
git@host:path(requires SSH key configured)
Parallelization: clone is I/O-bound (1-3s for small/medium repos). When researching a topic that needs both docs and source code, dispatch the clone and llms-probe/context7/WebSearch in parallel — by the time docs return, the clone is ready to explore.
Rules:
- Do not read script source code. Run with
--helpfor usage. - Default cache is
~/.cache/clio-repos/; override with--cache-dirwhen needed. - Caches are reused — pass
--refreshonly when you need the latest commit. - For one-off file fetches by exact path, prefer
gh api repos/.../contents/<path>— no clone overhead.
deps-dev — Package Versions
Query latest stable versions from public registries. No API key needed.
python3 scripts/get-versions.py <system> <pkg1> [pkg2] ...
Supported ecosystems:
| Ecosystem | System ID | Example |
|---|---|---|
| npm | npm |
express, @types/node |
| PyPI | pypi |
requests, django |
| Go | go |
github.com/gin-gonic/gin |
| Cargo | cargo |
serde, tokio |
| Maven | maven |
org.springframework:spring-core |
| NuGet | nuget |
Newtonsoft.Json |
| RubyGems | rubygems |
rails, sidekiq |
Output: TSV with columns package, version, published, status.
Rules:
- Do not read script source code. Run directly or use
--help. - Batch lookups when possible — pass multiple package names in one call.
- Flag deprecated packages — if status says
deprecated, suggest an alternative.
Reference: references/deps-dev.md