স্প্রিং এআই-র জগতে এলএলএমকে শুধু প্রম্পট করেই থামতে হয় না—বাস্তব ডাটাবেস, রেস্ট এপিআই অথবা ফাইল সিস্টেমের সাথে যুক্ত করে দিতে পারলে মডেলের শক্তি বহুগুণ বেড়ে যায়। এই সংযোগের মূল চাবিকাঠি হলো মডেল কনটেক্সট প্রোটোকল (MCP)। অ্যানথ্রপিকের তৈরি ওপেন স্ট্যান্ডার্ড হিসেবে MCP মডেল ও টুলের মধ্যে একটি ইউনিফাইড যোগাযোগ স্তর গড়ে দেয়। আপনি যদি স্প্রিং বুট অ্যাপ্লিকেশনের ভেতরেই একটি পূর্ণাঙ্গ MCP সার্ভার বা ক্লায়েন্ট তৈরি করতে চান, তবে স্প্রিং এআই সেই পথকে করে তোলে অসাধারণ সহজ। এ লেখায় আমরা MCP-র ভিত্তি, স্প্রিং এআই-এর মাধ্যমে বাস্তবায়ন, টুল ডেভেলপমেন্ট এবং প্রোডাকশন-উপযোগী কিছু বেস্ট প্র্যাকটিস একসাথে দেখব।

MCP কী এবং কেন এটি জরুরি

একটি বড় ভাষা মডেল যতই শক্তিশালী হোক, নিজে থেকে কোনো ডাটাবেসে কোয়েরি করতে পারে না অথবা লোকাল ফাইল পড়তে পারে না। MCP এই সীমাবদ্ধতাটি দূর করে মডেলকে স্ট্যান্ডার্ড টুল ইন্টারফেস দেয়, যার মাধ্যমে মডেল বাহ্যিক ডাটা ফেচ করা, এপিআই কল করা বা অন্য যেকোনো অ্যাকশন সম্পাদন করার সক্ষমতা অর্জন করে। স্প্রিং এআই এই প্রোটোকলকে নিজের অটো-কনফিগারেশনের আওতায় এনে দিয়েছে, তাই স্প্রিং ডেভেলপাররা প্রায় কোনো বয়লারপ্লেট ছাড়াই MCP ইকোসিস্টেমে প্রবেশ করতে পারেন।

MCP জরুরি কেন, তার মূল কারণগুলো হলো:

  • ডাইনামিক কনটেক্সট: মডেল রিয়েল-টাইম ওয়েদার, স্টক প্রাইস বা অভ্যন্তরীণ ডাটাবেসের তথ্য টেনে আনতে পারে।
  • টুল অ্যাগনস্টিক: একটি MCP সার্ভার একাধিক ক্লায়েন্ট (যেকোনো এআই প্ল্যাটফর্ম) থেকে ব্যবহৃত হতে পারে, ফলে টুল রিইউজেবিলিটি বাড়ে।
  • সিকিউরিটি বাউন্ডারি: টুলগুলো সার্ভার সাইডে রান হয়; মডেল শুধু অনুরোধ করে, ডাটাবেস ক্রেডেনশিয়াল কখনো মডেলের হাতে যায় না।
  • এজেন্ট ওয়ার্কফ্লো: মডেল একাধিক MCP টুল চেইনিং করে জটিল কাজ যেমন “আজকের ডেটা জেনারেট করে ইমেইল করো” সম্পন্ন করতে পারে।

স্প্রিং এআই-তে MCP ইন্টিগ্রেশন

স্প্রিং এআই MCP-র জন্য দুটি মূল স্টার্টার সরবরাহ করে: spring-ai-mcp-server-spring-boot-starter (যখন আপনার অ্যাপ টুল সরবরাহ করবে) এবং spring-ai-mcp-client-spring-boot-starter (যখন অ্যাপ বহিরাগত MCP টুল ব্যবহার করবে)। আপনার pom.xml বা build.gradle-এ শুধু প্রয়োজনীয় ডিপেন্ডেন্সি যোগ করলেই অটো-কনফিগারেশন সব ব্যবস্থা করে নেয়।

