مقامی AI ایجنٹوں کے لیے FastMCP کا استعمال کرتے ہوئے MCP سرور کیسے بنایا جائے۔

اس ٹیوٹوریل میں، ہم آپ کو دکھائیں گے کہ FastMCP کا استعمال کرتے ہوئے MCP سرور کیسے بنایا جائے، مقامی MCP سرور کے ٹولز کا استعمال کریں جو آپ نے مقامی AI ایجنٹ کو منسلک کرکے بنایا ہے، اور ریموٹ MCP سرورز کے لیے سپورٹ شامل کریں۔ ہم ہر چیز کو LangChain v1، Ollama، Qwen، اور Python کے ساتھ جوڑیں گے۔

ماڈل سیاق و سباق پروٹوکول (MCP) AI ایجنٹوں اور ٹولز کے درمیان ایک مشترکہ زبان ہے۔ یہ AI ایجنٹوں کو ٹولز کو بے نقاب کرنے کا معیاری طریقہ ہے۔

چونکہ MCP LLM اور AI ایجنٹوں کو ان صلاحیتوں کو براہ راست دریافت کرنے اور استعمال کرنے کا معیاری طریقہ فراہم کرتا ہے، اس لیے مزید کمپنیاں اپنے موجودہ APIs کے ساتھ ساتھ MCP سرورز کو بے نقاب کرنا شروع کر رہی ہیں۔

انڈیکس

پس منظر

بہت سے سادہ مقامی AI ایجنٹ ٹولز کو براہ راست اسی Python اسکرپٹ میں ایجنٹ کے طور پر بیان کرتے ہیں۔ یہ ایجنٹ سے ایجنٹ میں مختلف ہوتا ہے، اور ہر نئے ایجنٹ کو شروع سے وہی ٹولز دوبارہ لاگو کرنا ہوں گے۔

MCP ٹول کو ایک معیاری انٹرفیس فراہم کر کے اس میں بہتری لاتا ہے جسے کوئی بھی MCP سے مطابقت رکھنے والا کلائنٹ استعمال کر سکتا ہے۔ آپ اپنے ٹولز کو ایک بار MCP سرور کے طور پر لکھ سکتے ہیں اور انہیں کسی بھی مطابقت پذیر کلائنٹ پر دوبارہ استعمال کر سکتے ہیں۔ چونکہ MCP ایک نیٹ ورک پروٹوکول ہے، ان ٹولز کو آپ کے کمپیوٹر پر چلنے کی بھی ضرورت نہیں ہے۔ کوئی اور MCP سرور کی میزبانی کر سکتا ہے اور ایجنٹ ٹولز کو اسی طرح استعمال کر سکتے ہیں جس طرح وہ مقامی ٹولز استعمال کرتے ہیں۔

اس ٹیوٹوریل کی پیروی کرنے کے لیے آپ کو اپنے کمپیوٹر پر اولاما انسٹال کرنے کی ضرورت ہوگی۔ یہ ٹیوٹوریل macOS، Windows اور Linux پر کام کرتا ہے۔ میں 32GB RAM کے ساتھ MacBook Pro استعمال کر رہا ہوں، لیکن اگر آپ Ollama کے چھوٹے Qwen ماڈل کا انتخاب کرتے ہیں تو آپ اسے کم میموری سسٹم پر چلا سکتے ہیں۔

MCP کیا ہے؟

ماڈل سیاق و سباق پروٹوکول (MCP) ایک کھلا پروٹوکول ہے جو LLM کلائنٹس کے لیے ٹولز، وسائل اور اشارے کو ظاہر کرتا ہے۔

جس طرح REST نے بہت سے ویب APIs کو معیاری بنایا، اسی طرح MCP AI ٹولز کے لیے ایک معیاری پروٹوکول ہے۔ ہر فریم ورک کا اپنا ٹول انٹرفیس بنانے کے بجائے، MCP ایک مشترکہ انٹرفیس کی وضاحت کرتا ہے، اور کوئی بھی فریم ورک جو پروٹوکول کو سمجھتا ہے وہ MCP-مطابقت پذیر سرور کے ذریعہ فراہم کردہ ٹولز کا استعمال کرسکتا ہے۔

modelcontextprotocol.io سے نیچے دی گئی تصویر اس خیال کو اچھی طرح پکڑتی ہے۔

