mirror of
https://github.com/crewAIInc/crewAI.git
synced 2025-12-16 04:18:35 +00:00
* docs(cli): document device-code login and config reset guidance; renumber sections * docs(cli): fix duplicate numbering (renumber Login/API Keys/Configuration sections) * docs: Fix webhook documentation to include meta dict in all webhook payloads - Add note explaining that meta objects from kickoff requests are included in all webhook payloads - Update webhook examples to show proper payload structure including meta field - Fix webhook examples to match actual API implementation - Apply changes to English, Korean, and Portuguese documentation Resolves the documentation gap where meta dict passing to webhooks was not documented despite being implemented in the API. * WIP: CrewAI docs theme, changelog, GEO, localization * docs(cli): fix merge markers; ensure mode: "wide"; convert ASCII tables to Markdown (en/pt-BR/ko) * docs: add group icons across locales; split Automation/Integrations; update tools overviews and links
136 lines
5.0 KiB
Plaintext
136 lines
5.0 KiB
Plaintext
---
|
|
title: Stdio Transport
|
|
description: Learn how to connect CrewAI to local MCP servers using the Stdio (Standard Input/Output) transport mechanism.
|
|
icon: server
|
|
mode: "wide"
|
|
---
|
|
|
|
## Overview
|
|
|
|
The Stdio (Standard Input/Output) transport is designed for connecting `MCPServerAdapter` to local MCP servers that communicate over their standard input and output streams. This is typically used when the MCP server is a script or executable running on the same machine as your CrewAI application.
|
|
|
|
## Key Concepts
|
|
|
|
- **Local Execution**: Stdio transport manages a locally running process for the MCP server.
|
|
- **`StdioServerParameters`**: This class from the `mcp` library is used to configure the command, arguments, and environment variables for launching the Stdio server.
|
|
|
|
## Connecting via Stdio
|
|
|
|
You can connect to an Stdio-based MCP server using two main approaches for managing the connection lifecycle:
|
|
|
|
### 1. Fully Managed Connection (Recommended)
|
|
|
|
Using a Python context manager (`with` statement) is the recommended approach. It automatically handles starting the MCP server process and stopping it when the context is exited.
|
|
|
|
```python
|
|
from crewai import Agent, Task, Crew, Process
|
|
from crewai_tools import MCPServerAdapter
|
|
from mcp import StdioServerParameters
|
|
import os
|
|
|
|
# Create a StdioServerParameters object
|
|
server_params=StdioServerParameters(
|
|
command="python3",
|
|
args=["servers/your_stdio_server.py"],
|
|
env={"UV_PYTHON": "3.12", **os.environ},
|
|
)
|
|
|
|
with MCPServerAdapter(server_params) as tools:
|
|
print(f"Available tools from Stdio MCP server: {[tool.name for tool in tools]}")
|
|
|
|
# Example: Using the tools from the Stdio MCP server in a CrewAI Agent
|
|
research_agent = Agent(
|
|
role="Local Data Processor",
|
|
goal="Process data using a local Stdio-based tool.",
|
|
backstory="An AI that leverages local scripts via MCP for specialized tasks.",
|
|
tools=tools,
|
|
reasoning=True,
|
|
verbose=True,
|
|
)
|
|
|
|
processing_task = Task(
|
|
description="Process the input data file 'data.txt' and summarize its contents.",
|
|
expected_output="A summary of the processed data.",
|
|
agent=research_agent,
|
|
markdown=True
|
|
)
|
|
|
|
data_crew = Crew(
|
|
agents=[research_agent],
|
|
tasks=[processing_task],
|
|
verbose=True,
|
|
process=Process.sequential
|
|
)
|
|
|
|
result = data_crew.kickoff()
|
|
print("\nCrew Task Result (Stdio - Managed):\n", result)
|
|
|
|
```
|
|
|
|
### 2. Manual Connection Lifecycle
|
|
|
|
If you need finer-grained control over when the Stdio MCP server process is started and stopped, you can manage the `MCPServerAdapter` lifecycle manually.
|
|
|
|
<Info>
|
|
You **MUST** call `mcp_server_adapter.stop()` to ensure the server process is terminated and resources are released. Using a `try...finally` block is highly recommended.
|
|
</Info>
|
|
|
|
```python
|
|
from crewai import Agent, Task, Crew, Process
|
|
from crewai_tools import MCPServerAdapter
|
|
from mcp import StdioServerParameters
|
|
import os
|
|
|
|
# Create a StdioServerParameters object
|
|
stdio_params=StdioServerParameters(
|
|
command="python3",
|
|
args=["servers/your_stdio_server.py"],
|
|
env={"UV_PYTHON": "3.12", **os.environ},
|
|
)
|
|
|
|
mcp_server_adapter = MCPServerAdapter(server_params=stdio_params)
|
|
try:
|
|
mcp_server_adapter.start() # Manually start the connection and server process
|
|
tools = mcp_server_adapter.tools
|
|
print(f"Available tools (manual Stdio): {[tool.name for tool in tools]}")
|
|
|
|
# Example: Using the tools with your Agent, Task, Crew setup
|
|
manual_agent = Agent(
|
|
role="Local Task Executor",
|
|
goal="Execute a specific local task using a manually managed Stdio tool.",
|
|
backstory="An AI proficient in controlling local processes via MCP.",
|
|
tools=tools,
|
|
verbose=True
|
|
)
|
|
|
|
manual_task = Task(
|
|
description="Execute the 'perform_analysis' command via the Stdio tool.",
|
|
expected_output="Results of the analysis.",
|
|
agent=manual_agent
|
|
)
|
|
|
|
manual_crew = Crew(
|
|
agents=[manual_agent],
|
|
tasks=[manual_task],
|
|
verbose=True,
|
|
process=Process.sequential
|
|
)
|
|
|
|
|
|
result = manual_crew.kickoff() # Actual inputs depend on your tool
|
|
print("\nCrew Task Result (Stdio - Manual):\n", result)
|
|
|
|
except Exception as e:
|
|
print(f"An error occurred during manual Stdio MCP integration: {e}")
|
|
finally:
|
|
if mcp_server_adapter and mcp_server_adapter.is_connected: # Check if connected before stopping
|
|
print("Stopping Stdio MCP server connection (manual)...")
|
|
mcp_server_adapter.stop() # **Crucial: Ensure stop is called**
|
|
elif mcp_server_adapter: # If adapter exists but not connected (e.g. start failed)
|
|
print("Stdio MCP server adapter was not connected. No stop needed or start failed.")
|
|
|
|
```
|
|
|
|
Remember to replace placeholder paths and commands with your actual Stdio server details. The `env` parameter in `StdioServerParameters` can
|
|
be used to set environment variables for the server process, which can be useful for configuring its behavior or providing necessary paths (like `PYTHONPATH`).
|