I have hosted a function on Google Could run and am able to call it with FastMCPClient. Thank you for the help with my earlier question. This is my MCP Server code. This is deployed as a docker image on Google Cloud Run. import asyncio import os from fastmcp import FastMCP, Context mcp = FastMCP("MCP Server on Cloud Run") @mcp.tool() '''Call this function when there are 2 numbers to add. Pass the 2 numbers as parameters''' async def add(a: int, b: int, ctx: Context) -> int: await ctx.debug(f"[add] {a}+{b}") result = a+b await ctx.debug(f"result={result}") return result if __name__ == "__main__": asyncio.run( mcp.run_async( transport="streamable-http", host="0.0.0.0", port=os.getenv("PORT", 8080), ) ) The below code works and I am able to call the MCP tool to add 2 numbers. from fastmcp import Client import asyncio import google.oauth2.id_token import google.auth.transport.requests import os import sys args = sys.argv if len(args) != 3: sys.stderr.write(f"Usage: python {args[0]} <a> <b>\n") sys.exit(1) a = args[1] b = args[2] os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'C:\\Path\\to\\file.json' audience = "https://mcp-server-url-from-cloud-run" request = google.auth.transport.requests.Request() token = google.oauth2.id_token.fetch_id_token(request, audience) config = { "mcpServers": { "cloud-run":{ "transport": "streamable-http", "url": f"{audience}/mcp/", "headers": { "Authorization": "Bearer token", }, "auth": token, } } } client = Client(config) async def run(): async with client: print("Connected") aint=int(a) bint=int(b) result = await client.call_tool( name="add", arguments={"a":aint, "b":bint}, ) print(result) if __name__ == "__main__": asyncio.run(run()) My intention was to expose this tool to my llm so it can decide when to call the tools at it's disposal. For example, if I say "add 5 and 4" in the prompt, the LLM should call the add function and return 9. Just using the call_tool() function does not add much value when unstructured data is involved. I could use the below code to make the LLM access the mcp tools when the MCP server was a local .py file. os.environ["OPENAI_API_KEY"] = "Open_API_Key" # Instantiate Google Gemini LLM with deterministic output and retry logic llm = ChatOpenAI( model="gpt-4o", temperature=0, max_tokens=None, timeout=None, max_retries=2, #api_key="" # base_url="...", # organization="...", # other params... ) server_script = sys.argv[1] # Configure MCP server startup parameters server_params = StdioServerParameters( command="python" if server_script.endswith(".py") else "node", args=[server_script], ) mcp_client = None async def run_agent(): global mcp_client async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() mcp_client = type("MCPClientHolder", (), {"session": session})() tools = await load_mcp_tools(session) agent = create_react_agent(llm, tools,prompt=system_message_obj) print("MCP Client Started! Type 'quit' to exit.") while True: query = input("\\nQuery: ").strip() if query.lower() == "quit": break # Send user query to agent and print formatted response response = await agent.ainvoke({"messages": query}) try: formatted = json.dumps(response, indent=2, cls=CustomEncoder) except Exception: formatted = str(response) print("\\nResponse:") print(formatted) return Is there a way to expose the tools from my Google Cloud MCP server (called in my first code) to the LLM python Client using the Cloud Run URL and secure json Key ? Like how it is done in the second code with local .py file. This might be a basic question but I could not find any answers so far. Any help will be really appreciated. Continue reading...