| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- """
- An example of running an agency with a local and a public MCP server.
- This example connects to the pre-made MCP servers with custom tools
- that can be found at examples/utils/stdio_mcp_server.py and examples/utils/sse_mcp_server.py
- The public MCP server is running on port 8000 and can be accessed at http://localhost:8000/sse
- Additionally, you can set up custom APP_TOKEN in .env file for auth, otherwise the token will be set to "test_token_123".
- Run the example with: python examples/mcp_servers.py
- It will ask the agent to use tools from both MCP servers and present the results.
- To fully test the public MCP server example (copy/paste):
- 1) Start ngrok in one terminal:
- ngrok http 8000
- 2) In another terminal (replace YOUR_NGROK_ID):
- MCP_PUBLIC_SERVER_URL="https://YOUR_NGROK_ID.ngrok-free.app/sse" python examples/mcp_servers.py
- IF you do not want to run the public MCP server, you can comment out the public_mcp_server_example() call in the main function below.
- """
- import asyncio
- import os
- import subprocess
- import sys
- import time
- from agents.mcp.server import MCPServerStdio, MCPServerStdioParams
- from dotenv import load_dotenv
- from agency_swarm import Agency, Agent, HostedMCPTool
- load_dotenv()
- _EXAMPLES_DIR = os.path.dirname(os.path.abspath(__file__))
- _STDIO_SERVER_PATH = os.path.join(_EXAMPLES_DIR, "utils", "stdio_mcp_server.py")
- _SSE_SERVER_PATH = os.path.join(_EXAMPLES_DIR, "utils", "sse_mcp_server.py")
- app_token = os.getenv("APP_TOKEN")
- if not app_token:
- os.environ["APP_TOKEN"] = "test_token_123"
- app_token = "test_token_123"
- stdio_server = MCPServerStdio(
- MCPServerStdioParams(command=sys.executable, args=[_STDIO_SERVER_PATH], env={"APP_TOKEN": app_token}),
- cache_tools_list=True,
- )
- # Launch the SSE MCP server
- def launch_sse_server():
- """Launch the SSE MCP server in a separate process"""
- env = os.environ.copy()
- env["APP_TOKEN"] = app_token
- process = subprocess.Popen(
- [sys.executable, _SSE_SERVER_PATH],
- env=env,
- )
- # Give the server time to start
- time.sleep(2)
- return process
- mcp_agent_local = Agent(
- name="local_MCP_Agent",
- instructions="You are a helpful assistant",
- description="Helpful assistant",
- model="gpt-5.4-mini",
- mcp_servers=[stdio_server], # <- local mcp server
- )
- agency_local = Agency(mcp_agent_local)
- async def local_mcp_server_example():
- # Agent will handle execution lifecycle of the MCP server automatically.
- print("Running local MCP server example")
- print("-" * 25)
- message = "Get unique id and then current time in Europe/Amsterdam"
- print(f"Sending message: {message}")
- response = await agency_local.get_response(message)
- print(f"Answer: {response.final_output}")
- print("\nIf you see the time and id in the answer, that means agent used the local MCP server successfully")
- print("Local MCP server example completed\n")
- print("-" * 25 + "\n")
- async def public_mcp_server_example():
- # HostedMCPTools do not require manual connection
- public_server_url = os.getenv("MCP_PUBLIC_SERVER_URL")
- if not public_server_url:
- print("MCP_PUBLIC_SERVER_URL is not set; skipping public MCP server example.")
- print("Set MCP_PUBLIC_SERVER_URL to your ngrok URL (including /sse) to enable it.")
- return
- public_server_url = public_server_url.rstrip("/")
- public_agent = Agent(
- name="public_MCP_Agent",
- instructions="You are a helpful assistant",
- description="Helpful assistant",
- model="gpt-5.4-mini",
- tools=[
- HostedMCPTool( # <- public mcp server (requires ngrok)
- tool_config={
- "type": "mcp",
- "server_label": "mcp-tools-server",
- # server_url must be accessible from the internet (not locally)
- "server_url": public_server_url,
- "require_approval": "never",
- "headers": {"Authorization": f"Bearer {app_token}"},
- }
- ),
- ],
- )
- agency_public = Agency(public_agent)
- print("Running public MCP server example")
- print("-" * 25)
- sse_server = None
- try:
- sse_server = launch_sse_server()
- await asyncio.sleep(5) # wait for the server to start
- response = await agency_public.get_response("Get secret word and then list directory")
- print(response.final_output)
- except Exception as e:
- print(
- f"Error using public MCP server: {e}\n Please check the ngrok url and try again.\n"
- "If issue persists, try manually starting sse server by running `python examples/utils/sse_mcp_server.py`"
- )
- return
- finally:
- if sse_server is not None:
- sse_server.terminate()
- print(
- "\nIf secret word is 'strawberry' and agent presented a list of files from the utils folder,"
- " that means the public MCP server worked successfully"
- )
- print("Public MCP server example completed")
- print("-" * 25)
- if __name__ == "__main__":
- print("MCP Server Example")
- print("=" * 50)
- asyncio.run(local_mcp_server_example())
- asyncio.run(public_mcp_server_example()) # <- comment this out if you want to run local example only
|