MCP سرور ایک چھوٹا پروگرام ہے جو ٹولز کی فہرست دکھاتا ہے۔ ایک MCP کلائنٹ وہ چیز ہے جو اس سرور سے جڑتی ہے (جیسے ایک AI ایجنٹ) اور LLM کو اپنے ٹولز کو کال کرنے کی اجازت دیتی ہے۔

MCP سرورز عام طور پر نقل و حمل کے ذریعے سامنے آتے ہیں جیسے:

  • سٹوڈیو: سرور کلائنٹ کے ذیلی عمل کے طور پر چلتا ہے اور stdin/stdout کے ذریعے بات چیت کرتا ہے۔ مقامی ٹولز کے لیے بہترین موزوں ہے جن کی صرف ایجنٹ کو ضرورت ہے۔

  • http: سرور ایک HTTP سروس کے طور پر چلتا ہے اور کلائنٹ نیٹ ورک پر جڑ جاتے ہیں۔ مشترکہ یا ریموٹ ٹولز کے لیے بہترین موزوں۔

پروٹوکول معیاری بناتے ہیں کہ کس طرح ٹولز کو بے نقاب کیا جاتا ہے تاکہ مختلف AI ایجنٹس اور کلائنٹس انہیں مستقل طور پر استعمال کر سکیں۔

FastMCP کیا ہے؟

FastMCP ایک Python لائبریری ہے جو MCP سرور کو لکھنے کو FastAPI ایپ لکھنے کی طرح محسوس کرتی ہے۔ آپ تقریب کو سجاتے ہیں @mcp.toolFastMCP پروٹوکول کی تفصیلات کو ہینڈل کرتا ہے، بشمول ٹرانسپورٹ کی تہہ، JSON-RPC پیغامات کے لیے ٹول اسکیما کی تخلیق، اشارے ٹائپ، اور دستاویز کے تار۔

لینگ چین کی طرف، langchain-mcp-adapters ایک لائبریری جو ایک یا زیادہ MCP سرورز سے منسلک ہوتی ہے اور اپنے ٹولز کو LangChain v1 فارمیٹ میں لوڈ کرتی ہے۔ create_agent آپ اسے براہ راست استعمال کر سکتے ہیں۔ ایجنٹ کوڈ یہ نہیں جانتا کہ یہ ٹول آپ کے کمپیوٹر پر سب پروسیس میں ہے یا ریموٹ سرور پر۔ آپ کو صرف ان ٹولز کی فہرست نظر آئے گی جس میں ان کے نام اور تفصیل ہوگی۔

حوصلہ افزائی اور فن تعمیر

اس پروجیکٹ کے پیچھے محرک قابل اشتراک ٹولز بنانا اور دوسروں کے ذریعہ پہلے سے بنائے گئے ٹولز کو دوبارہ استعمال کرنا ہے۔ میں نے کرنٹ_ٹائم اور ورڈ_کاؤنٹ جیسے ٹولز بنائے ہیں اور اپنے بنائے ہوئے تمام ایجنٹوں میں ان کا اشتراک کرنا چاہتا ہوں۔ میں عوامی ایم سی پی سرور کے ٹولز کو ان خصوصیات کے لیے بھی استعمال کرنا چاہتا تھا جو میں خود نہیں لکھنا چاہتا تھا، جیسے کہ گٹ ہب ریپوزٹری کو نیویگیٹ کرنا۔

مقامی LLM استعمال کرنے کا مطلب ہے کہ میری گفتگو میرے کمپیوٹر کو کبھی نہیں چھوڑتی ہے۔ صرف وہی چیز جو نیٹ ورک کو متاثر کرتی ہے وہ ہے جو ماڈل ریموٹ ٹول کو بھیجنے کا فیصلہ کرتا ہے اور جب وہ اس ٹول کو کال کرنے کا فیصلہ کرتا ہے۔

اس پروجیکٹ میں، ہم دو ٹولز کے ساتھ ایک مقامی MCP سرور بنانے کے لیے FastMCP کا استعمال کرتے ہیں، GitHub ریپوزٹری تلاش کے لیے DeepWiki کے مفت پبلک MCP سرور سے منسلک ہوتے ہیں، LangChain v1 ایجنٹ کو لوڈ کرنے کے لیے langchain-mcp-اڈاپٹر استعمال کرتے ہیں، اور Ollama کو مقامی Qwen ماڈل چلانے کے لیے استعمال کرتے ہیں۔

