Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/api-reference/marvin-agents-team.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ A team is a container that maintains state for a group of agents.
```
- **`get_agentlet`**
```python
def get_agentlet(self, tools: list[Callable[..., Any]], end_turn_tools: list[EndTurn]) -> pydantic_ai.Agent[Any, Any]
def get_agentlet(self, tools: list[Callable[..., Any]], end_turn_tools: list[EndTurn], active_mcp_servers: list[MCPServer] | None = None) -> pydantic_ai.Agent[Any, Any]
```
- **`get_end_turn_tools`**
```python
Expand Down
40 changes: 40 additions & 0 deletions examples/hello_team.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"""
Example demonstrating Teams functionality in Marvin.
"""

from marvin import Agent, Task
from marvin.agents.team import Swarm


def main():
print("=" * 60)
print("MARVIN TEAMS EXAMPLE")
print("=" * 60)

# Create simple agents
researcher = Agent(
name="Researcher", instructions="You find and analyze information."
)

writer = Agent(name="Writer", instructions="You write clear, engaging content.")

# Create a Swarm team
team = Swarm([researcher, writer])

# Create a task with the team
task = Task(
instructions="Write a one-sentence description of Python programming.",
agents=team,
)

# Run the task
result = task.run()

print(f"\nResult: {result}")
print("\n" + "=" * 60)
print("Teams example completed successfully!")
print("=" * 60)


if __name__ == "__main__":
main()
3 changes: 3 additions & 0 deletions src/marvin/agents/team.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import pydantic_ai
from pydantic_ai.agent import AgentRunResult
from pydantic_ai.mcp import MCPServer

from marvin.agents.actor import Actor
from marvin.agents.names import TEAM_NAMES
Expand Down Expand Up @@ -74,10 +75,12 @@ async def get_agentlet(
self,
tools: list[Callable[..., Any]],
end_turn_tools: list["EndTurn"],
active_mcp_servers: list[MCPServer] | None = None,
) -> pydantic_ai.Agent[Any, Any]:
return await self.active_member.get_agentlet(
tools=self.get_tools() + tools,
end_turn_tools=self.get_end_turn_tools() + end_turn_tools,
active_mcp_servers=active_mcp_servers,
)

def friendly_name(self, verbose: bool = True) -> str:
Expand Down
36 changes: 36 additions & 0 deletions tests/basic/actors/test_team.py
Original file line number Diff line number Diff line change
Expand Up @@ -291,3 +291,39 @@ async def test_team_delegation():
# Delegation tools when agent1 is active (can delegate to agent2)
team.active_member = agent1
assert len(team.get_end_turn_tools()) == 1


async def test_team_get_agentlet_with_mcp_servers():
"""Test that Team.get_agentlet() properly handles active_mcp_servers parameter."""
from unittest.mock import AsyncMock, MagicMock

from pydantic_ai.mcp import MCPServer

Copy link

Copilot AI Aug 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Import statements should be placed at the top of the file rather than inside functions for better code organization and consistency.

Suggested change

Copilot uses AI. Check for mistakes.
# Create agents
agent1 = Agent(name="Agent 1")
agent2 = Agent(name="Agent 2")

# Create team
team = Team(members=[agent1, agent2])

# Mock the active member's get_agentlet method to verify it receives mcp_servers
mock_agentlet = AsyncMock()
team.active_member.get_agentlet = mock_agentlet

# Create mock MCP server
mock_mcp_server = MagicMock(spec=MCPServer)

# Call get_agentlet with mcp_servers
tools = []
end_turn_tools = []
mcp_servers = [mock_mcp_server]

await team.get_agentlet(
tools=tools, end_turn_tools=end_turn_tools, active_mcp_servers=mcp_servers
)

# Verify the active member's get_agentlet was called with the mcp_servers
mock_agentlet.assert_called_once()
call_kwargs = mock_agentlet.call_args.kwargs
assert "active_mcp_servers" in call_kwargs
assert call_kwargs["active_mcp_servers"] == mcp_servers