From 645ada7681d5b59bde10f0f72426637f39dea521 Mon Sep 17 00:00:00 2001 From: Srinivasa Consultants <78673153+dinakarjs@users.noreply.github.com> Date: Fri, 2 Oct 2026 13:40:28 +0530 Subject: [PATCH] fix(multi-tenant-saas): support MCP tool discovery Signed-off-by: Codex --- multi-tenant-saas/server/mock_mcp_server.py | 64 +++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/multi-tenant-saas/server/mock_mcp_server.py b/multi-tenant-saas/server/mock_mcp_server.py index 2022eaa..5ed924e 100644 --- a/multi-tenant-saas/server/mock_mcp_server.py +++ b/multi-tenant-saas/server/mock_mcp_server.py @@ -52,6 +52,55 @@ def _config_update(args: dict) -> str: } +# Upstream definitions are independent of the gateway catalog used for drift checks. +TOOL_DEFINITIONS = [ + { + "name": "people.headcount_analytics", + "description": "Run a read-only, aggregate people-analytics query (no individual records)", + "inputSchema": { + "type": "object", + "properties": {"metric": {"type": "string"}, "period": {"type": "string"}}, + "required": ["metric"], + }, + }, + { + "name": "people.employee_record_lookup", + "description": "Look up an individual employee record", + "inputSchema": { + "type": "object", + "properties": { + "employee_id": {"type": "string"}, + "legal_basis": {"type": "string"}, + "include_special_category": {"type": "boolean"}, + }, + "required": ["employee_id"], + }, + }, + { + "name": "people.data_export", + "description": "Export employee records to a destination region", + "inputSchema": { + "type": "object", + "properties": { + "scope": {"type": "string"}, + "destination_region": {"type": "string"}, + "legal_basis": {"type": "string"}, + }, + "required": ["destination_region"], + }, + }, + { + "name": "people.config_update", + "description": "Update tenant configuration settings", + "inputSchema": { + "type": "object", + "properties": {"key": {"type": "string"}, "value": {"type": "string"}}, + "required": ["key", "value"], + }, + }, +] + + class Handler(BaseHTTPRequestHandler): def do_POST(self): # noqa: N802 if self.path != "/mcp": @@ -59,6 +108,21 @@ def do_POST(self): # noqa: N802 return length = int(self.headers.get("Content-Length", 0)) request = json.loads(self.rfile.read(length)) + method = request.get("method", "") + if method == "tools/list": + self._reply(200, { + "jsonrpc": "2.0", + "id": request.get("id"), + "result": {"tools": TOOL_DEFINITIONS}, + }) + return + if method != "tools/call": + self._reply(200, { + "jsonrpc": "2.0", + "id": request.get("id"), + "error": {"code": -32601, "message": f"unknown method: {method}"}, + }) + return params = request.get("params", {}) tool = params.get("name", "") handler = TOOLS.get(tool)