AWS Builder Center
Building a Smart Placement Mentor Agent with Amazon Bedrock, Strands SDK, and MCP

Building a Smart Placement Mentor Agent with Amazon Bedrock, Strands SDK, and MCP

Campus placements are stressful. I built an AI Placement Assistant using Amazon Bedrock Nova Pro and Strands SDK that checks eligibility, calculates CGPA, analyzes skill gaps, and remembers students across sessions. Here is how I built it in 5 progressive challenges — for AWS User Group Madurai.

Introduction

Campus placements are stressful. Students juggle CGPA calculations, company eligibility rules, interview prep, and skill gaps — all at once. I decided to build an AI-powered placement mentor that could handle all of this intelligently.
Over 5 progressive challenges, I built a full-featured AI Placement Assistant using Amazon Bedrock Nova Pro, Strands SDK, FAISS, and MCP (Model Context Protocol). Each challenge added exactly one new capability, and by the end I had a production-style agent that remembers students across sessions, uses tools intelligently, streams responses in real time, and fetches live AWS documentation.
Here's how I built it — step by step.

The Problem

Every year, thousands of final-year engineering students face the same questions:
  • "Am I eligible for TCS with a 6.8 CGPA?"
  • "What skills do I need for Amazon?"
  • "What is my CGPA if I got these grades?"
These questions have clear, structured answers — but students waste hours searching across websites, asking seniors, and second-guessing themselves. A well-designed AI agent can answer all of this instantly, and even remember the student's profile for the next session.

Challenge 1 — The First Agent (Ollama, Local)

Stack: Strands SDK + Ollama (llama3.2:3b)
The first challenge was intentionally simple: get an agent running with zero cloud dependency.
I used Ollama to run llama3.2:3b locally and connected it to a Strands Agent with a system prompt that guides the agent to answer placement questions intelligently based on the student's inputs.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from strands import Agent
from strands.models.ollama import OllamaModel

ollama_model = OllamaModel(
host="http://localhost:11434",
model_id="llama3.2:3b"
)

agent = Agent(
model=ollama_model,
tools=[],
system_prompt="""You are an AI Placement Assistant.
Company eligibility rules:
- TCS: CGPA >= 6.0, no backlogs
- Infosys: CGPA >= 6.5, no backlogs
- Amazon: CGPA >= 8.0, CS/IT degree, no backlogs
..."""

)

Sample interaction:

1
2
3
You: I am a CSE student with 7.8 CGPA. Am I eligible for Infosys?
Agent: Yes! Infosys requires a minimum CGPA of 6.5. You are eligible.
Here is what you should prepare next...
What I learned: Prompts give the agent personality. Tools give it accuracy. For a placement assistant where wrong information can cost a student an opportunity, the tools layer is what makes the agent trustworthy.

Challenge 2 — Adding Custom Tools (Amazon Bedrock Nova Pro)

Stack: Strands SDK + Amazon Bedrock Nova Pro + 4 custom tools
I switched to Amazon Bedrock Nova Pro for a more capable model and added 4 structured tools using the @tool decorator from Strands.
Tools Built
ToolPurpose
eligibility_checker_toolChecks eligible companies by CGPA, backlogs, degree
cgpa_calculator_toolCalculates CGPA from grades and credit pairs
placement_stats_toolReturns avg/highest package and top roles
company_info_toolReturns interview rounds, bond period, and prep tips
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from strands import Agent, tool
from strands.models.bedrock import BedrockModel

@tool
def eligibility_checker_tool(cgpa: float, backlogs: int, degree: str) -> str:
"""
Check which companies a student is eligible for.

Args:
cgpa: Student CGPA
backlogs: Number of active backlogs
degree: Student degree (e.g. B.Tech, MCA)

Returns:
List of eligible and not-eligible companies with reasons
"""

companies = {
"TCS": {"min_cgpa": 6.0, "max_backlogs": 0},
"Infosys":{"min_cgpa": 6.5, "max_backlogs": 0},
"Amazon": {"min_cgpa": 8.0, "max_backlogs": 0},
# ...
}
# check logic here
The agent now automatically decides when to call a tool versus answering directly. Ask "Am I eligible for Infosys?" and it calls eligibility_checker_tool. Ask "What is OOP?" and it answers from its own knowledge.
What I learned: The @tool decorator in Strands makes it trivially easy to give agents structured, reliable capabilities. Three things are mandatory for every tool: the @tool decorator, type hints on every parameter, and a docstring with Args: and Returns: — the model reads the docstring to understand when and how to call the tool.

Challenge 3 — Persistent Memory with FAISS

Stack: Strands SDK + Bedrock Nova Pro + mem0 + FAISS
The biggest limitation of Challenge 2: the agent forgot everything on restart. A student had to re-introduce themselves every single session.
I added persistent memory using mem0 backed by FAISS (a local vector store) through strands_tools.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from strands_tools import mem0_memory

agent = Agent(
model=bedrock_model,
tools=[mem0_memory],
system_prompt="""You are an AI Placement Assistant with persistent memory.

MEMORY RULES:
- When a student shares their profile (name, CGPA, branch, skills),
ALWAYS store it immediately using your memory tool.
- At the start of every session, recall memory to check if a profile exists.
- Always greet the student by name if you remember them.
"""

)
Session 1:
1
2
You: I am Kaniska, CSE final year, CGPA 8.8, I know Python and SQL.
Agent: Got it Kaniska! I have saved your profile. I will remember this.
Session 2:
1
2
3
4
You: Am I eligible for Amazon?
Agent: Hi Kaniska! Based on your profile (CGPA 8.8),
you are not eligible for Amazon (requires 9.0).
But you are eligible for TCS, Infosys, and Wipro!
What I learned: Memory transforms an agent from a stateless chatbot into a genuine mentor. The combination of FAISS for local vector storage and mem0 for the memory abstraction layer works seamlessly with Strands — the agent decides when to store and when to retrieve entirely on its own.

