@contextbharat/mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # @contextbharat/mcp
2
+
3
+ MCP server for Indian API documentation.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npx @contextbharat/mcp --api-key YOUR_KEY
9
+ ```
10
+
11
+ ## Claude Desktop config
12
+
13
+ ```json
14
+ {
15
+ "mcpServers": {
16
+ "contextbharat": {
17
+ "command": "npx",
18
+ "args": ["-y", "@contextbharat/mcp", "--api-key", "YOUR_KEY"]
19
+ }
20
+ }
21
+ }
22
+ ```
23
+
24
+ ## Development
25
+
26
+ ```bash
27
+ pnpm install
28
+ pnpm dev # tsx watch
29
+ pnpm build # Compile to dist/
30
+ pnpm test # vitest
31
+ pnpm inspect # MCP inspector at localhost:5173
32
+ ```
33
+
34
+ ## Forked from
35
+
36
+ [upstash/context7](https://github.com/upstash/context7) (MIT License)
@@ -0,0 +1,48 @@
1
+ export interface ResolveLibraryParams {
2
+ query: string;
3
+ libraryName: string;
4
+ }
5
+ export interface ResolveLibraryResult {
6
+ libraryId: string;
7
+ name: string;
8
+ description?: string;
9
+ versions: string[];
10
+ tags: string[];
11
+ confidence: number;
12
+ }
13
+ export interface QueryDocsParams {
14
+ libraryId: string;
15
+ query: string;
16
+ tokenBudget?: number;
17
+ language?: string;
18
+ }
19
+ export interface QueryDocsResult {
20
+ docs: string;
21
+ libraryId: string;
22
+ libraryName: string;
23
+ sources: string[];
24
+ freshnessScore?: number;
25
+ language: string;
26
+ tokenCount: number;
27
+ }
28
+ declare class BackendClient {
29
+ private readonly baseUrl;
30
+ private readonly apiKey;
31
+ constructor();
32
+ private get authHeaders();
33
+ resolveLibrary(params: ResolveLibraryParams): Promise<ResolveLibraryResult>;
34
+ queryDocs(params: QueryDocsParams): Promise<QueryDocsResult>;
35
+ listLibraries(category?: string): Promise<{
36
+ libraries: ResolveLibraryResult[];
37
+ total: number;
38
+ }>;
39
+ private post;
40
+ }
41
+ export declare class BackendError extends Error {
42
+ readonly status: number;
43
+ readonly body: string;
44
+ constructor(status: number, body: string);
45
+ }
46
+ export declare const backendClient: BackendClient;
47
+ export {};
48
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,cAAM,aAAa;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;IAOhC,OAAO,KAAK,WAAW,GAItB;IAEK,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAe3E,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAkB5D,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;YAcvF,IAAI;CAkBnB;AAED,qBAAa,YAAa,SAAQ,KAAK;aAEnB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;gBADZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM;CAK/B;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
package/dist/client.js ADDED
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.backendClient = exports.BackendError = void 0;
4
+ /**
5
+ * HTTP client for the Context Bharat backend API.
6
+ * Called by MCP tool handlers.
7
+ */
8
+ const config_js_1 = require("./config.js");
9
+ class BackendClient {
10
+ baseUrl;
11
+ apiKey;
12
+ constructor() {
13
+ this.baseUrl = config_js_1.config.apiBaseUrl.replace(/\/$/, "");
14
+ this.apiKey = config_js_1.config.apiKey;
15
+ }
16
+ get authHeaders() {
17
+ return this.apiKey
18
+ ? { Authorization: `Bearer ${this.apiKey}` }
19
+ : {};
20
+ }
21
+ async resolveLibrary(params) {
22
+ const raw = await this.post("/v1/libraries/resolve", {
23
+ query: params.query,
24
+ library_name: params.libraryName,
25
+ });
26
+ return {
27
+ libraryId: (raw.library_id ?? raw.libraryId),
28
+ name: raw.name,
29
+ description: raw.description,
30
+ versions: (raw.versions ?? []),
31
+ tags: (raw.tags ?? []),
32
+ confidence: (raw.confidence ?? 0),
33
+ };
34
+ }
35
+ async queryDocs(params) {
36
+ const raw = await this.post("/v1/docs/query", {
37
+ library_id: params.libraryId,
38
+ query: params.query,
39
+ token_budget: params.tokenBudget ?? config_js_1.config.defaultTokenBudget,
40
+ language: params.language ?? "en",
41
+ });
42
+ return {
43
+ docs: (raw.docs ?? ""),
44
+ libraryId: (raw.library_id ?? raw.libraryId ?? ""),
45
+ libraryName: (raw.library_name ?? raw.libraryName ?? ""),
46
+ sources: (raw.sources ?? []),
47
+ freshnessScore: (raw.freshness_score ?? raw.freshnessScore),
48
+ language: (raw.language ?? "en"),
49
+ tokenCount: (raw.token_count ?? raw.tokenCount ?? 0),
50
+ };
51
+ }
52
+ async listLibraries(category) {
53
+ const url = category
54
+ ? `${this.baseUrl}/v1/libraries?category=${encodeURIComponent(category)}`
55
+ : `${this.baseUrl}/v1/libraries`;
56
+ const response = await fetch(url, {
57
+ headers: { "Content-Type": "application/json", ...this.authHeaders },
58
+ signal: AbortSignal.timeout(config_js_1.config.requestTimeoutMs),
59
+ });
60
+ if (!response.ok) {
61
+ throw new BackendError(response.status, await response.text());
62
+ }
63
+ return response.json();
64
+ }
65
+ async post(path, body) {
66
+ const response = await fetch(`${this.baseUrl}${path}`, {
67
+ method: "POST",
68
+ headers: {
69
+ "Content-Type": "application/json",
70
+ ...this.authHeaders,
71
+ },
72
+ body: JSON.stringify(body),
73
+ signal: AbortSignal.timeout(config_js_1.config.requestTimeoutMs),
74
+ });
75
+ if (!response.ok) {
76
+ const errorText = await response.text();
77
+ throw new BackendError(response.status, errorText);
78
+ }
79
+ return response.json();
80
+ }
81
+ }
82
+ class BackendError extends Error {
83
+ status;
84
+ body;
85
+ constructor(status, body) {
86
+ super(`Backend API error ${status}: ${body}`);
87
+ this.status = status;
88
+ this.body = body;
89
+ this.name = "BackendError";
90
+ }
91
+ }
92
+ exports.BackendError = BackendError;
93
+ exports.backendClient = new BackendClient();
94
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * MCP Server configuration.
3
+ * Reads environment variables at startup.
4
+ */
5
+ export declare const config: {
6
+ /** Backend API base URL */
7
+ readonly apiBaseUrl: string;
8
+ /** API key for authentication — optional, uses free tier if absent */
9
+ readonly apiKey: string;
10
+ /** Default token budget for query-docs */
11
+ readonly defaultTokenBudget: 5000;
12
+ /** Request timeout in milliseconds */
13
+ readonly requestTimeoutMs: 10000;
14
+ /** Server version */
15
+ readonly version: "0.1.0";
16
+ };
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,MAAM;IACjB,2BAA2B;;IAE3B,sEAAsE;;IAEtE,0CAA0C;;IAE1C,sCAAsC;;IAEtC,qBAAqB;;CAEb,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ /**
5
+ * MCP Server configuration.
6
+ * Reads environment variables at startup.
7
+ */
8
+ exports.config = {
9
+ /** Backend API base URL */
10
+ apiBaseUrl: process.env.CONTEXTBHARAT_API_BASE_URL ?? "https://api.contextbharat.com",
11
+ /** API key for authentication — optional, uses free tier if absent */
12
+ apiKey: process.env.CONTEXTBHARAT_API_KEY ?? "",
13
+ /** Default token budget for query-docs */
14
+ defaultTokenBudget: 5000,
15
+ /** Request timeout in milliseconds */
16
+ requestTimeoutMs: 10_000,
17
+ /** Server version */
18
+ version: "0.1.0",
19
+ };
20
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,MAAM,GAAG;IACpB,2BAA2B;IAC3B,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,+BAA+B;IACrF,sEAAsE;IACtE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;IAC/C,0CAA0C;IAC1C,kBAAkB,EAAE,IAAI;IACxB,sCAAsC;IACtC,gBAAgB,EAAE,MAAM;IACxB,qBAAqB;IACrB,OAAO,EAAE,OAAO;CACR,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,200 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ /**
8
+ * Context Bharat — MCP Server
9
+ *
10
+ * Provides AI coding assistants (Claude, Cursor, VS Code) with up-to-date
11
+ * documentation for Indian APIs, government specs, and global frameworks.
12
+ *
13
+ * Tools:
14
+ * - resolve-library-id: map library name → canonical ID
15
+ * - query-docs: retrieve relevant documentation chunks
16
+ *
17
+ * Transport:
18
+ * - PORT env var set → HTTP Streamable (for Cloud Run / remote hosting)
19
+ * - PORT env var unset → stdio (for local npx usage)
20
+ *
21
+ * Forked from: upstash/context7 (MIT License)
22
+ * Backend: Context Bharat proprietary index
23
+ */
24
+ const node_http_1 = __importDefault(require("node:http"));
25
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
26
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
27
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
28
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
29
+ const config_js_1 = require("./config.js");
30
+ const resolve_library_id_js_1 = require("./tools/resolve-library-id.js");
31
+ const query_docs_js_1 = require("./tools/query-docs.js");
32
+ function createServer() {
33
+ const server = new index_js_1.Server({
34
+ name: "contextbharat",
35
+ version: config_js_1.config.version,
36
+ }, {
37
+ capabilities: { tools: {} },
38
+ });
39
+ // ── Tool definitions ──────────────────────────────────────────────────────────
40
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
41
+ tools: [
42
+ {
43
+ name: "resolve-library-id",
44
+ description: "Resolve a library or API name to a ContextBharat-compatible library ID. " +
45
+ "Always call this before query-docs if you only have a library name. " +
46
+ "Supports 100+ Indian APIs (Razorpay, Zerodha, ONDC, UPI, GST) and global frameworks.",
47
+ inputSchema: {
48
+ type: "object",
49
+ properties: {
50
+ query: {
51
+ type: "string",
52
+ description: "The full user query for context",
53
+ },
54
+ libraryName: {
55
+ type: "string",
56
+ description: "The library or API name to resolve",
57
+ },
58
+ },
59
+ required: ["query", "libraryName"],
60
+ },
61
+ },
62
+ {
63
+ name: "query-docs",
64
+ description: "Retrieve current documentation for a library. " +
65
+ "Returns relevant Markdown documentation within your token budget. " +
66
+ "Supports Hindi documentation for Indian APIs (language='hi'). " +
67
+ "Use after resolve-library-id to get the libraryId.",
68
+ inputSchema: {
69
+ type: "object",
70
+ properties: {
71
+ libraryId: {
72
+ type: "string",
73
+ description: "ContextBharat library ID, e.g. /razorpay/razorpay-sdk",
74
+ },
75
+ query: {
76
+ type: "string",
77
+ description: "Developer's specific question or task",
78
+ },
79
+ tokenBudget: {
80
+ type: "number",
81
+ description: "Max tokens to return (default 5000)",
82
+ default: 5000,
83
+ },
84
+ language: {
85
+ type: "string",
86
+ enum: ["en", "hi", "ta", "te", "kn", "bn"],
87
+ description: "Documentation language (default: en)",
88
+ default: "en",
89
+ },
90
+ },
91
+ required: ["libraryId", "query"],
92
+ },
93
+ },
94
+ ],
95
+ }));
96
+ // ── Tool execution ────────────────────────────────────────────────────────────
97
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
98
+ const { name, arguments: args } = request.params;
99
+ try {
100
+ let result;
101
+ if (name === "resolve-library-id") {
102
+ const input = resolve_library_id_js_1.resolveLibraryIdSchema.parse(args);
103
+ result = await (0, resolve_library_id_js_1.resolveLibraryIdHandler)(input);
104
+ }
105
+ else if (name === "query-docs") {
106
+ const input = query_docs_js_1.queryDocsSchema.parse(args);
107
+ result = await (0, query_docs_js_1.queryDocsHandler)(input);
108
+ }
109
+ else {
110
+ return {
111
+ content: [{ type: "text", text: `Unknown tool: ${name}` }],
112
+ isError: true,
113
+ };
114
+ }
115
+ return {
116
+ content: [{ type: "text", text: result }],
117
+ };
118
+ }
119
+ catch (error) {
120
+ const message = error instanceof Error ? error.message : String(error);
121
+ return {
122
+ content: [{ type: "text", text: `Error: ${message}` }],
123
+ isError: true,
124
+ };
125
+ }
126
+ });
127
+ return server;
128
+ }
129
+ // ── HTTP mode (Cloud Run) ─────────────────────────────────────────────────────
130
+ async function startHttpServer(port) {
131
+ // Stateless transport: each POST /mcp gets a fresh transport+server pair.
132
+ // This is the simplest approach for Cloud Run where instances can be recycled.
133
+ const httpServer = node_http_1.default.createServer(async (req, res) => {
134
+ // Health check endpoint — required by Cloud Run
135
+ if (req.method === "GET" && req.url === "/health") {
136
+ res.writeHead(200, { "Content-Type": "application/json" });
137
+ res.end(JSON.stringify({ status: "ok", version: config_js_1.config.version }));
138
+ return;
139
+ }
140
+ // MCP endpoint
141
+ if (req.url === "/mcp" || req.url === "/") {
142
+ // Collect request body
143
+ const chunks = [];
144
+ req.on("data", (chunk) => chunks.push(chunk));
145
+ await new Promise((resolve) => req.on("end", resolve));
146
+ const body = Buffer.concat(chunks).toString("utf-8");
147
+ let parsedBody;
148
+ try {
149
+ parsedBody = body ? JSON.parse(body) : undefined;
150
+ }
151
+ catch {
152
+ res.writeHead(400, { "Content-Type": "application/json" });
153
+ res.end(JSON.stringify({ error: "Invalid JSON body" }));
154
+ return;
155
+ }
156
+ // Create a fresh server + transport per request (stateless)
157
+ const server = createServer();
158
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
159
+ sessionIdGenerator: undefined, // stateless
160
+ });
161
+ await server.connect(transport);
162
+ await transport.handleRequest(req, res, parsedBody);
163
+ return;
164
+ }
165
+ // 404 for everything else
166
+ res.writeHead(404, { "Content-Type": "application/json" });
167
+ res.end(JSON.stringify({ error: "Not found" }));
168
+ });
169
+ await new Promise((resolve, reject) => {
170
+ httpServer.listen(port, "0.0.0.0", () => resolve());
171
+ httpServer.on("error", reject);
172
+ });
173
+ process.stderr.write(`Context Bharat MCP server v${config_js_1.config.version} started (HTTP on :${port})\n`);
174
+ }
175
+ // ── stdio mode (local npx) ────────────────────────────────────────────────────
176
+ async function startStdioServer() {
177
+ const server = createServer();
178
+ const transport = new stdio_js_1.StdioServerTransport();
179
+ await server.connect(transport);
180
+ process.stderr.write(`Context Bharat MCP server v${config_js_1.config.version} started (stdio)\n`);
181
+ }
182
+ // ── Entrypoint ────────────────────────────────────────────────────────────────
183
+ async function main() {
184
+ const portEnv = process.env.PORT;
185
+ if (portEnv) {
186
+ const port = parseInt(portEnv, 10);
187
+ if (isNaN(port)) {
188
+ throw new Error(`Invalid PORT env var: "${portEnv}"`);
189
+ }
190
+ await startHttpServer(port);
191
+ }
192
+ else {
193
+ await startStdioServer();
194
+ }
195
+ }
196
+ main().catch((error) => {
197
+ process.stderr.write(`Fatal: ${error}\n`);
198
+ process.exit(1);
199
+ });
200
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * MCP Tool: query-docs
3
+ * Retrieves relevant documentation for a library + query.
4
+ *
5
+ * Supports:
6
+ * - Indian fintech APIs (Razorpay, Cashfree, Zerodha, ...)
7
+ * - India Stack / DPI (ONDC, UPI, GSTN, DigiLocker, ...)
8
+ * - Global frameworks (React, Next.js, FastAPI, ...)
9
+ * - Hindi and regional language docs (language parameter)
10
+ */
11
+ import { z } from "zod";
12
+ export declare const SUPPORTED_LANGUAGES: readonly ["en", "hi", "ta", "te", "kn", "bn"];
13
+ export declare const queryDocsSchema: z.ZodObject<{
14
+ libraryId: z.ZodString;
15
+ query: z.ZodString;
16
+ tokenBudget: z.ZodDefault<z.ZodNumber>;
17
+ language: z.ZodDefault<z.ZodEnum<["en", "hi", "ta", "te", "kn", "bn"]>>;
18
+ }, "strip", z.ZodTypeAny, {
19
+ libraryId: string;
20
+ language: "en" | "hi" | "ta" | "te" | "kn" | "bn";
21
+ query: string;
22
+ tokenBudget: number;
23
+ }, {
24
+ libraryId: string;
25
+ query: string;
26
+ language?: "en" | "hi" | "ta" | "te" | "kn" | "bn" | undefined;
27
+ tokenBudget?: number | undefined;
28
+ }>;
29
+ export type QueryDocsInput = z.infer<typeof queryDocsSchema>;
30
+ export declare function queryDocsHandler(input: QueryDocsInput): Promise<string>;
31
+ //# sourceMappingURL=query-docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-docs.d.ts","sourceRoot":"","sources":["../../src/tools/query-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,mBAAmB,+CAAgD,CAAC;AAGjF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EA6B1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE7D,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAuC7E"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.queryDocsSchema = exports.SUPPORTED_LANGUAGES = void 0;
4
+ exports.queryDocsHandler = queryDocsHandler;
5
+ /**
6
+ * MCP Tool: query-docs
7
+ * Retrieves relevant documentation for a library + query.
8
+ *
9
+ * Supports:
10
+ * - Indian fintech APIs (Razorpay, Cashfree, Zerodha, ...)
11
+ * - India Stack / DPI (ONDC, UPI, GSTN, DigiLocker, ...)
12
+ * - Global frameworks (React, Next.js, FastAPI, ...)
13
+ * - Hindi and regional language docs (language parameter)
14
+ */
15
+ const zod_1 = require("zod");
16
+ const client_js_1 = require("../client.js");
17
+ exports.SUPPORTED_LANGUAGES = ["en", "hi", "ta", "te", "kn", "bn"];
18
+ exports.queryDocsSchema = zod_1.z.object({
19
+ libraryId: zod_1.z
20
+ .string()
21
+ .describe("ContextBharat-compatible library ID. Use resolve-library-id first if you only have a name. " +
22
+ "Format: /owner/repo — e.g. /razorpay/razorpay-sdk, /zerodha/kite-api, /ondc/protocol-specs"),
23
+ query: zod_1.z
24
+ .string()
25
+ .describe("The developer's specific question or task. Be specific for better results. " +
26
+ "E.g. 'create a payment link with expiry' not just 'payment'."),
27
+ tokenBudget: zod_1.z
28
+ .number()
29
+ .min(100)
30
+ .max(20000)
31
+ .default(5000)
32
+ .describe("Maximum number of tokens in the response. Default 5000. " +
33
+ "Increase for comprehensive guides, decrease for quick references."),
34
+ language: zod_1.z
35
+ .enum(exports.SUPPORTED_LANGUAGES)
36
+ .default("en")
37
+ .describe("Documentation language. 'hi' for Hindi, 'ta' for Tamil, 'te' for Telugu. " +
38
+ "Hindi available for top Indian APIs."),
39
+ });
40
+ async function queryDocsHandler(input) {
41
+ try {
42
+ const result = await client_js_1.backendClient.queryDocs({
43
+ libraryId: input.libraryId,
44
+ query: input.query,
45
+ tokenBudget: input.tokenBudget,
46
+ language: input.language,
47
+ });
48
+ // Build formatted response
49
+ const parts = [];
50
+ // Header with freshness info
51
+ const freshnessNote = result.freshnessScore !== undefined && result.freshnessScore < 0.5
52
+ ? ` ⚠️ Note: These docs may be stale (freshness: ${(result.freshnessScore * 100).toFixed(0)}%)`
53
+ : "";
54
+ parts.push(`## ${result.libraryName} Documentation${freshnessNote}\n`);
55
+ // Main content
56
+ parts.push(result.docs);
57
+ // Sources
58
+ if (result.sources.length > 0) {
59
+ parts.push(`\n---\n**Sources:** ${result.sources.map(s => `[${s}](${s})`).join(" · ")}`);
60
+ }
61
+ return parts.join("\n");
62
+ }
63
+ catch (error) {
64
+ if (error instanceof client_js_1.BackendError && error.status === 404) {
65
+ return [
66
+ `Library \`${input.libraryId}\` not found or not yet indexed.`,
67
+ ``,
68
+ `Check the full library catalog: https://contextbharat.com/libraries`,
69
+ `If this library should be indexed, open an issue: https://github.com/contextbharat/context-bharat/issues`,
70
+ ].join("\n");
71
+ }
72
+ throw error;
73
+ }
74
+ }
75
+ //# sourceMappingURL=query-docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-docs.js","sourceRoot":"","sources":["../../src/tools/query-docs.ts"],"names":[],"mappings":";;;AAiDA,4CAuCC;AAxFD;;;;;;;;;GASG;AACH,6BAAwB;AACxB,4CAA2D;AAE9C,QAAA,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAGpE,QAAA,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,OAAC;SACT,MAAM,EAAE;SACR,QAAQ,CACP,6FAA6F;QAC7F,4FAA4F,CAC7F;IACH,KAAK,EAAE,OAAC;SACL,MAAM,EAAE;SACR,QAAQ,CACP,6EAA6E;QAC7E,8DAA8D,CAC/D;IACH,WAAW,EAAE,OAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,GAAG,CAAC,KAAK,CAAC;SACV,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CACP,0DAA0D;QAC1D,mEAAmE,CACpE;IACH,QAAQ,EAAE,OAAC;SACR,IAAI,CAAC,2BAAmB,CAAC;SACzB,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CACP,2EAA2E;QAC3E,sCAAsC,CACvC;CACJ,CAAC,CAAC;AAII,KAAK,UAAU,gBAAgB,CAAC,KAAqB;IAC1D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,yBAAa,CAAC,SAAS,CAAC;YAC3C,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;QAEH,2BAA2B;QAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,6BAA6B;QAC7B,MAAM,aAAa,GACjB,MAAM,CAAC,cAAc,KAAK,SAAS,IAAI,MAAM,CAAC,cAAc,GAAG,GAAG;YAChE,CAAC,CAAC,iDAAiD,CAAC,MAAM,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YAC/F,CAAC,CAAC,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,WAAW,iBAAiB,aAAa,IAAI,CAAC,CAAC;QAEvE,eAAe;QACf,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAExB,UAAU;QACV,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,wBAAY,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1D,OAAO;gBACL,aAAa,KAAK,CAAC,SAAS,kCAAkC;gBAC9D,EAAE;gBACF,qEAAqE;gBACrE,0GAA0G;aAC3G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * MCP Tool: resolve-library-id
3
+ * Maps a human library name to a canonical ContextBharat library ID.
4
+ *
5
+ * Example: "zerodha trading api" → "/zerodha/kite-api"
6
+ */
7
+ import { z } from "zod";
8
+ export declare const resolveLibraryIdSchema: z.ZodObject<{
9
+ query: z.ZodString;
10
+ libraryName: z.ZodString;
11
+ }, "strip", z.ZodTypeAny, {
12
+ libraryName: string;
13
+ query: string;
14
+ }, {
15
+ libraryName: string;
16
+ query: string;
17
+ }>;
18
+ export type ResolveLibraryIdInput = z.infer<typeof resolveLibraryIdSchema>;
19
+ export declare function resolveLibraryIdHandler(input: ResolveLibraryIdInput): Promise<string>;
20
+ //# sourceMappingURL=resolve-library-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-library-id.d.ts","sourceRoot":"","sources":["../../src/tools/resolve-library-id.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,sBAAsB;;;;;;;;;EAOjC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE3E,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAqCjB"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveLibraryIdSchema = void 0;
4
+ exports.resolveLibraryIdHandler = resolveLibraryIdHandler;
5
+ /**
6
+ * MCP Tool: resolve-library-id
7
+ * Maps a human library name to a canonical ContextBharat library ID.
8
+ *
9
+ * Example: "zerodha trading api" → "/zerodha/kite-api"
10
+ */
11
+ const zod_1 = require("zod");
12
+ const client_js_1 = require("../client.js");
13
+ exports.resolveLibraryIdSchema = zod_1.z.object({
14
+ query: zod_1.z.string().describe("The full user query or task description. Used to improve resolution accuracy."),
15
+ libraryName: zod_1.z.string().describe("The library or API name to resolve. E.g. 'razorpay', 'zerodha kite', 'ondc protocol'."),
16
+ });
17
+ async function resolveLibraryIdHandler(input) {
18
+ try {
19
+ const result = await client_js_1.backendClient.resolveLibrary({
20
+ query: input.query,
21
+ libraryName: input.libraryName,
22
+ });
23
+ // Format output for LLM consumption
24
+ const lines = [
25
+ `Library resolved: **${result.name}**`,
26
+ `Library ID: \`${result.libraryId}\``,
27
+ ];
28
+ if (result.description) {
29
+ lines.push(`Description: ${result.description}`);
30
+ }
31
+ if (result.tags.length > 0) {
32
+ lines.push(`Tags: ${result.tags.join(", ")}`);
33
+ }
34
+ if (result.versions.length > 0) {
35
+ lines.push(`Versions: ${result.versions.join(", ")}`);
36
+ }
37
+ lines.push(`\nUse \`query-docs\` with libraryId: "${result.libraryId}" to retrieve documentation.`);
38
+ return lines.join("\n");
39
+ }
40
+ catch (error) {
41
+ if (error instanceof client_js_1.BackendError && error.status === 404) {
42
+ return [
43
+ `Library "${input.libraryName}" not found in the Context Bharat index.`,
44
+ ``,
45
+ `Try browsing available libraries at https://contextbharat.com/libraries`,
46
+ `Or contribute a new library: https://github.com/contextbharat/context-bharat/blob/main/docs/CONTRIBUTING.md`,
47
+ ].join("\n");
48
+ }
49
+ throw error;
50
+ }
51
+ }
52
+ //# sourceMappingURL=resolve-library-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-library-id.js","sourceRoot":"","sources":["../../src/tools/resolve-library-id.ts"],"names":[],"mappings":";;;AAoBA,0DAuCC;AA3DD;;;;;GAKG;AACH,6BAAwB;AACxB,4CAA2D;AAE9C,QAAA,sBAAsB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACxB,+EAA+E,CAChF;IACD,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAC9B,uFAAuF,CACxF;CACF,CAAC,CAAC;AAII,KAAK,UAAU,uBAAuB,CAC3C,KAA4B;IAE5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,yBAAa,CAAC,cAAc,CAAC;YAChD,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CAAC;QAEH,oCAAoC;QACpC,MAAM,KAAK,GAAG;YACZ,uBAAuB,MAAM,CAAC,IAAI,IAAI;YACtC,iBAAiB,MAAM,CAAC,SAAS,IAAI;SACtC,CAAC;QACF,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,CAAC,IAAI,CACR,yCAAyC,MAAM,CAAC,SAAS,8BAA8B,CACxF,CAAC;QAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,wBAAY,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1D,OAAO;gBACL,YAAY,KAAK,CAAC,WAAW,0CAA0C;gBACvE,EAAE;gBACF,yEAAyE;gBACzE,6GAA6G;aAC9G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@contextbharat/mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for Indian API documentation — Razorpay, Zerodha, ONDC, UPI, and 100+ more",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "contextbharat-mcp": "./dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "dev": "tsx watch src/index.ts",
12
+ "build": "tsc",
13
+ "start": "node dist/index.js",
14
+ "test": "vitest run",
15
+ "test:integration": "vitest run --config vitest.integration.config.ts",
16
+ "lint": "eslint src --ext .ts",
17
+ "format": "prettier --write src/**/*.ts",
18
+ "typecheck": "tsc --noEmit",
19
+ "inspect": "npx @modelcontextprotocol/inspector dist/index.js"
20
+ },
21
+ "keywords": ["mcp", "india", "razorpay", "zerodha", "ondc", "documentation", "ai"],
22
+ "license": "Apache-2.0",
23
+ "files": [
24
+ "dist/",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
28
+ "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.0.0",
30
+ "zod": "^3.23.8"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^22.0.0",
34
+ "tsx": "^4.19.0",
35
+ "typescript": "^5.6.0",
36
+ "vitest": "^2.1.0",
37
+ "prettier": "^3.3.0",
38
+ "eslint": "^9.0.0"
39
+ }
40
+ }