India Services Integration Hub
Working MCP server examples for platforms Indian teams actually use day to day — built against the official Razorpay and Zoho SDKs/APIs, using the real @modelcontextprotocol/sdk. Every code sample on this page is a complete, runnable server, not a stub.
Razorpay
PaymentsRazorpay is one of the most widely used payment gateways for Indian businesses, supporting UPI, cards, netbanking, and wallets. A minimal MCP server exposes order creation and payment lookup as tools an AI agent can call.
Authentication
HTTP Basic Auth using your Razorpay key_id and key_secret. Always start with test-mode keys (prefixed rzp_test_).
Server Code
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import Razorpay from "razorpay";
const razorpay = new Razorpay({
key_id: process.env.RAZORPAY_KEY_ID!,
key_secret: process.env.RAZORPAY_KEY_SECRET!,
});
const server = new McpServer({ name: "razorpay-mcp", version: "1.0.0" });
server.tool(
"create_order",
"Create a Razorpay payment order",
{
amountInPaise: z.number().describe("Amount in paise (e.g. 50000 = INR 500)"),
currency: z.string().default("INR"),
receipt: z.string(),
},
async ({ amountInPaise, currency, receipt }) => {
const order = await razorpay.orders.create({
amount: amountInPaise,
currency,
receipt,
});
return { content: [{ type: "text", text: JSON.stringify(order) }] };
}
);
server.tool(
"get_payment",
"Fetch a Razorpay payment by ID",
{ paymentId: z.string() },
async ({ paymentId }) => {
const payment = await razorpay.payments.fetch(paymentId);
return { content: [{ type: "text", text: JSON.stringify(payment) }] };
}
);
const transport = new StdioServerTransport();
await server.connect(transport);Zoho CRM
SaaS / CRMZoho CRM is a widely used CRM platform among Indian SMBs and enterprises. It authenticates via OAuth 2.0 with a refresh token, and its REST API is region-specific — accounts created in the India data center use zohoapis.in, not .com.
Authentication
OAuth 2.0 refresh-token flow. Exchange your refresh token for a short-lived access token before each session, then send it as an Authorization: Zoho-oauthtoken header.
Server Code
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const ZOHO_ACCOUNTS_URL = process.env.ZOHO_ACCOUNTS_URL ?? "https://accounts.zoho.in";
const ZOHO_API_URL = process.env.ZOHO_API_URL ?? "https://www.zohoapis.in";
async function getAccessToken(): Promise<string> {
const params = new URLSearchParams({
refresh_token: process.env.ZOHO_REFRESH_TOKEN!,
client_id: process.env.ZOHO_CLIENT_ID!,
client_secret: process.env.ZOHO_CLIENT_SECRET!,
grant_type: "refresh_token",
});
const res = await fetch(`${ZOHO_ACCOUNTS_URL}/oauth/v2/token?${params}`, { method: "POST" });
const data = await res.json();
return data.access_token;
}
const server = new McpServer({ name: "zoho-crm-mcp", version: "1.0.0" });
server.tool(
"list_leads",
"List recent leads from Zoho CRM",
{ perPage: z.number().max(50).default(10) },
async ({ perPage }) => {
const token = await getAccessToken();
const res = await fetch(`${ZOHO_API_URL}/crm/v2/Leads?per_page=${perPage}`, {
headers: { Authorization: `Zoho-oauthtoken ${token}` },
});
const data = await res.json();
return { content: [{ type: "text", text: JSON.stringify(data) }] };
}
);
const transport = new StdioServerTransport();
await server.connect(transport);