MCP server — web search, patent details, video transcripts, scholar profiles, and browser tools for Claude Code
Project description
docduty-search
MCP server that unifies web search, academic papers, videos, news, and patents behind a small set of composable tools — with optional Chrome browser integration for fetching JS-rendered pages, running JavaScript, parsing with Python, and taking screenshots.
Install
uv tool install docduty-search # search + details only
uv tool install "docduty-search[browser]" # + fetch, js, py, screenshot
Setup
docduty-search setup
One command does everything:
- Prompts for API keys → saves to
~/.config/docduty-search/.env - Installs the research skill →
~/.claude/skills/docduty-search/SKILL.md - Registers the MCP server with Claude Code (if
claudeCLI is found)
API keys:
- SerpAPI key (required) — serpapi.com/manage-api-key
- Perplexity key (optional) — console.perplexity.ai — enables domain-filtered search
Tools
search
Search across 7 source types.
search("svelte 5 runes") # web
search("machine learning", type="scholar") # papers with citations
search("react tutorial", type="video") # YouTube
search("AI regulation EU", type="news") # news
search("piezoelectric transducer", type="patents") # patents
search("svelte logo", type="images") # images
search("electric vehicles", type="trends") # Google Trends
| Parameter | Description |
|---|---|
query |
Search query (required) |
type |
web · scholar · video · news · patents · images · trends |
domains |
Filter by domain. Prefix with - to exclude: ["-reddit.com"] |
language |
ISO 639-1 code: "en", "no", "de" |
recency |
hour · day · week · month · year |
num |
Max results (default 10) |
Patent-specific filters:
| Parameter | Description |
|---|---|
before |
"priority:YYYYMMDD" or "publication:YYYYMMDD" |
after |
Same format as before |
inventor |
Filter by inventor name |
assignee |
Filter by assignee/company |
country |
Country codes: "US,WO,EP" |
status |
"GRANT" or "APPLICATION" |
sort |
"new" or "old" (by filing date) |
Per-type extras in results:
| Type | Extra fields |
|---|---|
scholar |
authors, cited_by, result_id, resources (PDF links), author_ids |
video |
duration, channel, views, video_id |
news |
source |
patents |
patent_id, pdf, filing_date, inventor, assignee |
details
Get structured details for a result. Returns a summary inline; full data (claims, articles, transcript text) goes to the py() namespace.
details("patent/US11734097B1/en") # patent claims, citations, similar
details("scholar/6497879044063343659") # scholar article via Google Patents
details("t-NybWd6Sz0J") # citation formats (MLA, APA, BibTeX)
details("video/dQw4w9WgXcQ") # video metadata + description
details("transcript/dQw4w9WgXcQ") # full transcript text
details("author/nTJ7ihUAAAAJ") # author profile, h-index, articles
| ID format | Inline response | In py() namespace |
|---|---|---|
patent/... |
title, abstract, dates, classifications, counts | claims, patent_citations, cited_by, similar_documents |
scholar/... |
same as patent | same as patent |
video/... |
title, channel, views, description_preview | description |
transcript/... |
chars, chapters | full_text |
author/... |
name, affiliations, h-index, articles_count | articles, co_authors |
| result_id | citation formats + export links | — |
fetch (browser extra)
Navigate Chrome to a URL and extract content. Returns a summary with preview; full content available via py().
fetch("https://svelte.dev/docs/svelte/$state")
→ { url, title, chars, content_preview }
py("content[:500]") # full extracted markdown
py("soup.select('h2')") # BeautifulSoup on raw HTML
Handles Cloudflare challenge pages automatically (waits for real Chrome to pass the challenge). Also handles documents (PDF/DOCX/PPTX/XLSX) via Content-Type detection and MarkItDown conversion.
js (browser extra)
Run JavaScript on the current page.
js("document.title")
js("[...document.querySelectorAll('h2')].map(h => h.textContent)")
py (browser extra)
Run Python with access to page content and all previous results.
py("len(content)")
py("[h.text for h in soup.select('article h2')]")
py("cache.clear()")
Available in namespace:
content— clean extracted markdown from lastfetch()html— raw HTML from lastfetch()soup— BeautifulSoup parsed HTMLurl— current page URL_/_1.._N— result history across all toolsjs_result— lastjs()resultcache— TTL cache, callcache.clear()to resetclaims,cited_by,full_text, etc. — from lastdetails()call
screenshot (browser extra)
Capture the current page as PNG.
screenshot() # saves to temp file
screenshot("/tmp/page.png") # saves to specific path
Example: Patent Research
# Search with filters
search("MEMS transducer", type="patents", assignee="Murata", country="US,JP", status="GRANT")
# Get structured details — claims, citations, similar documents
details(_1[0]["patent_id"])
py("len(claims)") # 55 claims
py("claims[0][:200]") # first claim preview
py("len(cited_by)") # 61 forward citations
# Find prior art (replicates Google Patents "Find Prior Art" button)
search(" ".join(_2["prior_art_keywords"]), type="patents",
before=f"priority:{_2['prior_art_date'].replace('-','')}")
# Follow a citation chain
details(_2["cited_by"][0]["patent_id"])
Example: Video Learning
# Find tutorials
search("svelte 5 runes tutorial", type="video", num=5)
# Get video details
details(f"video/{_1[0]['video_id']}")
# Get the full transcript
details(f"transcript/{_1[0]['video_id']}")
py("full_text[:500]") # first 500 chars of spoken content
Example: Scholar Research
# Search papers
search("piezoelectric micromachined ultrasonic transducer review", type="scholar")
# Get citation formats
details(_1[0]["result_id"]) # MLA, APA, Chicago, BibTeX
# Author profile
details(f"author/{_1[0]['author_ids'][0]}")
py("articles[:3]") # top 3 papers
py("co_authors") # collaborators
Backends
| Backend | Used when | API key |
|---|---|---|
| SerpAPI | All search types + details | SERPAPI_API_KEY (required) |
| Perplexity | type="web" + domains set |
PERPLEXITY_API_KEY (optional) |
| Chrome CDP | fetch, js, py, screenshot |
None (uses local Chrome) |
Development
git clone https://github.com/user/docduty-search
cd docduty-search
uv sync --extra browser
ruff format src/ && ruff check src/
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file docduty_search-0.1.1.tar.gz.
File metadata
- Download URL: docduty_search-0.1.1.tar.gz
- Upload date:
- Size: 18.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"EndeavourOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e3f88704644543a8710863b894ca6389fe9c8eaefd607b4984b68a060114a65
|
|
| MD5 |
b546ffafdd09a84a02a16e383d1322ed
|
|
| BLAKE2b-256 |
227e2cb4fadab0a256948e63546f59d5a9b40d45539db394db0f6ebd1c0bad51
|
File details
Details for the file docduty_search-0.1.1-py3-none-any.whl.
File metadata
- Download URL: docduty_search-0.1.1-py3-none-any.whl
- Upload date:
- Size: 22.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"EndeavourOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2ecca298bd1a251c0e0d453755f9feec00139742d2c9c2f61b75033650551acc
|
|
| MD5 |
ded49b400a32c25ed89c624604d25c76
|
|
| BLAKE2b-256 |
d81bfd758c524b3b0d6447966ef6ad0c4d3cb49abd216808f0c38a05c0c24835
|