একটি ওয়েব টুলকে জিরো-ডিপেন্ডেন্সি MCP সার্ভারে রূপান্তর করা
আমি DomainIntel পরিচালনা করি। এটি একটি ছোট ওয়েব অ্যাপ। আমি এটিকে একটি Model Context Protocol (MCP) সার্ভারে রূপান্তর করতে চেয়েছিলাম।
আমি চেয়েছিলাম ব্যবহারকারীরা যেন মাত্র একটি কমান্ড রান করতে পারে: npx -y @domainintel/mcp।
এর মানে হলো কোনো ঝামেলা ছাড়াই ব্যবহার করা যাবে। কোনো রিপোজিটরি ক্লোন করার প্রয়োজন নেই, কোনো দীর্ঘ ইনস্টলেশন সময় লাগবে না। সার্ভারটিকে কোনো রানটাইম ডিপেন্ডেন্সি ছাড়াই একটি সিঙ্গেল ফাইল হিসেবে কাজ করতে হবে।
নিচে দেওয়া হলো কীভাবে আমি esbuild ব্যবহার করে এটি তৈরি করেছি।
চ্যালেঞ্জ: প্যাকেজিং
আমি সবকিছু বান্ডেল করার জন্য esbuild ব্যবহার করেছি। আমাকে বেশ কিছু প্রযুক্তিগত বাধা সমাধান করতে হয়েছে:
• Static Imports: esbuild রানটাইম require কল অনুসরণ করতে পারে না। আমি createRequire থেকে স্ট্যান্ডার্ড ESM ইমপোর্টে চলে এসেছি। এটি esbuild-কে ডিপেন্ডেন্সি গ্রাফ অনুসরণ করতে সাহায্য করেছে।
• CommonJS Compatibility: একটি ডিপেন্ডেন্সি ইন্টারনালি require('net') ব্যবহার করছিল। আমি esbuild কনফিগারেশনে একটি ব্যানার (banner) যোগ করেছি। এই ব্যানারটি createRequire ইনজেক্ট করে যাতে বিল্ট-ইন মডিউলগুলোর জন্য শিম (shim) কাজ করে।
• Logger Conflicts: MCP যোগাযোগের জন্য stdout ব্যবহার করে। আমার বিদ্যমান লগারটি একটি লোকাল ডিরেক্টরিতে লেখার চেষ্টা করছিল। একটি গ্লোবাল CLI-তে এটি ব্যর্থ হয়। আমি লগারটিকে স্টাব (stub) করার জন্য একটি onResolve প্লাগইন ব্যবহার করেছি।
• Double Shebangs: আমার এন্ট্রি ফাইল এবং ব্যানার—উভয় ক্ষেত্রেই shebang ছিল। এর ফলে একটি ইনভ্যালিড ফাইল তৈরি হচ্ছিল। আমি সোর্স কোড থেকে shebang সরিয়ে ফেলেছি।
• Module Types: আমি package.json থেকে "type": "module" সরিয়ে দিয়েছি। এটি esbuild-কে CommonJS ফাইলগুলোকে ESM হিসেবে গণ্য করা থেকে বিরত রাখে। .mjs এন্ট্রি ফাইলটি এক্সটেনশন অনুযায়ী ESM হিসেবেই থাকে।
• Version Pinning: একটি ডিপেন্ডেন্সি ESM-এ চলে যাওয়ায় আমার বিল্ড ভেঙে গিয়েছিল। বান্ডেলটি পুনরায় তৈরিযোগ্য (reproducible) রাখতে আমি ভার্সনটি পিন (pin) করে দিয়েছি।
ফলাফল
চূড়ান্ত ফাইলটি হলো mcp/dist/server.mjs। এর সাইজ প্রায় ১.৭ MB। এতে কোনো রানটাইম ডিপেন্ডেন্সি নেই।
আপনি এটি Claude-এ এভাবে যোগ করতে পারেন:
claude mcp add domainintel -- npx -y @domainintel/mcp
এখন আপনার এজেন্ট "give me a full report on stripe.com" কমান্ডটি রান করতে পারবে এবং তাৎক্ষণিক ডেটা পেয়ে যাবে।
আপনার যদি কোনো কোর লজিক সমৃদ্ধ টুল থাকে, তবে সেটিকে একটি MCP সার্ভার হিসেবে র্যাপ (wrap) করে ফেলুন। এটি আপনার টুলটিকে AI এজেন্টদের জন্য উপযোগী করে তুলবে।
Source: https://dev.to/chris_morris/turning-a-web-tool-into-a-zero-dependency-mcp-server-21ca
Optional learning community: https://t.me/GyaanSetuAi