بہاؤ میں تین عمل ہیں:

  1. مقامی MCP سرور ایک اسٹینڈ ایلون Python اسکرپٹ ہے جو موجودہ_وقت اور لفظ_کاؤنٹ کو ظاہر کرتا ہے۔ یہ stdio کے ذریعے ایجنٹ کے ذیلی عمل کے طور پر چلتا ہے۔

  2. ریموٹ MCP سرور DeepWiki کی ایک عوامی خدمت ہے جو HTTP پر GitHub ریپوزٹری کے بارے میں سوالات پوچھنے کے لیے تین ٹولز (read_wiki_structure, read_wiki_contents, Ask_question) کو بے نقاب کرتی ہے۔

  3. ایجنٹ ایک کوآرڈینیشن اسکرپٹ ہے جو دونوں سے جڑتا ہے، ٹولز کو ایک فہرست میں ضم کرتا ہے، اور ایک انٹرایکٹو لوپ چلاتا ہے۔

جب صارف کوئی سوال پوچھتا ہے، تو ماڈل دونوں سرورز پر موجود تمام ٹولز کو ایک فہرست میں دیکھتا ہے اور مطلوبہ ٹول کا انتخاب کرتا ہے۔

مرحلہ 1: اولاما انسٹال کریں اور ماڈلز درآمد کریں۔

شروع کرنے کے لیے، اپنے پلیٹ فارم کے لیے Ollama ایپلیکیشن انسٹال کریں۔

ہم Qwen کو اپنے چیٹ ماڈل کے طور پر استعمال کریں گے۔ Qwen مقامی ٹول انووکیشن سپورٹ فراہم کرتا ہے، لہذا یہ MCP ٹولز کے ساتھ اچھی طرح کام کرتا ہے۔ میں qwen3.5:4b استعمال کر رہا ہوں۔ اگر آپ کے کمپیوٹر میں کم ریم ہے، تو آپ qwen3.5:0.8b استعمال کر سکتے ہیں۔

ollama pull qwen3.5:4b

مرحلہ 2: ازگر پر انحصار انسٹال کریں۔

python3 -m venv venv
source venv/bin/activate
pip install fastmcp langchain langchain-core langchain-ollama langchain-mcp-adapters

اس ٹیوٹوریل میں langchain>=1.0.0.

مرحلہ 3: FastMCP کا استعمال کرتے ہوئے ایک مقامی MCP سرور بنائیں

مقامی MCP سرور دو چھوٹے یوٹیلیٹی ٹولز فراہم کرتا ہے: موجودہ تاریخ اور وقت کا تعین کرنے کے لیے current_time، اور متن میں الفاظ کی تعداد گننے کے لیے word_count۔ کوئی بھی MCP کلائنٹ، نہ صرف یہ ایجنٹ، اسے استعمال کر سکتا ہے۔

Docstring کی نمائندگی اہم ہے کیونکہ FastMCP قسم کے اشارے اور docstrings سے ہر ٹول کے لیے خود بخود اسکیما تیار کرتا ہے۔ LLM اس کی جانچ کرتا ہے جب یہ فیصلہ کرتا ہے کہ آیا ہر ٹول کو استعمال کرنا ہے۔

کوڈ mcp_server.py فائل

from datetime import datetime
from fastmcp import FastMCP

mcp = FastMCP("local-tools")


@mcp.tool
def current_time() -> str:
    """Return the current local date and time.
    Use this when the user asks what time or date it is.
    """
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")


@mcp.tool
def word_count(text: str) -> int:
    """Count the number of words in a piece of text.
    Use this when the user asks how long a piece of writing is
    or asks you to count the words in something they've shared.
    Returns the word count as an integer.
    """
    return len(text.split())


if __name__ == "__main__":
    # Run the MCP server over stdio.
    mcp.run()

اس کے بعد tools_server.py یہ stdio موڈ میں ایک ذیلی عمل کے طور پر چلتا ہے، لہذا اسے الگ سے شروع کرنے کی ضرورت نہیں ہے۔ ایجنٹ خود بخود چلتا ہے۔

مرحلہ 4: ایجنٹ پائتھن کوڈ

