4.6 KiB
Go through the following steps to use this MCP serer:
-
Create Python Virtual Env from your root directory python -m venv venv
-
Activate Virtual Env a) Windows: venv\Scripts\activate.bat b) Unix: source venv/bin/activate
-
Installing Dependencies pip install -r requirements.txt
-
Start MCP Sever python -m mcp_server
-
In your project where you want to use this Server, implemt a tool like the following:
@tool("FastMCP Batch Web Content extraction Tool") def fastmcp_batch_web_content_extraction_tool(urls: list[str], query: str) -> str: """ Connects directly to the FastMCP HTTP server to scrape and extract text from a list of multiple URLs simultaneously in parallel. """ async def call_fast_mcp(): # Initialize client using FastMCP's precise matching transport protocol transport = StreamableHttpTransport("http://localhost:8000/mcp/")
async with Client(transport) as client:
# call_tool abstracts away deep JSON-RPC structures
result = await client.call_tool("batch_web_content_extraction", {"urls": urls, "query": query})
return result
try:
# Spin up clean execution loop for this worker thread
mcp_response = asyncio.run(call_fast_mcp())
# FastMCP Client response objects expose string contents naturally via .content
# Ensure we safely extract the raw text string from the MCP content blocks
if hasattr(mcp_response, "content") and mcp_response.content:
# The text is inside the first content block object
raw_content = mcp_response.content[0].text
else:
# Fallback to string casting if it's already a plain string
raw_content = str(mcp_response)
# Parse JSON and pretty-format the string back to the CrewAI Agent
try:
parsed_data = json.loads(raw_content)
formatted_output = []
for item in parsed_data:
formatted_output.append(f"=== SOURCE URL: {item['url']} ===")
formatted_output.append(f"STATUS: {item['status']}")
formatted_output.append(f"CONTENT:\n{item['content']}\n")
formatted_output.append("=" * 40 + "\n")
logger.info(f"""FastMCP Batch Web Content extraction tool used.\nURLs:\n{"\n".join(urls)}\nQuery: {query}\nResult:\n{"\n".join(formatted_output)}""")
return "\n".join(formatted_output)
except json.JSONDecodeError:
logger.info(f"""FastMCP Batch Web Content extraction tool used. Error in JSON formatting so raw data returned:\nURLs:\n{"\n".join(urls)}\nQuery: {query}\nResult:\n{raw_content}""")
return raw_content
except Exception as e:
logger.info(f"""FastMCP Batch Web Content extraction tool used. Error executing the tool and no data returned.""")
return f"Error executing Parallel FastMCP tool over Streamable HTTP: {str(e)}"
Info about this Server
MCP server that fetches multiple URLs in parallel and extracts the content relevant to a query. -Clean and deduplicate URLs -Clean extracted text -Semantic selection to keep only text relevant to the query -Limit number of extracted characters per URL and also limit the total characters extracted to avoid returning too much text
Arguments: urls: List of URLs to process.
query: User question or information wanted Semantic ranking is performed against this query.
Optional Arguments: max_chars_per_url: Maximum characters returned for each URL. Default set to 6000
max_total_chars: Maximum characters returned across all URLs. Default set to 30000
top_k_chunks: Maximum number of relevant chunks per URL. Default set to 6
min_relevance_score: Minimum semantic similarity score. Default set to 0.25
Returns: List of relevant web content results. Below an example of info return for one URL:
========================================
=== SOURCE URL: https://www.marketsandmarkets.com/Market-Reports/3d-scanner-market-119952472.html === STATUS: success CONTENT: [Semantic Retrieval] Query: Extract information about companies, products, pricing, key features, target customers, market trends, growth, and competitive information related to 3D scanners. Chunks considered: 109 Chunks selected: 6 Relevance scores: [0.759, 0.757, 0.749, 0.71, 0.7, 0.696] Content characters: 3046 Truncated: False
--- RELEVANT CONTENT --- Chunk 1
Chunk 2
Chunk 3
Chunk 4
Chunk 5
Chunk 6
========================================