MCP সার্ভার সাইডে কাজ করতে চাইলে আপনাকে একটি কনফিগারেশন নির্ধারণ করতে হবে — সাধারণত application.yml-এই সব তথ্য দেওয়া যায়:

spring:
  ai:
    mcp:
      server:
        name: weather-tool-server
        version: 1.0.0
        transport: sse
        sse:
          endpoint: /mcp/sse
          message-endpoint: /mcp/messages

উপরের কনফিগ বলছে যে সার্ভার SSE (Server-Sent Events) ট্রান্সপোর্ট ব্যবহার করবে এবং নির্দিষ্ট এন্ডপয়েন্ট খুলবে। এক্ষেত্রে একটি ওপেন HTTP চ্যানেল তৈরি হবে, যেখানে MCP ক্লায়েন্ট সংযুক্ত হতে পারবে। প্রোডাকশনে আপনি সহজেই transport: stdio ব্যবহার করতে পারেন, বিশেষত লোকাল প্রসেস-বেজড ইন্টিগ্রেশনের জন্য।

এবার একটি টুল বিন তৈরি করা যাক:

import org.springframework.ai.mcp.server.McpServerSupport;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Component;

@Component
public class WeatherTool extends McpServerSupport {

    public WeatherTool(McpServerConfig config) {
        super(config);
    }

    @Tool(description = "নির্দিষ্ট শহরের বর্তমান আবহাওয়া রিটার্ন করে")
    public String getCurrentWeather(
            @ToolParam(description = "শহরের নাম") String city) {
        // ডামি ইমপ্লিমেন্টেশন — বাস্তবে একটি ওয়েদার API কল হবে
        return "ঢাকা: ৩২°C, রৌদ্রোজ্জ্বল";
    }
}

এখানে @Tool অ্যানোটেশনটিই পুরো জাদু — এটি মেথডটিকে MCP টুল হিসেবে রেজিস্টার করে এবং মডেলের কাছে টুলের স্কিমা প্রকাশ করে। ক্লায়েন্ট সংযুক্ত হলে টুলটির নাম ও প্যারামিটার ইনফারেন্স স্বয়ংক্রিয়ভাবে প্রেরণ করা হয়, কোনো ম্যানুয়াল JSON স্কিমা লেখার দরকার পড়ে না।

MCP ক্লায়েন্ট তৈরি ও টুল ব্যবহার

এবার যে অ্যাপ্লিকেশন টুল “ব্যবহার” করবে, সেখানে ক্লায়েন্ট স্টার্টার দিয়ে MCP সার্ভারের লোকেশন জানিয়ে দিলেই হয়:

spring:
  ai:
    mcp:
      client:
        mcp-servers:
          weather-service:
            transport: sse
            url: http://localhost:8080/mcp/sse

স্প্রিং এআই এই কনফিগারেশন দেখে McpClient বিন তৈরি করে নেয় এবং ToolCallbackProvider রেজিস্টার্ড টুলগুলোর একটি ইউনিফাইড ভিউ দেয়। চ্যাট ক্লায়েন্ট থেকে টুল এক্সিকিউশনের জন্য আপনি সরাসরি ToolCallingManager ব্যবহার করতে পারেন:

@RestController
public class ChatController {

    private final ToolCallingManager toolCallingManager;

    public ChatController(ToolCallingManager toolCallingManager) {
        this.toolCallingManager = toolCallingManager;
    }

    @GetMapping("/ask")
    public String ask(@RequestParam String question) {
        return toolCallingManager.call(question);
    }
}

কলের সময় মডেল দেখতে পায় যে একটি getCurrentWeather টুল অ্যাক্সেসেবল, প্রয়োজন বুঝলে সেটি প্যারামিটার দিয়ে কল করে এবং রেজাল্টের ভিত্তিতে ফাইনাল উত্তর তৈরি করে। এভাবেই আপনি কয়েক লাইন কোডের মধ্যে একটি এআই এজেন্ট তৈরি করতে পারেন, যার হাতে আছে রিয়েল-ওয়ার্ল্ড ডাটা।