ایجنٹ کوڈ تین چیزیں کرتا ہے: پہلی، اوپر کی ترتیب ریموٹ MCP سرور کے ماڈل، سسٹم پرامپٹ، اور URL کی وضاحت کرتی ہے۔ کہ build_agent() فنکشن دو MCP سرورز سے جڑتا ہے، ان کے ٹولز کو ایک فہرست میں لوڈ کرتا ہے، اور پھر ایک LangChain v1 ایجنٹ بناتا ہے۔ کہ main() فنکشن ایک انٹرایکٹو لوپ چلاتا ہے۔

کہ [tool call] لاگ لائن آپ کو یہ دیکھنے دیتی ہے کہ ہر موڑ پر کون سا ٹول (مقامی یا ریموٹ) ایجنٹ کو منتخب کیا گیا ہے۔

آخر کار await اس لیے استعمال کیا جاتا ہے۔ build_agent(client) یہ متضاد ہے۔ آپ کو درج ذیل غیر مطابقت پذیر MCP آپریشنز کا انتظار کرنا چاہیے: client.get_tools() مکمل شدہ ایجنٹ کو واپس کرنے سے پہلے۔ بغیر awaitایک حقیقی ایجنٹ کے بجائے، آپ کو ایک کورٹین آبجیکٹ ملتا ہے۔

کوڈ ایجنٹ_کے ساتھ_mcp.py فائل:

import asyncio

from langchain.agents import create_agent
from langchain_ollama import ChatOllama
from langchain_mcp_adapters.client import MultiServerMCPClient

# Local Ollama model to use for the chat agent.
CHAT_MODEL = "qwen3.5:4b"

# Hosted remote MCP server we'll connect to over HTTP.
DEEPWIKI_MCP_URL = "https://mcp.deepwiki.com/mcp"

# System prompt that tells the model what tools it has and how to behave.
SYSTEM_PROMPT = (
    "You are a helpful assistant with access to tools for checking the current time, "
    "counting words, and looking up information about GitHub repositories. "
    "Use tools when the user's request needs information you don't already have. "
    "If a tool returns an error, tell the user plainly and do not retry with made-up arguments. "
    "If the question doesn't need a tool, just answer directly."
)


async def build_agent(client: MultiServerMCPClient):
    # Load tools from all connected MCP servers.
    # This is async because MCP communication happens over I/O.
    tools = await client.get_tools()
    print(f"Loaded {len(tools)} tools: {[t.name for t in tools]}")

    # Create the local Ollama chat model.
    model = ChatOllama(model=CHAT_MODEL, temperature=0)

    # Build a LangChain agent with the local model and all MCP tools.
    return create_agent(
        model=model,
        tools=tools,
        system_prompt=SYSTEM_PROMPT,
    )


async def main():
    # Create one MCP client that connects to two servers:
    #
    # 1. "tools" is a local MCP server started as a subprocess over stdio.LangChain will launch `python mcp_server.py` for us.
    # 2. "deepwiki" is a hosted MCP server we connect to over HTTP.
    client = MultiServerMCPClient({
        "tools": {
            "command": "python",
            "args": ["mcp_server.py"],
            "transport": "stdio",
        },
        "deepwiki": {
            "url": DEEPWIKI_MCP_URL,
            "transport": "streamable_http",
        },
    })

    # Build the agent after the MCP client is ready and tools are loaded.
    agent = await build_agent(client)

    print("nReady! Ask the agent something.")
    print("Type 'exit' to quit.n")

    while True:
        question = input("You: ").strip()
        if not question or question.lower() in {"exit", "quit"}:
            break

        # Send the user's message to the agent.
        # We use `ainvoke()` because the agent may call async MCP tools.
        result = await agent.ainvoke({
            "messages": [{"role": "user", "content": question}],
        })

        # Walk through the returned messages and print any tool calls
        # the agent made during this turn.
        for msg in result["messages"]:
            tool_calls = getattr(msg, "tool_calls", None)
            if tool_calls:
                for call in tool_calls:
                    print(f"[tool call] {call['name']}({call['args']})")

        # The final message in the list is the agent's final answer.
        print(f"nAnswer: {result['messages'][-1].content}n")


if __name__ == "__main__":
    # Run the async program.
    asyncio.run(main())

مرحلہ 5: ایجنٹ کو چلائیں۔

python agent_with_mcp.py

