LangGraph + Scrapeless: अपने एजेंट ग्राफ में लाइव वेब टूल्स को वायर करें
Expert in Web Scraping Technologies
TL;DR:
- LangGraph ने Scrapeless MCP सर्वर के टूल को
langchain-mcp-adaptersके माध्यम से लोड किया और सभी 21 को एक एजेंट ग्राफ को सौंप दिया, जिसमेंscrape_markdownसे लेकर पूर्ण ब्राउज़र सेट शामिल है। MultiServerMCPClient.get_toolsहैंडशेक चलाता है और टूल लौटाता है; इन्हें लोड करने या सीधे किसी को कॉल करने के लिए किसी मॉडल-प्रदाता कुंजी की आवश्यकता नहीं है।langchain-mcp-adaptersप्रत्येक टूल का परिणाम सामग्री ब्लॉकों की सूची के रूप में लौटाता है, इसलिए आपresult[0]["text"]पढ़ते हैं, न कि सूची को स्ट्रिंगिफाई करते हैं।- एजेंट को
from langchain.agents import create_agentके साथ बनाया गया है, जोcreate_react_agentके लिए वर्तमान प्रतिस्थापन है। - केवल
create_agentग्राफ और इसकेainvokeरन को एक मॉडल कुंजी की आवश्यकता है; टूल को लोड करने और कॉल करने के लिए इसकी आवश्यकता नहीं है। - Scrapeless फ्री प्लान पर शुरू करें और अपने ग्राफ को वास्तविक वेब टूल दें।
LangGraph एक एजेंट को एक ग्राफ के रूप में बनाता है: एक स्थिति मशीन जो मॉडल और इसके टूल के बीच तब तक लूप करती है जब तक कार्य पूरा नहीं हो जाता। यह डिज़ाइन केवल ग्राफ में मौजूद टूल के रूप में ही उपयोगी होता है, और एक खाली LangGraph एजेंट के पास कोई ऐसा टूल नहीं होता है जो लाइव वेब तक पहुंचता है। मॉडल संदर्भ प्रोटोकॉल उस अंतर को भरता है। LangGraph के MCP एडेप्टर को एक सर्वर पर इंगित करें और यह जो भी टूल उजागर करता है वह एक LangChain टूल बन जाता है जिसे आपका ग्राफ कॉल कर सकता है।
यह गाइड LangGraph को Scrapeless MCP सर्वर से जोड़ती है, इसके 21 टूल लोड करती है, एक को वास्तविक रूप से कॉल करती है, और दिखाती है कि मॉडल-प्रदाता कुंजी कहां आवश्यक हो जाती है। टूल-लोडिंग और सीधे कॉल को लाइव सर्वर के खिलाफ सत्यापित किया गया है; पीढ़ी का चरण एकमात्र पूर्वापेक्षा के रूप में चिह्नित है जिसकी आवश्यकता होती है।
क्यों Scrapeless MCP
Scrapeless MCP सर्वर ऐसे वेब-सक्रैपिंग और ब्राउज़र टूल को उजागर करता है जिन्हें एक एजेंट सीधे कॉल कर सकता है, इसलिए स्क्रैपिंग परत कुछ नहीं है जिसे आप बनाते या होस्ट करते हैं। एक कनेक्शन 21 टूल प्रदान करता है: सामग्री के लिए scrape_markdown और scrape_html, खोज डेटा के लिए google_search और google_trends, कैप्चर के लिए scrape_screenshot, और एक पूर्ण browser_* सेट जो एक क्लाउड ब्राउज़र को संचालित करता है। LangGraph पहले से ही langchain-mcp-adapters के माध्यम से एक मजबूत MCP कहानी रखती है, जो उन टूल को बिना किसी गोंद के कोड के सामान्य LangChain टूल में बदल देती है।
browser_* टूल Scrapeless क्लाउड ब्राउज़र को संचालित करते हैं, इसलिए एक एजेंट एक इंटरएक्टिव पृष्ठ को नेविगेट कर सकता है और जो प्रदर्शित होता है उसे पढ़ सकता है, यह सब Scrapeless अवसंरचना पर, एक स्थानीय ब्राउज़र पूल पर नहीं। यदि आप साधारण LangChain पर हैं बजाय LangGraph पर, तो LangChain + Scrapeless MCP पोस्ट उस पक्ष से उसी सर्वर को कवर करती है।
पूर्वापेक्षाएँ
- Python 3.10 या नई।
- डैशबोर्ड से एक Scrapeless API कुंजी, जिसे
SCRAPELESS_API_KEYके रूप में निर्यात किया गया है। - केवल एजेंट रन के लिए एक मॉडल-प्रदाता कुंजी (जैसे
OPENAI_API_KEY)। टूल को लोड करने और कॉल करने के लिए किसी की आवश्यकता नहीं है।
इंस्टॉल करें
LangGraph, LangChain, और MCP एडेप्टर स्थापित करें।
bash
pip install langgraph langchain langchain-mcp-adapters
अपने Scrapeless कुंजी को शेल में सेट करें। रन टाइम पर वास्तविक कुंजी का उपयोग करें और अपने स्रोत से प्लेसहोल्डर को बाहर रखें।
bash
export SCRAPELESS_API_KEY="sk_your_key_here"
टूल लोड करें
MultiServerMCPClient सर्वर नामों को कनेक्शन कॉन्फ़िग के मानचित्र को लेता है। प्रत्येक कॉन्फ़िग ट्रांसपोर्ट, URL, और हेडर को नामित करती है; Scrapeless कुंजी x-api-token हेडर में होती है। get_tools हैंडशेक चलाता है और टूल को LangChain टूल के रूप में लौटाता है।
python
import asyncio
import os
from langchain_mcp_adapters.client import MultiServerMCPClient
client = MultiServerMCPClient(
{
"scrapeless": {
"url": "https://api.scrapeless.com/mcp",
"transport": "streamable_http",
"headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}
}
)
async def main() -> None:
tools = await client.get_tools()
names = sorted(t.name for t in tools)
print("tool count:", len(names))
print("tools:", ", ".join(names))
asyncio.run(main())
लाइव सर्वर 21 टूल लौटाता है, केवल Scrapeless कुंजी सेट करके लोड होता है।
text
tool count: 21
tools: browser_click, browser_close, browser_create, browser_get_html, browser_get_text, browser_go_back, browser_go_forward, browser_goto, browser_press_key, browser_screenshot, browser_scroll, browser_scroll_to, browser_snapshot, browser_type, browser_wait, browser_wait_for, google_search, google_trends, scrape_html, scrape_markdown, scrape_screenshot
क्लाइंट का नाम MultiServerMCPClient है क्योंकि यह एक साथ कई MCP सर्वरों को संघबद्ध करता है; यहाँ यह एक सर्वर को पकड़े हुए है, और एक और जोड़ने का मतलब है मैपिंग में एक अन्य प्रविष्टि, न कि एजेंट में परिवर्तन। ट्रांसपोर्ट और संदेश परत मॉडल संदर्भ प्रोटोकॉल विश्लेषण का पालन करते हैं, जो JSON-RPC 2.0 विश्लेषण पर आधारित है।
एक उपकरण को कॉल करें
एक ग्राफ में वायरिंग करने से पहले हाथ से एक उपकरण को कॉल करें। प्रत्येक लोड किया गया उपकरण एक LangChain उपकरण है जिसमें ainvoke विधि है, इसलिए आप तर्क पास करते हैं और परिणाम पढ़ते हैं। एक विस्तृत जानकारी महत्वपूर्ण है: अडाप्टर सामग्री ब्लॉकों की एक सूची लौटाता है, न कि एक साधारण स्ट्रिंग, इसलिए पहले ब्लॉक से पाठ लें।
python
import asyncio
import os
from langchain_mcp_adapters.client import MultiServerMCPClient
client = MultiServerMCPClient(
{
"scrapeless": {
"url": "https://api.scrapeless.com/mcp",
"transport": "streamable_http",
"headers": {"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
}
}
)
async def main() -> None:
tools = await client.get_tools()
scrape_markdown = next(t for t in tools if t.name == "scrape_markdown")
result = await scrape_markdown.ainvoke({"url": "https://quotes.toscrape.com/"})
# langchain-mcp-adapters सामग्री ब्लॉकों की एक सूची लौटाता है; टेक्स्ट ब्लॉक लें
text = result[0]["text"] if isinstance(result, list) and result else str(result)
print("markdown chars:", len(text))
print("contains a quote:", "The world as we have created it" in text)
asyncio.run(main())
कॉल पृष्ठ को Markdown के रूप में लौटाता है, और सामग्री जाँच पुष्टि करती है कि एक वास्तविक उद्धरण उपस्थित है।
text
markdown chars: 4308
contains a quote: True
result[0]["text"] पढ़ना वह हिस्सा है जो ना-समझ कोड गलत करता है: पूरे सूची को स्ट्रिंगिफाई करने से आपको एक Python repr मिलता है जिसमें एस्केप अनुक्रम होते हैं, न कि साफ Markdown। LangChain MCP अडाप्टर गाइड पूरी तरह से क्लाइंट और परिणाम का आकार दस्तावेज करता है।
एजेंट ग्राफ बनाएं
उपकरणों के लोड होने के साथ, एजेंट एक कॉल है। create_agent एक ReAct-शैली ग्राफ बनाता है जो मॉडल और उपकरणों के बीच लूप करता है, और यह create_react_agent के लिए वर्तमान प्रतिस्थापन है। यह वह कदम है जिसे एक मॉडल-प्रदाता कुंजी की आवश्यकता है: ग्राफ मॉडल को चलाता है, और मॉडल निर्णय लेता है कि कब scrape_markdown या किसी अन्य उपकरण को कॉल करना है।
नोट: ग्राफ बनाना और चलाना एक मॉडल-प्रदाता कुंजी जैसे
OPENAI_API_KEYकी आवश्यकता होती है, जो यहाँ सेट नहीं है। 21 उपकरणों के लोडिंग और सीधेscrape_markdownकॉल ऊपर बिना इसके चलेंगे। यह ब्लॉक अपने सटीक आकार के साथ दिखाया गया है; केवल मॉडल राउंड-ट्रिप एक पूर्वापेक्षा गैप है।
python
from langchain.agents import create_agent
async def run_graph(tools) -> None:
agent = create_agent("openai:gpt-4o", tools)
result = await agent.ainvoke(
{"messages": [{"role": "user", "content": "Fetch https://quotes.toscrape.com/ with scrape_markdown and list the first three quotes with authors."}]}
)
print(result["messages"][-1].content)
प्रणाली के समय में ग्राफ प्रॉम्प्ट को मॉडल को भेजता है, मॉडल URL के साथ scrape_markdown को कॉल करता है, उपकरण Markdown लौटाता है जैसा कि सीधे कॉल ने पहले ही प्रदर्शित किया है, और मॉडल उत्तर लिखता है। उपकरण वही वस्तुएं हैं चाहे मॉडल उन्हें कॉल करे या आप करें।
निष्कर्ष
LangGraph और Scrapeless MCP सर्वर एक नंगे ग्राफ से उस पर एक छोटा रास्ता है जो लाइव वेब पढ़ता है। MultiServerMCPClient 21 उपकरणों को लोड करता है, ainvoke एक का काम करने का प्रमाण देता है और सामग्री ब्लॉकों को पढ़ने का तरीका दिखाता है, और create_agent उपकरणों को चलाने वाले ग्राफ में बदलता है। केवल वह अंतिम कदम एक मॉडल कुंजी की आवश्यकता होती है, इसलिए आप पहले पूरी उपकरण सतह को लोड और परीक्षण कर सकते हैं। ऊपर दिए गए स्क्रिप्ट से शुरू करें, ग्राफ की आवश्यकता के अनुसार उपकरणों का दायरा बनाएं, और मॉडल को संचालित होने दें।
एक मुफ्त Scrapeless खाता बनाएं एक API कुंजी प्राप्त करने के लिए, और जब आप एक आवर्ती एजेंट की योजना बनाते हैं तो Scrapeless मूल्य निर्धारण की जांच करें।
FAQ
प्र. क्या LangGraph को MCP उपकरण लोड करने के लिए एक मॉडल कुंजी की आवश्यकता है?
नहीं। MultiServerMCPClient.get_tools हैंडशेक करता है और केवल Scrapeless API कुंजी सेट करके उपकरणों को लौटाता है, और प्रत्येक उपकरण को सीधे ainvoke के साथ कॉल किया जा सकता है। एक मॉडल-प्रदाता कुंजी केवल तभी आवश्यक होती है जब आप एजेंट ग्राफ का निर्माण और चलाते हैं create_agent के साथ, क्योंकि तभी मॉडल ही यह तय करता है कि किन उपकरणों को कॉल करना है।
प्र. उपकरण का परिणाम सूची के रूप में क्यों लौटता है, न कि एक स्ट्रिंग के रूप में?
langchain-mcp-adapters हर MCP उपकरण परिणाम को सामग्री ब्लॉकों की सूची के रूप में लौटाता है, जो MCP उपकरण के आउटपुट का प्रतिनिधित्व करता है। पहले ब्लॉक से पाठ पढ़ें result[0]["text"]; पूरी सूची को स्ट्रिंगिफाई करने से आपको एक repr मिलता है जिसमें एस्केप अनुक्रम होते हैं, न कि स्वच्छ सामग्री।
प्रश्न: क्या मुझे create_react_agent या create_agent का उपयोग करना चाहिए?
langchain.agents से create_agent का उपयोग करें। create_react_agent को LangGraph 1.0 में langgraph.prebuilt से हटा दिया गया था और अब यह एक डिप्रीकेशन चेतावनी उत्पन्न करता है, इसलिए वर्तमान, चेतावनी-मुक्त मार्ग है from langchain.agents import create_agent उसी मॉडल और उपकरणों के तर्कों के साथ।
प्रश्न: अगर मेरे पास केवल एक सर्वर है तो MultiServerMCPClient का क्या उपयोग है?
यह क्लाइंट एक साथ कई MCP सर्वरों को संघीय बनाने के लिए डिज़ाइन किया गया है, लेकिन यह एक एकल सर्वर के साथ एक प्रविष्टि के मानचित्र के रूप में काम करता है। इसका उपयोग करना अब इसका मतलब है कि बाद में एक दूसरा सर्वर जोड़ना केवल कॉन्फ़िगरेशन में एक और प्रविष्टि है, एजेंट के उपकरणों का उपयोग करने के तरीके में कोई परिवर्तन नहीं है।
प्रश्न: मुझे ग्राफ को केवल कुछ उपकरण कैसे देने हैं?
get_tools एक सूची लौटाता है, इसलिए इसे create_agent को पास करने से पहले फ़िल्टर करें। ग्राफ को केवल scrape_markdown और google_search देना पूरे 21-उपकरण सेट की तुलना में अधिक सुरक्षित है जब कार्य को केवल सामग्री और खोज की आवश्यकता हो।
प्रश्न: क्या उपकरणों के माध्यम से स्क्रैपिंग लक्ष्य के नियमों द्वारा बाधित है?
हाँ। उपकरण सार्वजनिक पृष्ठों को लाते हैं, और आप प्रत्येक लक्ष्य की शर्तों का सम्मान करने के लिए जिम्मेदार रहते हैं और इसकी रोबोट्स निष्क exclusion प्रोटोकॉल दिशा-निर्देश। मात्रा को सीमित रखें और डेटा को सार्वजनिक रखें, और ग्राफ को उन उपकरणों के लिए स्कोप करें जिनकी कार्य को वास्तव में आवश्यकता है।
स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।



