Skip to content

Commit 83b678f

Browse files
committed
add more examples
1 parent 5d68887 commit 83b678f

18 files changed

Lines changed: 1741 additions & 1068 deletions

openai_agents/mcp/README.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,23 @@ Integration with hosted MCP (Model Context Protocol) servers using OpenAI agents
66

77
Before running these examples, be sure to review the [prerequisites and background on the integration](../README.md).
88

9+
## MCP Server Dependencies
10+
11+
All examples use self-contained MCP servers in the `servers/` directory. The servers require these dependencies:
12+
13+
```bash
14+
pip install mcp requests
15+
# or
16+
uv add mcp requests
17+
```
18+
19+
## Server Implementations
20+
21+
The `servers/` directory contains self-contained MCP server implementations:
22+
23+
- **`tools_server.py`** - Multi-transport MCP server with tools for arithmetic, weather, and random words. Supports both `--transport=streamable-http` and `--transport=sse`
24+
- **`prompt_server.py`** - MCP server that provides prompts for generating agent instructions (code review example)
25+
926
## Running the Examples
1027

1128
### File System MCP - Stateless
@@ -32,4 +49,55 @@ uv run openai_agents/mcp/run_file_system_stateful_worker.py
3249
Connect to a hosted MCP server for file system operations:
3350
```bash
3451
uv run openai_agents/mcp/run_file_system_stateful_workflow.py
52+
```
53+
54+
### Streamable HTTP MCP - Stateless
55+
56+
First, start the MCP server:
57+
```bash
58+
uv run openai_agents/mcp/servers/tools_server.py --transport=streamable-http
59+
```
60+
61+
Then start the worker:
62+
```bash
63+
uv run openai_agents/mcp/run_streamable_http_stateless_worker.py
64+
```
65+
66+
Finally, run the workflow:
67+
```bash
68+
uv run openai_agents/mcp/run_streamable_http_stateless_workflow.py
69+
```
70+
71+
### SSE MCP - Stateless
72+
73+
First, start the MCP server:
74+
```bash
75+
uv run openai_agents/mcp/servers/tools_server.py --transport=sse
76+
```
77+
78+
Then start the worker:
79+
```bash
80+
uv run openai_agents/mcp/run_sse_stateless_worker.py
81+
```
82+
83+
Finally, run the workflow:
84+
```bash
85+
uv run openai_agents/mcp/run_sse_stateless_workflow.py
86+
```
87+
88+
### Prompt Server MCP - Stateless
89+
90+
First, start the MCP server:
91+
```bash
92+
uv run openai_agents/mcp/servers/prompt_server.py
93+
```
94+
95+
Then start the worker:
96+
```bash
97+
uv run openai_agents/mcp/run_prompt_server_stateless_worker.py
98+
```
99+
100+
Finally, run the workflow:
101+
```bash
102+
uv run openai_agents/mcp/run_prompt_server_stateless_workflow.py
35103
```

openai_agents/mcp/run_file_system_stateful_workflow.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import asyncio
2-
import os
32

43
from temporalio.client import Client
54
from temporalio.contrib.openai_agents import OpenAIAgentsPlugin

openai_agents/mcp/run_file_system_stateless_worker.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
import asyncio
44
import os
55
from datetime import timedelta
6+
import uuid
67

78
from agents.mcp import MCPServerStdio
89
from temporalio.client import Client
910
from temporalio.contrib.openai_agents import (
1011
ModelActivityParameters,
1112
OpenAIAgentsPlugin,
12-
StatelessMCPServer,
13+
StatelessMCPServerProvider,
1314
)
1415
from temporalio.worker import Worker
1516

@@ -23,8 +24,8 @@ async def main():
2324
samples_dir = os.path.join(current_dir, "sample_files")
2425