مقامی MCP سرور کو براہ راست شروع کرنے کی ضرورت نہیں ہے۔ MultiServerMCPClient آگ mcp_server.py ذیلی عمل کے طور پر stdioیہ DeepWiki سے HTTP کنکشن بھی کھولتا ہے۔ اگر کوئی بھی سرور ناقابل رسائی ہے، تو خودکار فال بیک کی بجائے سٹارٹ اپ کے دوران ایک خرابی ظاہر ہوتی ہے۔

ایجنٹ کے چلنے کے بعد، آپ سادہ انگریزی میں سوالات پوچھ سکتے ہیں۔ جواب پر بھروسہ کرنے سے پہلے، اس بات کو یقینی بنانے کے لیے کہ ایجنٹ نے صحیح دلائل کے ساتھ صحیح ٹول کا انتخاب کیا ہے۔ مقامی ماڈلز میزبان فرنٹیئر ماڈلز کے مقابلے میں چھوٹے اور زیادہ فریب ہوتے ہیں۔ سائٹ پر تصدیق مددگار ہے۔

ٹیسٹ رن کے طور پر، ہم نے ایجنٹوں سے درج ذیل سوالات پوچھے:

$ python agent_with_tools.py

Starting MCP server 'local-tools' with transport 'stdio'                                                      transport.py:210
Loaded 5 tools: ['current_time', 'word_count', 'read_wiki_structure', 'read_wiki_contents', 'ask_question']

Ready! Ask the agent something.
Type 'exit' to quit.

You: what is the current time
[tool call] current_time({})

Answer: The current time is 2026-07-01 16:41:42

You: Give me one line summary of karpathy/nanochat 
[tool call] ask_question({'repoName': 'karpathy/nanochat', 'question': 'Give me a one-line summary of this repository'})

Answer: This repository, `karpathy/nanochat`, is a minimal, full-stack experimental system for training large language models (LLMs) from scratch, designed to be accessible and cost-effective, with a primary development focus on optimizing the "Time-to-GPT-2" benchmark.

You: what's the capital of France?

Answer: Paris

ایجنٹ نے 4B مقامی ماڈل کے لیے معقول کارکردگی کا مظاہرہ کیا۔ اسے بلایا گیا تھا current_time ہم نے ٹائم سوالات کے لیے ٹولز کا استعمال کیا اور DeepWiki پر ریموٹ ڈیوائسز تک رسائی حاصل کی۔ ask_question نانو چیٹ ریپو کے بارے میں سوالات کے جوابات دینے کا ایک ٹول۔ میں نے فرانسیسی سوال کے لیے ٹول کال کو بھی مکمل طور پر چھوڑ دیا۔

آپ MCP سرور رجسٹری میں مزید MCP سرورز تلاش کر سکتے ہیں: https://github.com/modelcontextprotocol/servers۔

نتیجہ

اس ٹیوٹوریل میں، ہم نے FastMCP کا استعمال کرتے ہوئے ایک MCP سرور بنایا اور ایک مفت، عوامی ریموٹ MCP سرور اور LangChain v1 کا استعمال کرتے ہوئے ایک مقامی AI ایجنٹ سے منسلک کیا۔ create_agent اور langchain-mcp-adapters.

یہاں سے، اپنے مقامی سرور میں دیگر مقامی خصوصیات کے لیے نوٹ ریڈرز یا ریپر جیسے ٹولز شامل کرنے کی کوشش کریں۔ ایجنٹ کو دوسرے ریموٹ MCP سرور کی طرف اشارہ کریں۔ متبادل طور پر، آپ ٹرانسپورٹ کو HTTP میں تبدیل کر سکتے ہیں اور اسے ایک چھوٹے سرور پر چلا سکتے ہیں، اپنے مقامی سرور کو ایک ریموٹ سرور میں تبدیل کر سکتے ہیں جسے آپ اپنے کسی بھی ڈیوائس پر استعمال کر سکتے ہیں یا دوسروں کے استعمال کے لیے اسے شائع بھی کر سکتے ہیں۔ مبارک ہو ٹنکرنگ!

اگر آپ کو یہ سبق پسند آیا ہے، تو آپ میرے بلاگ پر میری مزید تحریریں (حالیہ پوسٹس میں سسٹمز ڈیزائن پیپرز سیریز شامل ہیں)، میری ذاتی ویب سائٹ پر میرا کام، اور LinkedIn پر اپ ڈیٹس حاصل کر سکتے ہیں۔

Scroll to Top