কনফিগারেশন ও বেস্ট প্র্যাকটিস

MCP সার্ভারকে প্রোডাকশন-রেডি করতে কয়েকটি গুরুত্বপূর্ণ অনুশীলন মেনে চলা উচিত:

  • সিকিউরিটি অগ্রাধিকার: SSE এন্ডপয়েন্টকে সর্বজনীন খোলা রাখবেন না। Spring Security দিয়ে JWT বা API-Key ভিত্তিক অথেনটিকেশন যোগ করুন। মিনিমাম, HttpSecurity কনফিগ করে নির্দিষ্ট রোল চেক করে নিন।
  • এরর হ্যান্ডলিং: টুল মেথড থেকে চেক্ড/আনচেক্ড এক্সেপশন সরাসরি ক্লায়েন্টে না দিয়ে একটি স্ট্রাকচার্ড JSON উত্তর ফেরত দিন, যেমন {"error": "সার্ভিস সাময়িকভাবে অনুপলব্ধ"}@Tool এর ভিতরে ট্রাই-ক্যাচ ব্লক ব্যবহার করা ভালো।
  • ইনপুট ভ্যালিডেশন: @ToolParam-এর মাধ্যমে টাইপ সেফটি পান, তবে দরকারি কনস্ট্রেইন্টগুলো jakarta.validation অ্যানোটেশন দিয়ে স্পষ্ট করে দিন (@NotBlank, @Size)। এতে মডেল সঠিক আর্গুমেন্ট না দিলে দ্রুত ফেইল হয়।
  • টুল ডিজাইন ছোট ও নির্দিষ্ট করুন: একটি টুল যেন শুধু একটি কাজ করে এবং তার বর্ণনা পরিষ্কার হয়। মডেল বিভ্রান্ত হয়ে মাল্টিপল অপারেশন মিশিয়ে ফেলতে পারে, তাই “এক টুল — এক দায়িত্ব” নীতি মেনে চলুন।
  • মনিটরিং ও লগিং: spring.ai.mcp প্যাকেজের জন্য DEBUG লেভেল লগিং অ্যাক্টিভ করলে টুল কল, রেসপন্স ও টাইমিং দেখতে পাবেন। এলার্টিং সিস্টেমের সাথে জুড়ে দিয়ে টুল ফেইলর মনিটর করুন।
  • ট্রান্সপোর্ট বাছাই: লোকাল ডেভেলপমেন্ট ও একক সার্ভিসে stdio দ্রুত ও নিরাপদ। মাইক্রোসার্ভিস আর্কিটেকচারে SSE বা WebSocket (ভবিষ্যৎ ভার্সন) বেছে নিন এবং লোড ব্যালেন্সার কনফিগারেশনে স্টিকি সেশন বিবেচনা করুন।

সারসংক্ষেপ

MCP কেবল একটি প্রোটোকল নয় — এটি স্প্রিং এআই-এর এক্সটার্নাল টুলিং ইকোসিস্টেমের মেরুদণ্ড। স্প্রিং বুটের ডিক্লারেটিভ কনফিগারেশন ও @Tool-ভিত্তিক প্রোগ্রামিং মডেল দিয়ে আপনি ঘণ্টার বদলে মিনিটেই একটি কার্যকরী MCP সার্ভার বা ক্লায়েন্ট দাঁড় করাতে পারেন। যখনই আপনার এআই মডেলের ডাটাবেস কোয়েরি করা, ফাইল প্রসেস করা বা তৃতীয় পক্ষের এপিআই কল করা দরকার, তখন স্প্রিং এআই-তে MCP হয়ে ওঠে সবচেয়ে স্বাভাবিক ও শক্তিশালী সমাধান। বেস্ট প্র্যাকটিসগুলো মেনে চললে নিরাপদ, স্কেলেবল ও রেসপন্সিভ এজেন্ট সহজেই বাস্তবায়ন করা যায়।

Share