2526
# TODO: StatelessMCPServer will switch to StatelessMCPServerProvider instead
26-
file_system_server = StatelessMCPServer(
27-
MCPServerStdio(
27+
file_system_server = StatelessMCPServerProvider(
28+
lambda: MCPServerStdio(
2829
name="FileSystemServer",
2930
params={
3031
"command": "npx",
@@ -48,7 +49,7 @@ async def main():
4849

4950
worker = Worker(
5051
client,
51-
task_queue="openai-agents-mcp-stateless-task-queue",
52+
task_queue=f"openai-agents-mcp-stateless-task-queue-{uuid.uuid4()}",
5253
workflows=[
5354
FileSystemWorkflow,
5455
],

openai_agents/mcp/run_file_system_stateless_workflow.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import asyncio
2-
import os
32

43
from temporalio.client import Client
54
from temporalio.contrib.openai_agents import OpenAIAgentsPlugin
65

76
from openai_agents.mcp.workflows.file_system_stateless_workflow import (
87
FileSystemWorkflow,
98
)
10-
9+
import uuid
1110

1211
async def main():
1312
# Create client connected to server at the given address
@@ -21,7 +20,7 @@ async def main():
2120
# Execute a workflow
2221
result = await client.execute_workflow(
2322
FileSystemWorkflow.run,
24-
id="file-system-workflow",
23+
id=f"file-system-workflow-{uuid.uuid4()}",
2524
task_queue="openai-agents-mcp-stateless-task-queue",
2625
)
2726

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from __future__ import annotations
2+
3+
import asyncio
4+
import shutil
5+
from datetime import timedelta
6+
7+
from agents.mcp import MCPServerStreamableHttp
8+
from temporalio.client import Client
9+
from temporalio.contrib.openai_agents import (
10+
ModelActivityParameters,
11+
OpenAIAgentsPlugin,
12+
StatelessMCPServerProvider,
13+
)
14+
import logging
15+
from temporalio.worker import Worker
16+
17+
from openai_agents.mcp.workflows.prompt_server_stateless_workflow import PromptServerWorkflow
18+
19+
20+
async def main():
21+
logging.basicConfig(level=logging.DEBUG)
22+
23+
print("Setting up worker...\n")
24+
25+
try:
26+
prompt_server_provider = StatelessMCPServerProvider(
27+
lambda: MCPServerStreamableHttp(
28+
name="PromptServer",
29+
params={
30+
"url": "http://localhost:8000/mcp",
31+
},
32+
)
33+
)
34+
35+
# Create client connected to server at the given address
36+
client = await Client.connect(
37+
"localhost:7233",
38+
plugins=[
39+
OpenAIAgentsPlugin(
40+
model_params=ModelActivityParameters(
41+
start_to_close_timeout=timedelta(seconds=120)
42+
),
43+
mcp_servers=[prompt_server_provider],
44+
),
45+
],
46+
)
47+
48+
worker = Worker(
49+
client,
50+
task_queue="openai-agents-mcp-stateless-task-queue",
51+
workflows=[
52+
PromptServerWorkflow,
53+
],
54+
activities=[
55+
# No custom activities needed for these workflows
56+
],
57+
)
58+
logging.debug("STARTED WORKER")
59+
await worker.run()
60+
except Exception as e:
61+
print(f"Worker failed: {e}")
62+
raise
63+
64+
65+
if __name__ == "__main__":
66+
asyncio.run(main())
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from __future__ import annotations
2+
3+
import asyncio
4+
5+
from temporalio.client import Client
6+
7+
from openai_agents.mcp.workflows.prompt_server_stateless_workflow import PromptServerWorkflow
8+
9+
10+
async def main():
11+
# Create client connected to server at the given address
12+
client = await Client.connect("localhost:7233")
13+
14+
# Execute a workflow
15+
result = await client.execute_workflow(
16+
PromptServerWorkflow.run,
17+
id="prompt-server-workflow",
18+
task_queue="openai-agents-mcp-stateless-task-queue",
19+
)
20+
21+
print(f"Result: {result}")
22+
23+
24+
if __name__ == "__main__":
25+
asyncio.run(main())
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from __future__ import annotations
2+
3+
import asyncio
4+
import shutil
5+
from datetime import timedelta
6+
7+
from agents.mcp import MCPServerSse
8+
from temporalio.client import Client
9+
from temporalio.contrib.openai_agents import (
10+
ModelActivityParameters,
11+
OpenAIAgentsPlugin,
12+
StatelessMCPServerProvider,
13+
)
14+
import logging
15+
from temporalio.worker import Worker
16+
17+
from openai_agents.mcp.workflows.sse_stateless_workflow import SseWorkflow
18+
19+
20+
async def main():
21+
logging.basicConfig(level=logging.DEBUG)
22+
23+
print("Setting up worker...\n")
24+
25+
try:
26+
sse_server_provider = StatelessMCPServerProvider(
27+
lambda: MCPServerSse(
28+
name="SseServer",
29+
params={
30+
"url": "http://localhost:8000/sse",
31+
},
32+
)
33+
)
34+
35+
# Create client connected to server at the given address
36+
client = await Client.connect(
37+
"localhost:7233",
38+
plugins=[
39+
OpenAIAgentsPlugin(
40+
model_params=ModelActivityParameters(
41+
start_to_close_timeout=timedelta(seconds=60)
42+
),
43+
mcp_servers=[sse_server_provider],
44+
),
45+
],
46+
)
47+
48+
worker = Worker(
49+
client,
50+
task_queue="openai-agents-mcp-stateless-task-queue",
51+
workflows=[
52+
SseWorkflow,
53+
],
54+
activities=[
55+
# No custom activities needed for these workflows
56+
],
57+
)
58+
logging.debug("STARTED WORKER")
59+
await worker.run()
60+
except Exception as e:
61+
print(f"Worker failed: {e}")
62+
raise
63+
64+
65+
if __name__ == "__main__":
66+
asyncio.run(main())
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from __future__ import annotations
2+
3+
import asyncio
4+
5+
from temporalio.client import Client
6+
7+
from openai_agents.mcp.workflows.sse_stateless_workflow import SseWorkflow
8+
9+
10+
async def main():
11+
# Create client connected to server at the given address
12+
client = await Client.connect("localhost:7233")
13+
14+
# Execute a workflow
15+
result = await client.execute_workflow(
16+
SseWorkflow.run,
17+
id="sse-stateless-workflow",
18+
task_queue="openai-agents-mcp-stateless-task-queue",
19+
)
20+
21+
print(f"Result: {result}")
22+
23+
24+
if __name__ == "__main__":
25+
asyncio.run(main())

0 commit comments

Comments
 (0)