| name | internet-search |
| description | Web research with structured APIs and source hierarchy. Use for documentation lookup and technical answers. |
| context | fork |
| globs | ["**/*.md"] |
| alwaysApply | false |
Internet Search Skill
When to Use
Use this skill when:
- Looking up library documentation, API references, or framework best practices
- Finding answers to technical problems (Stack Overflow, GitHub Issues, forums)
- Checking community consensus on architectural or tooling decisions
- Searching for scientific papers or technical literature
- Finding GitHub repos, issues, PRs, or community solutions
- Checking the latest version or changelog of a dependency
- Validating an approach against external real-world references
- Fetching real-world data (LULC product specs, sensor band definitions, etc.)
1. Tool: web/fetch
VS Code agents use web/fetch to retrieve web pages. It returns content as plain text (HTML stripped or Markdown).
web/fetch(url) → returns page text
Always prefer structured APIs (JSON/XML responses) over raw HTML scraping — faster, more reliable, no parsing fragility.
When you must fetch raw HTML (forums, blog posts): extract only the relevant section, ignore navigation and ads.
Jina Reader — free URL-to-Markdown converter (no API key required)
Prefix any URL with https://r.jina.ai/ to get back clean, LLM-readable Markdown — no HTML parsing, no ads, no navigation noise. Works on any public page.
# Convert any URL to clean markdown
https://r.jina.ai/{FULL_URL}
# Examples:
https://r.jina.ai/https://docs.sqlalchemy.org/en/20/orm/session_basics.html
https://r.jina.ai/https://stackoverflow.com/questions/12345678/
https://r.jina.ai/https://fastapi.tiangolo.com/tutorial/dependencies/
Use Jina Reader whenever a direct web/fetch on a page returns messy HTML. It is completely free, requires no key, and is ideal for documentation pages, blog posts, and forum threads.
2. Source Trust Hierarchy
Always escalate from the highest trust tier before falling back:
| Tier | Sources | Use for |
|---|
| Tier 1 — Authoritative | Official vendor docs, RFC/specs, peer-reviewed papers, GitHub repo READMEs | Definitive answers, API contracts, algorithm correctness |
| Tier 2 — High-signal community | Stack Overflow (accepted/high-vote answers), GitHub Issues/Discussions, official changelogs, MDN | Real-world implementation patterns, known bugs, version-specific behaviours |
| Tier 3 — Useful but verify | Hacker News, Reddit (engineering subreddits), Dev.to, well-cited blog posts (e.g. Martin Fowler, Netlify blog, AWS blog) | Current opinions, ecosystem trends, practical tips |
| Tier 4 — Last resort | General blog posts, tutorials, Medium articles | Background context only — always cross-check with Tier 1/2 |
Rule: Never cite Tier 3/4 as the sole source for a technical decision. Always pair with a Tier 1 primary source.
3. Search Strategies by Category
3.1 General Web — Structured APIs
No Google/Bing API in VS Code agents. Use these reliable structured alternatives:
ddg_instant: "https://api.duckduckgo.com/?q={QUERY}&format=json&no_html=1&skip_disambig=1"
wikipedia: "https://en.wikipedia.org/api/rest_v1/page/summary/{TOPIC}"
wikipedia_search: "https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch={QUERY}&format=json&srlimit=5"
wikidata: "https://www.wikidata.org/w/api.php?action=wbsearchentities&search={QUERY}&language=en&format=json"
3.2 Technology Q&A — Tier 2 Sources
Stack Overflow (most reliable for programming questions):
so_search: "https://api.stackexchange.com/2.3/search/advanced?q={QUERY}&site=stackoverflow&order=desc&sort=votes&accepted=True&pagesize=5"
so_answers: "https://api.stackexchange.com/2.3/questions/{ID}/answers?site=stackoverflow&order=desc&sort=votes&filter=withbody"
se_all: "https://api.stackexchange.com/2.3/search/advanced?q={QUERY}&order=desc&sort=votes&site={SITE}"
Available {SITE} values: stackoverflow, serverfault, superuser, askubuntu, unix, datascience, gis, stats
Example — find top voted accepted answers on FastAPI async SQLAlchemy:
web/fetch("https://api.stackexchange.com/2.3/search/advanced?q=FastAPI+async+SQLAlchemy+session&site=stackoverflow&order=desc&sort=votes&accepted=True&pagesize=5")
GitHub Issues and Discussions (authoritative for library bugs/patterns):
github_issues: "https://api.github.com/search/issues?q={QUERY}+repo:{OWNER}/{REPO}+is:issue&sort=reactions&order=desc"
github_discussions: "https://api.github.com/search/discussions?q={QUERY}+repo:{OWNER}/{REPO}"
github_issues_open: "https://api.github.com/search/issues?q={QUERY}+state:open+label:bug&sort=reactions"
3.3 Tech Community & News — Tier 3 Sources
Hacker News (Algolia API — fast, reliable):
hn_search: "https://hn.algolia.com/api/v1/search?query={QUERY}&tags=story&hitsPerPage=10"
hn_ask: "https://hn.algolia.com/api/v1/search?query={QUERY}&tags=ask_hn&hitsPerPage=5"
hn_recent: "https://hn.algolia.com/api/v1/search_by_date?query={QUERY}&tags=story&hitsPerPage=10&numericFilters=created_at_i>1700000000"
Dev.to (practitioner articles, open source community):
devto_search: "https://dev.to/api/articles?tag={TAG}&per_page=10&top=1"
devto_query: "https://dev.to/search?q={QUERY}"
Good tags: python, fastapi, react, typescript, docker, postgresql, machinelearning, webdev, opensource
Reddit (subreddit-scoped, useful for community picks and comparisons):
reddit_sub: "https://www.reddit.com/r/{SUBREDDIT}/search.json?q={QUERY}&restrict_sr=1&sort=top&t=year&limit=10"
reddit_all: "https://www.reddit.com/search.json?q={QUERY}&sort=top&t=year&limit=10"
High-signal subreddits by domain:
| Domain | Subreddit |
|---|
| Python | r/Python, r/learnpython |
| Web Dev | r/webdev, r/reactjs, r/node |
| DevOps / Docker | r/devops, r/docker |
| Machine Learning | r/MachineLearning, r/learnmachinelearning |
| Data Science | r/datascience, r/statistics |
| Remote Sensing / GIS | r/gis, r/remotesensing |
| Databases | r/PostgreSQL, r/SQL |
| Open Source | r/opensource, r/programming |
3.4 Official Vendor Documentation — Tier 1 Sources
Always fetch official docs before any community source:
mdn_search: "https://developer.mozilla.org/api/v1/search?q={QUERY}&locale=en-US"
mdn_page: "https://developer.mozilla.org/en-US/docs/Web/{PATH}"
python_docs: "https://docs.python.org/3/library/{MODULE}.html"
python_search: "https://docs.python.org/3/search.html?q={QUERY}"
fastapi: "https://fastapi.tiangolo.com/{PATH}"
sqlalchemy: "https://docs.sqlalchemy.org/en/20/{PATH}"
react_docs: "https://react.dev/reference/react/{API}"
typescript: "https://www.typescriptlang.org/docs/handbook/{PATH}"
docker_docs: "https://docs.docker.com/reference/{PATH}"
gha_docs: "https://docs.github.com/en/actions/{PATH}"
traefik_docs: "https://doc.traefik.io/traefik/{PATH}"
3.5 Package Registries & Changelogs
pypi: "https://pypi.org/pypi/{PACKAGE}/json"
pypi_releases: "https://pypi.org/pypi/{PACKAGE}/json"
npm: "https://registry.npmjs.org/{PACKAGE}"
npm_latest: "https://registry.npmjs.org/{PACKAGE}/latest"
conda: "https://api.anaconda.org/package/conda-forge/{PACKAGE}"
crates: "https://crates.io/api/v1/crates/{CRATE}"
3.6 GitHub — Code, Repos, Issues
github_repos: "https://api.github.com/search/repositories?q={QUERY}&sort=stars&order=desc&per_page=5"
github_code: "https://api.github.com/search/code?q={QUERY}+language:python&per_page=5"
github_issues: "https://api.github.com/search/issues?q={QUERY}&sort=reactions&order=desc&per_page=5"
github_readme: "https://raw.githubusercontent.com/{OWNER}/{REPO}/main/README.md"
github_file: "https://raw.githubusercontent.com/{OWNER}/{REPO}/main/{PATH}"
github_releases: "https://api.github.com/repos/{OWNER}/{REPO}/releases?per_page=5"
3.7 Academic / Scientific Literature
s2_search: "https://api.semanticscholar.org/graph/v1/paper/search?query={TERM}&fields=title,authors,year,abstract,citationCount,openAccessPdf&limit=10"
s2_paper: "https://api.semanticscholar.org/graph/v1/paper/{PAPER_ID}?fields=title,authors,year,abstract,references"
crossref: "https://api.crossref.org/works?query={TERM}&filter=type:journal-article,from-pub-date:2020&rows=10&sort=relevance&mailto=researcher@example.com"
arxiv: "https://export.arxiv.org/api/query?search_query=all:{TERM}&start=0&max_results=10&sortBy=relevance"
eartharxiv: "https://eartharxiv.org/repository/search/?q={TERM}"
mdpi_rs: "https://www.mdpi.com/search?q={TERM}&journal=remotesensing&article_type=research-article"
mdpi: "https://www.mdpi.com/search?q={TERM}&article_type=research-article"
pubmed: "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term={TERM}&retmax=10&retmode=json"
Example — fetch top papers with citation count:
web/fetch("https://api.semanticscholar.org/graph/v1/paper/search?query=change+detection+SAR+deep+learning&fields=title,authors,year,abstract,citationCount,openAccessPdf&limit=5")
3.8 Remote Sensing & Geospatial Sources
gee_catalog: "https://developers.google.com/earth-engine/datasets/catalog/{DATASET_ID}"
stac_planetary: "https://planetarycomputer.microsoft.com/api/stac/v1/search"
stac_element84: "https://earth-search.aws.element84.com/v1/collections"
usgs_landsat: "https://www.usgs.gov/landsat-missions/landsat-collection-2"
sentinel_docs: "https://sentinel.esa.int/web/sentinel/technical-guides"
mapbiomas: "https://mapbiomas.org/en/colecoes-mapbiomas-1"
nominatim: "https://nominatim.openstreetmap.org/search?q={QUERY}&format=json&limit=5"
4. Site-Scoped Search (when you know the target site)
When you know the domain but not the exact URL, use DuckDuckGo with site: operator embedded in the query:
ddg_site: "https://api.duckduckgo.com/?q=site:{DOMAIN}+{QUERY}&format=json&no_html=1"
"https://api.duckduckgo.com/?q=site:stackoverflow.com+FastAPI+async+context+manager&format=json&no_html=1"
"https://api.duckduckgo.com/?q=site:docs.python.org+asyncio+gather&format=json&no_html=1"
"https://api.duckduckgo.com/?q=site:github.com+rasterio+issue+band+count&format=json&no_html=1"
Useful site: targets:
| Target | Domain |
|---|
| Stack Overflow | stackoverflow.com |
| Python docs | docs.python.org |
| MDN | developer.mozilla.org |
| FastAPI docs | fastapi.tiangolo.com |
| SQLAlchemy docs | docs.sqlalchemy.org |
| GitHub Issues | github.com |
| Docker docs | docs.docker.com |
| AWS docs | docs.aws.amazon.com |
| Traefik docs | doc.traefik.io |
| Read the Docs | readthedocs.io |
5. Query Construction Best Practices
5.1 Be Specific
❌ Too broad: "machine learning remote sensing"
✅ Specific: "U-Net semantic segmentation Sentinel-2 deforestation 2022"
❌ Too broad: "Python async"
✅ Specific: "FastAPI background tasks SQLAlchemy async session 2024"
❌ Too broad: "Docker error"
✅ Specific: "Docker multi-stage build COPY --from permission denied non-root"
5.2 Boolean & Filter Operators
# Stack Overflow — keyword combinations
"FastAPI" AND "async" AND "SQLAlchemy" AND "session"
# GitHub Issues — filters
is:issue is:closed label:bug "NoneType" "async_session"
# CrossRef — date + type filter
&filter=type:journal-article,from-pub-date:2021
# arXiv — category filter
search_query=cat:eess.IV+AND+all:sentinel+deforestation
# GitHub code — language filter
{QUERY}+language:python+extension:py
5.3 URL Encoding
Always encode spaces and special characters:
import urllib.parse
query = urllib.parse.quote("change detection SAR backscatter temporal")
url = f"https://api.semanticscholar.org/graph/v1/paper/search?query={query}&limit=5"
6. Parallel Search Strategy
For any non-trivial research question, launch sources in parallel grouped by trust tier:
STEP 1 — PARALLEL (Tier 1 primary sources):
├── web/fetch(official docs)
├── web/fetch(PyPI or GitHub README)
└── web/fetch(Semantic Scholar — if academic topic)
STEP 2 — PARALLEL (Tier 2 community sources):
├── web/fetch(Stack Overflow — top voted accepted answer)
├── web/fetch(GitHub Issues — known bugs on this topic)
└── web/fetch(arXiv or CrossRef — alternate paper source)
STEP 3 — ONLY IF NEEDED (Tier 3):
├── web/fetch(Hacker News — community discussion)
└── web/fetch(Reddit — engineering subreddit)
→ Synthesise after each step; stop when enough evidence gathered
→ Never cite Tier 3 as sole source for a technical decision
7. Result Synthesis Template
After fetching, always return structured findings:
## Research Findings: {TOPIC}
### Summary
[2–3 sentence answer to the question based on findings]
### Key Papers / Specs
| Title | Source | Year | Trust | Key Point |
|-------|--------|------|-------|-----------|
| [Paper Title](url) | Semantic Scholar | 2023 | Tier 1 | ... |
### Community Evidence
| Source | Votes/Stars | Finding |
|--------|-------------|---------|
| [SO answer](url) | 342 votes ✓ accepted | Use `asyncio.gather` instead of `create_task` here |
| [GH issue #123](url) | 87 👍 | Fixed in v2.1.0 — upgrade required |
### Reference Implementations
| Repo | Stars | Relevant file |
|------|-------|---------------|
| [owner/repo](url) | 1.2k | `src/service.py` — async session pattern |
### Official Docs
- [Library Name — relevant section](url): key quote or note
### Recommendation
**Answer**: [Direct answer]
**Confidence**: High / Medium / Low
**Caveat**: [Any version-specific or context-specific warnings]
**Sources**: [List citations with tier]
8. Source Quality Checklist
Before citing a source, verify:
9. Rate Limits & Etiquette
| API | Limit | Notes |
|---|
Jina Reader (r.jina.ai) | No hard limit | Converts any URL to clean Markdown; no key needed |
| Semantic Scholar | 100 req/5 min | Pass x-api-key header for higher dedicated limit |
| CrossRef | ~50 req/s | Use mailto= param for polite pool (faster queue) |
| arXiv | ~3 req/s | Add 1s delay between batched calls |
| GitHub (unauthenticated) | 10 search req/min · 60 req/hr | Optionally pass Authorization: token {TOKEN} for 30 search req/min |
| Stack Exchange (unauthenticated) | 300 req/day | Free app key at stackapps.com raises limit to 10,000/day |
| DuckDuckGo Instant Answers | No official limit | Respectful crawl rate |
| Wikipedia / Wikidata | No hard limit | Add User-Agent header with contact info |
| Reddit | 10 req/min | Use User-Agent: MyApp/1.0 header |
| Hacker News (Algolia) | No hard limit | Very permissive |
| PyPI / npm / conda | No hard limit | Very permissive |
| PubMed (NCBI) | 3 req/s | Free API key at NCBI raises limit to 10 req/s |
"https://api.crossref.org/works?query={TERM}&mailto=researcher@example.com"
headers: { "Authorization": "token {GITHUB_TOKEN}" }
"https://api.stackexchange.com/2.3/search/advanced?q={QUERY}&site=stackoverflow&key={APP_KEY}"
MCP search servers provide AI-augmented, structured search results that are cleaner than raw web scraping. They understand the context of queries and return structured, relevant results.
| MCP Server | Source | Strengths | Use Case |
|------------|--------|-----------|----------|
| Brave Search | `@anthropic/brave-search` | Web + news + images, freshness | General web search, current events |
| Tavily | `tavily-mcp` | AI-optimized, ad-free | Developer research, technical queries |
| Exa | `exa-mcp` | Neural search, embeddings | Semantic search, academic papers |
| Perplexity | `perplexity-mcp` | Answer generation + citations | Complex research questions |
```python
search_tools = await discover_mcp_tools(servers=[
"brave-search",
"tavily-mcp",
"perplexity-mcp"
])
async def parallel_search(query: str) -> SearchResults:
"""Search across multiple MCP providers in parallel."""
results = await asyncio.gather(
brave_search(query),
tavily_search(query),
perplexity_search(query),
return_exceptions=True
)
return aggregate_and_deduplicate(results)
Query Construction for MCP
- MCP search servers benefit from structured queries with context
- Include domain filters, date ranges, and result counts
- MCP tools return structured JSON (not raw HTML) — no parsing needed