मेरे पहले MCP सर्वर में चार घंटे लगे। इसे चालीस मिनट में हो जाना चाहिए था। बाकी का समय एक ऐसी समस्या को डीबग करने में जल गया जो असल में थी ही नहीं, क्योंकि टाइप करना शुरू करने से पहले मैंने यह समझा ही नहीं था कि MCP वास्तव में क्या है। तो चलिए मैं आपका वो दोपहर बचा देता हूं।
MCP — Model Context Protocol — बस Claude Code को नए टूल्स देने का एक तरीका है। बस इतना ही। आपका एडिटर पहले से ही Claude को फाइल एक्सेस और एक shell देता है। एक MCP सर्वर उसे और अधिक देता है: एक डेटाबेस जिसे वो क्वेरी कर सके, एक API जिसे वो कॉल कर सके, आपका Linear बोर्ड, आपका Postgres, जो भी चाहें। सर्वर अपनी अलग प्रक्रिया के रूप में चलता है। Claude एक सरल प्रोटोकॉल के ज़रिए उससे बात करता है। जब Claude को लगता है कि उसे आपके टूल की ज़रूरत है, वो उसे कॉल करता है, रिजल्ट लेता है, और आगे बढ़ता है।
यही पूरा मानसिक मॉडल है। इसे याद रखें।
अपना पहला MCP सर्वर शुरू करने से पहले आपको क्या चाहिए
Node 18 या उससे नया। एक टर्मिनल। Claude Code इंस्टॉल और काम करता हुआ। बस यही लिस्ट है। आपको Docker की ज़रूरत नहीं, क्लाउड अकाउंट की ज़रूरत नहीं, और प्रोटोकॉल के वायर फॉर्मेट को समझने की ज़रूरत नहीं — SDK यह सब संभाल लेता है।
हम एक छोटा सर्वर बनाने जा रहे हैं जो एक टूल एक्सपोज़ करेगा: किसी शहर का मौजूदा मौसम जानना। नकली डेटा, क्योंकि यहां मतलब प्लंबिंग से है, मौसम से नहीं। एक बार प्लंबिंग काम करने लगे, असली API लगाना पांच मिनट का काम है।
स्टेप 1: प्रोजेक्ट बनाएं
mkdir weather-mcp && cd weather-mcp
npm init -y
npm install @modelcontextprotocol/sdk zod
वो zod पैकेज वैकल्पिक नहीं है। MCP टूल्स को एक स्कीमा की ज़रूरत होती है ताकि Claude जान सके कि क्या आर्गुमेंट्स पास करने हैं, और zod उसे लिखने का सबसे साफ तरीका है। जब Claude हर बार बिल्कुल सही शेप पास करेगा तो आप खुद को धन्यवाद देंगे।
स्टेप 2: सर्वर लिखें
index.js बनाएं:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({ name: "weather", version: "1.0.0" });
server.tool(
"get_weather",
"Get the current weather for a city",
{ city: z.string().describe("City name, e.g. Lisbon") },
async ({ city }) => ({
content: [{ type: "text", text: `It's 22°C and sunny in ${city}.` }],
})
);
const transport = new StdioServerTransport();
await server.connect(transport);
देखें यह कितना छोटा है। एक टूल, एक स्कीमा, एक नकली रिस्पॉन्स। StdioServerTransport वाला हिस्सा वो था जिसने मुझे पहली बार पूरे एक घंटे के लिए उलझाया — इसका मतलब है कि सर्वर Claude से नेटवर्क पोर्ट के बजाय स्टैंडर्ड इनपुट और आउटपुट के ज़रिए बात करता है। इसलिए आपके सर्वर में console.log से कोई डीबगिंग नहीं होगी, क्योंकि stdout पर जो भी आप प्रिंट करते हैं वो प्रोटोकॉल स्ट्रीम को खराब कर देता है। इसके बजाय console.error प्रिंट करें। इसे अपनी याददाश्त में जला लें।
स्टेप 3: Claude Code के साथ रजिस्टर करें
Claude Code MCP सर्वर एक कॉन्फिग फाइल से पढ़ता है। सबसे आसान तरीका CLI है:
claude mcp add weather -- node /full/path/to/weather-mcp/index.js
एब्सोल्यूट पाथ इस्तेमाल करें। रिलेटिव पाथ ठीक लगती है और फिर रहस्यमय तरीके से फेल हो जाती है जब Claude किसी अलग वर्किंग डायरेक्टरी से सर्वर लॉन्च करता है। मैंने यह तीन अलग-अलग बार गलत किया है। एब्सोल्यूट पाथ। हर बार।
फिर जांचें कि यह रजिस्टर हुआ:
claude mcp list
आपको आउटपुट में weather दिखना चाहिए। अगर नहीं दिखा, तो add कमांड चुपचाप फेल हो गई — इसे फिर चलाएं और एरर पढ़ें।
स्टेप 4: वास्तव में इसे इस्तेमाल करें
किसी भी प्रोजेक्ट में Claude Code सेशन शुरू करें और पूछें:
Lisbon में मौसम कैसा है?
Claude को पहचानना चाहिए कि उसके पास एक get_weather टूल है, उसे कॉल करे, और आपके नकली रिस्पॉन्स के साथ जवाब दे। पहली बार जब यह काम करता है तो थोड़ा जादू जैसा लगता है — आपने एक अलग फाइल में एक फंक्शन लिखा और अब आपका AI असिस्टेंट उसे खुद कॉल कर सकता है।
अगर Claude टूल को कॉल नहीं करता, दस में से नौ बार डिस्क्रिप्शन बहुत अस्पष्ट होता है। "Get the current weather for a city" Claude को ठीक-ठीक बताता है कि इसे कब इस्तेमाल करना है। "Weather tool" नहीं बताता। टूल डिस्क्रिप्शन प्रॉम्प्ट होते हैं। उन्हें ऐसे लिखें जैसे आप एक नए टीम मेंबर को टूल समझा रहे हों जो यह तय करेगा कि इसे कब इस्तेमाल करना है।
तीन चीज़ें जो आपको ठोकर खिलाएंगी
Stdout प्रदूषण। पहले भी कहा, फिर कह रहा हूं, क्योंकि यह पहले सर्वर की नंबर एक बग है। कोई console.log नहीं। कभी नहीं। प्रोटोकॉल stdout पर रहता है।
पुरानी प्रक्रिया। अगर आप index.js एडिट करते हैं, Claude उसे हॉट-रीलोड नहीं करेगा। अपना Claude Code सेशन रिस्टार्ट करें ताकि वो सर्वर को फिर से लॉन्च करे। मैंने एक बार बीस मिनट यह सोचते हुए बिताए कि मेरा कोड बदलाव काम नहीं कर रहा जब असल में मैं पुराना वर्शन चला रहा था।
स्कीमा मिसमैच। अगर आपका zod स्कीमा कहता है city ज़रूरी है और Claude कुछ भी पास नहीं करता, आपको एक उलझाने वाला एरर मिलता है। वैकल्पिक चीज़ों को .optional() से सही में वैकल्पिक बनाएं, और हर फील्ड को .describe() दें ताकि Claude जान सके वहां क्या जाना चाहिए।
खिलौने से असली की ओर
अब मज़ेदार हिस्सा। वो नकली मौसम स्ट्रिंग? फंक्शन बॉडी को एक असली मौसम API पर असली fetch से बदल दें। स्कीमा, रजिस्ट्रेशन, Claude के कॉल करने का तरीका — इनमें से कुछ नहीं बदलता। आपने पहले से ही मुश्किल हिस्सा बना लिया है।
यही वो बात है जो MCP के बारे में कोई नहीं बताता: पहला सर्वर 90% सीखने का काम है। उसके बाद हर सर्वर बीच में एक अलग फंक्शन के साथ वही पांच स्टेप्स होते हैं। चाहते हैं कि Claude आपका डेटाबेस क्वेरी करे? वही पैटर्न। अपनी कंपनी का इंटरनल API हिट करें? वही पैटर्न। अपना Notion पढ़ें? आप समझ गए।
आज रात यह वेदर सर्वर बनाएं। अगर आप मेरी चार घंटे की भटकन छोड़ दें तो चालीस मिनट लगेंगे। फिर कल, वो बनाएं जिसकी आपको वास्तव में ज़रूरत है।