Challenge 4 — Full Agent: Tools + Memory + Streaming

Stack: Strands SDK + Bedrock Nova Pro + FAISS + 5 tools + streaming callback
Challenge 4 combined everything from Challenges 2 and 3, and added two new capabilities.
New tool — skill_gap_analyzer_tool: Takes the student's skill list and a target company, returns missing skills with a prioritized learning roadmap.
Streaming: Responses now stream token by token instead of waiting for the full generation.
1
2
3
4
5
6
7
8
9
10
11
def stream_callback(**kwargs):
if "data" in kwargs:
print(kwargs["data"], end="", flush=True)
elif "current_tool_use" in kwargs and kwargs["current_tool_use"].get("name"):
print(f"\n🔧 Using tool: {kwargs['current_tool_use']['name']}", flush=True)

agent = Agent(
model=bedrock_model,
tools=[...],
callback_handler=stream_callback
)
Sample interaction:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
You: What should I learn to get into Amazon?

🔧 Using tool: recall_memory
🔧 Using tool: skill_gap_analyzer_tool

Agent: Hi Kaniska! Based on your profile (CGPA 8.8, Python + SQL):

✅ You have: Python, SQL
❌ Missing: DSA (LeetCode level), System Design, Java or C++

📚 Learning Roadmap:
1. DSA — LeetCode Easy → Medium → Hard (start with Arrays, HashMap)
2. System Design — Gaurav Sen YouTube playlist
3. Java or C++ — pick one, complete a full course in 4–6 weeks
The agent automatically recalled Kaniska's profile, called the skill gap tool with her skills and target company, and streamed the personalized response token by token.
What I learned: The callback_handler pattern in Strands is the correct way to implement streaming. The agent's multi-step decision-making — when to use memory, when to call a tool, when to answer directly — is handled entirely by the model given a well-structured system prompt. No orchestration code needed.

Challenge 5 — MCP Agent: Live AWS Documentation

Stack: Strands SDK + Bedrock Nova Pro + FAISS + all tools + MCP Server
The final challenge introduced MCP (Model Context Protocol) — a standard for connecting agents to external data sources at runtime.
I connected the agent to awslabs.aws-documentation-mcp-server, which gives it access to live AWS documentation, real job descriptions, AWS service details, and career path information on demand.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from strands.tools.mcp import MCPClient
from mcp import StdioServerParameters, stdio_client

mcp_client = MCPClient(
lambda: stdio_client(
StdioServerParameters(
command="uvx",
args=["awslabs.aws-documentation-mcp-server@latest"],
env={"FASTMCP_LOG_LEVEL": "ERROR", **os.environ}
)
)
)

with mcp_client:
mcp_tools = mcp_client.list_tools_sync()

agent = Agent(
model=bedrock_model,
tools=[
*local_placement_tools, # all tools from Challenge 4
*mcp_tools # live AWS docs tools
],
callback_handler=stream_callback,
system_prompt="..."
)

Three-Layer Decision Framework

The agent now has three layers of intelligence:
1
2
3
4
5
6
User question
↓
Agent decides:
├── Eligibility / CGPA / skill gap? → local placement tools (instant)
├── Student profile? → memory tools (JSON/FAISS)
└── Real AWS docs / job roles? → MCP server (live data)
Sample interaction:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
You: What is the interview process at Amazon and what should I prepare?

🔧 Using tool: recall_memory
🔧 Using tool: mcp_aws_documentation_search
🔧 Using tool: skill_gap_analyzer_tool

Agent: Amazon has 4 interview rounds:
1. Online Assessment (DSA — 2 problems in 90 mins)
2. Technical Round 1 (Problem Solving)
3. Technical Round 2 (System Design)
4. Bar Raiser (Behavioural + Leadership Principles)

Based on your profile (Python + SQL), focus on DSA first.
You are missing System Design and Java/C++ — here is your roadmap...
What I learned: MCP is the right abstraction for live, authoritative data. Rather than hardcoding company information or building custom API integrations, MCP lets the agent fetch real information on demand through a standard protocol. The Strands SDK treats local tools and MCP tools identically — the agent doesn't know or care which layer it's calling.

Key Takeaways

1. Strands SDK makes agent development fast. The @tool decorator, Agent class, and callback_handler pattern cover 90% of what you need to build a production-ready agent. The boilerplate is minimal.
2. Amazon Bedrock Nova Pro is excellent for agentic tasks. Its tool-use accuracy and instruction-following made the agent's multi-step decision-making reliable without complex prompt engineering.
3. Memory changes everything. Adding FAISS-backed persistence transformed the agent from a stateless Q&A bot into a genuine mentor that builds context over time. Students never have to repeat themselves.
4. MCP is the right abstraction for live data. Rather than hardcoding company data or calling APIs manually, MCP lets the agent fetch authoritative information on demand through a standard protocol.
5. Build incrementally. Each challenge added exactly one new capability. This made debugging easy, the architecture clean, and the final product far more understandable than if everything had been built at once.

Resources

Conclusion

This project was built as part of the Builders Skill Sprint — Nova Month challenge organized by AWS User Group Madurai. Every challenge in this series is a building block — and together they form a complete, deployable AI agent. If you are in the AWS community and want to build something meaningful with Bedrock and Strands SDK, start with a real problem like this one. The tools are ready. The stack is solid. Now go build.
Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!

Your likes, comments, shares, and saves help creators reach more builders.

Loading recommendations

Loading article