
Parallel Search
- 11 installs
- 7 repo stars
- Updated June 23, 2026
- manojbajaj95/mcp-skill
Helps with ai & agent building tasks.
About
parallel-search is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- parallel-search
- AI & Agent Building
- AI-coding skill
Parallel Search by the numbers
- 11 all-time installs (skills.sh)
- Ranked #11,740 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/manojbajaj95/mcp-skill --skill parallel-searchAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 11 |
|---|---|
| repo stars | ★ 7 |
| Last updated | June 23, 2026 |
| Repository | manojbajaj95/mcp-skill ↗ |
What it does
Helps with ai & agent building tasks.
Files
parallel-search
Use this skill when you need to work with search-mcp through its generated async Python app, call its MCP-backed functions from code, or inspect available functions with the mcp-skill CLI.
Authentication
This app can use the MCP client's built-in OAuth flow when the server requires it. In most cases, the default constructor is enough. Tokens are persisted to ~/.mcp-skill/auth/ so subsequent runs reuse the same credentials automatically.
app = ParallelsearchApp()If you need a custom OAuth provider, pass it via the auth argument:
app = ParallelsearchApp(auth=my_oauth_provider)Dependencies
This skill requires the following Python packages:
mcp-skill
Install with uv:
uv pip install mcp-skillOr with pip:
pip install mcp-skillPython Usage
Use the generated app directly in async Python code:
import asyncio
from parallel_search.app import ParallelsearchApp
async def main():
app = ParallelsearchApp()
result = await app.web_search_preview(objective="example", search_queries="value")
print(result)
asyncio.run(main())Async Usage Notes
- Every generated tool method is
async, so call it withawait. - Use these apps inside an async function, then run that function with
asyncio.run(...)if you are in a script. - If you forget
await, you will get a coroutine object instead of the actual tool result. - Be careful when mixing this with other event-loop environments such as notebooks, web servers, or async frameworks.
Discover Functions with the CLI
Use the CLI to find available apps, list functions on an app, and inspect a function before calling it:
uvx mcp-skill list-apps
uvx mcp-skill list-functions parallel_search
uvx mcp-skill inspect parallel_search web_search_previewImportant: Add .agents/skills to your Python path so imports resolve correctly:
import sys
sys.path.insert(0, ".agents/skills")
from parallel_search.app import ParallelsearchAppOr set the PYTHONPATH environment variable:
export PYTHONPATH=".agents/skills:$PYTHONPATH"Preferred: use `uv run` (handles dependencies automatically):
PYTHONPATH=.agents/skills uv run --with mcp-skill python -c "
import asyncio
from parallel_search.app import ParallelsearchApp
async def main():
app = ParallelsearchApp()
result = await app.web_search_preview(objective="example", search_queries="value")
print(result)
asyncio.run(main())
"Alternative: use `python` directly (install dependencies first):
pip install mcp-skill
PYTHONPATH=.agents/skills python -c "
import asyncio
from parallel_search.app import ParallelsearchApp
async def main():
app = ParallelsearchApp()
result = await app.web_search_preview(objective="example", search_queries="value")
print(result)
asyncio.run(main())
""""Application for interacting with Parallelsearch via MCP."""
from typing import Any
from fastmcp import Client
from mcp_skill.auth import OAuth
import json
class ParallelsearchApp:
"""
Application for interacting with Parallelsearch via MCP.
Provides tools to interact with tools: web_search_preview, web_fetch.
"""
def __init__(self, url: str = "https://search-mcp.parallel.ai/mcp", auth=None) -> None:
self.url = url
self._oauth_auth = auth
def _get_client(self) -> Client:
oauth = self._oauth_auth or OAuth()
return Client(self.url, auth=oauth)
async def web_search_preview(self, objective: str, search_queries: list[str]) -> dict[str, Any]:
"""
Purpose: Perform web searches and return results in an LLM-friendly format and with parameters tuned for LLMs.
Args:
objective: Natural-language description of what the web search is trying to find.
Try to make the search objective atomic, looking for a specific piece of information. May include guidance about preferred sources or freshness.
search_queries: (optional) List of keyword search queries of 1-6
words, which may include search operators. The search queries should be related to the
objective. Limited to 5 entries of 200 characters each.
Returns:
Tool execution result
Tags:
web, search, preview
"""
async with self._get_client() as client:
call_args = {}
call_args["objective"] = objective
call_args["search_queries"] = search_queries
result = await client.call_tool("web_search_preview", call_args)
texts = []
for block in result.content:
if hasattr(block, "text"):
texts.append(block.text)
text = "\n".join(texts)
try:
return json.loads(text)
except (json.JSONDecodeError, TypeError):
return {"result": text}
async def web_fetch(self, urls: list[str], objective: str | None = None) -> dict[str, Any]:
"""
Purpose: Fetch and extract relevant content from
specific web URLs.
Ideal Use Cases:
- Extracting content from specific URLs you've already identified
- Exploring URLs returned by a web search in greater depth
Args:
urls: List of URLs to extract content from. Must be valid
HTTP/HTTPS URLs. Maximum 10 URLs per request.
objective: Natural-language description of what
information you're looking for from the URLs. Limit to 200 characters.
Returns:
Tool execution result
Tags:
web, fetch
"""
async with self._get_client() as client:
call_args = {}
call_args["urls"] = urls
if objective is not None:
call_args["objective"] = objective
result = await client.call_tool("web_fetch", call_args)
texts = []
for block in result.content:
if hasattr(block, "text"):
texts.append(block.text)
text = "\n".join(texts)
try:
return json.loads(text)
except (json.JSONDecodeError, TypeError):
return {"result": text}
def list_tools(self):
return [self.web_search_preview, self.web_fetch]