Gemini Research
Deep web research using Gemini CLI with Google Search grounding. Cost-effective alternative to expensive research APIs.
Overview
Leverage Gemini CLI's built-in Google Search grounding (google_web_search) to fetch real-time information with citations. Returns structured JSON for Claude to analyze and synthesize.
Key advantages:
- Free tier: 60 requests/min, 1000/day
- 1M-token context window (Gemini 2.5 Pro)
- Built-in Google Search grounding
- Structured JSON output with citations
- Real-time data (news, docs, tutorials)
Prerequisites
Gemini CLI installed:
npm install -g @google/gemini-cli
Authentication: First run requires Google login (any account works):
gemini -p "test" --output-format json
Follow browser auth flow. Free Code Assist license included.
Verify installation:
gemini --version
Usage
When user asks to:
- "Research X using Google Search"
- "Find real-world examples of X"
- "Get latest information about X"
- "Deep research on X with sources"
Run the skill wrapper with appropriate mode.
⚠️ CRITICAL WORKFLOW STEP
EVERY TIME this skill runs, Claude MUST complete these steps:
- Wait for research to complete - Script outputs markdown file path
- Read the generated markdown file - Use Read tool on the path shown
- Analyze the research findings - Extract key learnings, patterns, recommendations
- Append Claude's Analysis section - Use Edit tool to replace the placeholder
- Present findings to user - Summarize the analysis in chat
This is NOT optional. The markdown file contains a placeholder section that MUST be populated. Skipping this step leaves incomplete documentation.
Example Analysis Format
Your analysis should include:
- Key Learnings: 3-5 main takeaways from the research
- Recommendations: Practical advice based on findings
- Next Steps: Suggested actions or areas for further investigation
- Relevance: How findings apply to the specific context
Concrete Example
After research completes and you read the markdown file at docs/research/google/20250111123456-topic.md:
Use Edit tool to replace placeholder:
old_string: ## Claude's Analysis
_This section will be populated by Claude after analyzing the research findings._
new_string: ## Claude's Analysis
### Key Learnings
- Main finding 1 with context and implications
- Main finding 2 showing clear patterns across sources
- Main finding 3 connecting to broader best practices
### Recommendations
- Actionable advice based on finding 1
- Practical suggestion derived from finding 2
- Trade-off to consider from contradictory sources
### Next Steps
- Specific area to investigate further if needed
- Potential application to current project/context
Then present summary to user in chat response.
Research Modes
1. Quick Research (default)
Fast overview with 5-8 sources.
bash plugins/knowledge-work/skills/gemini-research/scripts/research.sh "your query here"
Output:
- JSON:
gemini-research-output.json(for backward compatibility) - Markdown:
docs/research/google/<timestamp>-<topic>.md(human-readable)
JSON structure:
queries_used: Search queries executedsources: Array of{title, url}key_points: Main findings (5-8 bullets)quotes: Array of{text, source_url}summary: 3-5 sentence brief
Example:
bash plugins/knowledge-work/skills/gemini-research/scripts/research.sh "TypeScript error handling patterns 2025"
2. Deep Research
Comprehensive analysis with 10-15 sources, contradictions identified.
bash plugins/knowledge-work/skills/gemini-research/scripts/research.sh "your query" deep
Output: Extended JSON with:
- All quick mode fields
contradictions: Conflicting info foundconsensus: Widely-agreed pointsgaps: Areas needing more data
Example:
bash plugins/knowledge-work/skills/gemini-research/scripts/research.sh "React Server Components best practices" deep
3. Code Examples
Focus on practical code snippets and real-world implementations.
bash plugins/knowledge-work/skills/gemini-research/scripts/research.sh "your query" code
Output: Code-focused JSON with:
sources: Prioritize GitHub, Stack Overflow, official docscode_snippets: Array of{language, code, source_url, description}patterns: Common implementation patternslibraries: Recommended tools/packagesgotchas: Known pitfalls with solutions
Example:
bash plugins/knowledge-work/skills/gemini-research/scripts/research.sh "Playwright headless browser automation" code
Workflow
Integration with Deep-Research Agent
The deep-research agent can orchestrate multiple research sources in parallel:
- Local codebase (Explorer agent)
- Web search (existing deep-research)
- Gemini research (this skill) ← NEW
- GitHub code search (future)
Combine all sources for comprehensive context.
Output Format
Quick Mode
{
"queries_used": ["typescript error handling 2025", "typescript custom errors"],
"sources": [
{"title": "TypeScript Handbook: Error Handling", "url": "https://..."},
{"title": "Modern Error Handling in TS", "url": "https://..."}
],
"key_points": [
"Use typed errors extending Error class",
"Avoid throwing strings or plain objects",
"Leverage exhaustive type checking"
],
"quotes": [
{
"text": "TypeScript 5.0 introduced better error inference",
"source_url": "https://..."
}
],
"summary": "Modern TypeScript error handling favors typed custom errors over generic Error. Key patterns include discriminated unions for error types and exhaustive checking for safety."
}
Deep Mode
Adds:
{
"contradictions": ["Some sources recommend Error subclassing, others favor plain objects with type guards"],
"consensus": ["All sources agree: avoid throwing strings"],
"gaps": ["Limited guidance on async error handling in React Server Components"]
}
Code Mode
Adds:
{
"code_snippets": [
{
"language": "typescript",
"code": "class ValidationError extends Error { constructor(public field: string) { super(`Invalid: ${field}`); } }",
"source_url": "https://...",
"description": "Custom error with field context"
}
],
"patterns": ["Custom error classes", "Error discriminated unions"],
"libraries": ["zod (validation)", "neverthrow (Result types)"],
"gotchas": [
{
"issue": "Error.prototype breaks after compilation",
"solution": "Set prototype manually: Object.setPrototypeOf(this, ValidationError.prototype)"
}
]
}
Error Handling
Missing API auth:
Error: Not authenticated. Run: gemini -p "test"
Solution: Run gemini once manually to auth.
Rate limits (60/min or 1000/day):
Error: Rate limit exceeded
Solution: Wait 1 minute or try next day. Consider Perplexity/Tavily MCP for higher limits.
No results:
{"error": "No results found", "suggestion": "Rephrase query or try different keywords"}
Gemini CLI not installed:
Error: gemini command not found
Solution: npm install -g @google/gemini-cli
Configuration
Customize prompts:
Edit templates in scripts/research.sh:
QUICK_TEMPLATEDEEP_TEMPLATECODE_TEMPLATE
Change output location:
- JSON (temp):
gemini-research-output.json(current directory) - Markdown (permanent):
docs/research/google/<timestamp>-<topic>.md
Customize via OUTPUT_FILE and RESEARCH_DIR variables in script.
Performance
- Quick mode: ~5-10 seconds (5-8 sources)
- Deep mode: ~10-20 seconds (10-15 sources)
- Code mode: ~8-15 seconds (code-focused)
Speed depends on:
- Query complexity
- Number of sources
- Network latency
- Gemini API load
Comparison with Alternatives
| Feature | gemini-research | Perplexity API | Tavily API | WebSearch (Claude) | |---------|-----------------|----------------|------------|-------------------| | Cost | Free (1000/day) | $$ Paid | $$ Paid | Free (limited) | | Citations | ✅ URLs | ✅ URLs | ✅ URLs | ✅ Titles only | | Rate limit | 60/min, 1000/day | Higher (paid) | Higher (paid) | Lower | | Output format | JSON | JSON | JSON | Text | | Code examples | ✅ Via mode | ❌ | ❌ | ❌ | | Setup | CLI install | API key | API key | Built-in |
Tips
Force Google Search grounding: Prompts explicitly say "Use google_web_search" to ensure tool usage.
Demand citations: All prompts require URLs + quotes for verifiability.
JSON for easy parsing:
--output-format json enables programmatic analysis by Claude.
Chain research: Run multiple queries, Claude synthesizes results.
Example chaining:
# 1. Get overview
bash scripts/research.sh "React Server Components" quick
# 2. Get code examples
bash scripts/research.sh "RSC data fetching patterns" code
# 3. Claude combines both JSONs for implementation
Advanced: Integration Points
With Deep-Research Agent
plugins/development-lifecycle/agents/deep-context-gatherer.md can orchestrate:
1. Run local codebase search (Grep, Glob)
2. Run Gemini research (this skill)
3. Run GitHub code search (future)
4. Synthesize all sources
5. Return unified context
With Feature Development
/commands/develop-feature.md can include research phase:
Phase 1: Research
- Ask user for topic
- Run gemini-research skill
- Extract patterns from JSON
- Proceed to planning
Troubleshooting
Tool call flakiness: Gemini CLI sometimes ignores tool hints. Solution: Make prompts explicit ("Use google_web_search to...").
Missing URLs: If JSON lacks source URLs, check prompt template includes "with citations and URLs".
Empty results: Try broader query or different keywords. Gemini may filter very niche topics.
JSON parsing errors:
Gemini occasionally returns markdown-wrapped JSON. Script uses jq to extract.
Notes
- Free tier may train on data (check Google's terms)
- Personal Google account sufficient (no paid plan needed)
- For production/high-volume: consider Perplexity/Tavily MCP
- Outputs:
- JSON:
gemini-research-output.json(temp, for backward compatibility) - Markdown:
docs/research/google/<timestamp>-<topic>.md(permanent, human-readable)
- JSON:
- Script uses
--output-format jsonfor structured data - Markdown includes placeholder for Claude's analysis section
- Claude must read markdown and append synthesis after research completes