<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mindy Jen</title>
    <description>The latest articles on DEV Community by Mindy Jen (@mindy_jen_phd).</description>
    <link>https://dev.to/mindy_jen_phd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3819643%2Fa10f9fcd-e749-48dd-a376-75914863ef55.jpg</url>
      <title>DEV Community: Mindy Jen</title>
      <link>https://dev.to/mindy_jen_phd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mindy_jen_phd"/>
    <language>en</language>
    <item>
      <title>Bridging the Rigidity Gap: Deploying Secure Agentic RAG in Healthcare Governance</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Thu, 04 Jun 2026 22:08:34 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/bridging-the-rigidity-gap-deploying-secure-agentic-rag-in-healthcare-governance-462n</link>
      <guid>https://dev.to/mindy_jen_phd/bridging-the-rigidity-gap-deploying-secure-agentic-rag-in-healthcare-governance-462n</guid>
      <description>&lt;p&gt;In the healthcare industry, data is both an organization's most valuable asset and its most heavily guarded liability. While industries like e-commerce and retail fast-track generative AI prototypes into production overnight, healthcare operates under strict regulatory constraints.&lt;/p&gt;

&lt;p&gt;When healthcare stakeholders try to adopt &lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt; and autonomous AI agent architectures, they face a frustrating paradox: the clinical front lines demand flexible, intelligent context, while the governance board demands strict, unyielding infrastructure controls.&lt;/p&gt;

&lt;p&gt;By analyzing the technical realities of building a secure RAG application with Amazon Bedrock AgentCore and Terraform, we can reveal the deep friction points, operational pain points, and compliance challenges that healthcare organizations must navigate.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Architectural Pain Point: "Flat" Prototypes vs. High-Stakes Clinical Realities
&lt;/h2&gt;

&lt;p&gt;Most generative AI applications start as a proof-of-concept (POC) where an LLM is connected to a single vector database. However, when this flat architecture is introduced to a multi-disciplinary healthcare ecosystem, it fails completely.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Menace of Prompt Injection and Semantic Collision: In a standard RAG setup, an agent is often given "all-powerful" access to scan documents. In a hospital environment, if a clinical lead asks a chatbot about patient metrics on an inpatient ward, a poorly architected agent can be manipulated or experience a semantic collision—inadvertently leaking restricted human resources documents, financial metrics, or data from separate clinical units.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Context Overload and Hallucination: Healthcare data is sprawling and diverse, ranging from patient-reported experience measures (PREMs) and clinical handovers to localized pharmacy guides. Dumping all this multi-modal information into a single flat repository leads to massive lookup noise. The LLM becomes overwhelmed by irrelevant chatter, increasing the risk of hallucination—a flaw that is minor in retail but potentially dangerous in a clinical setting.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. The DevSecOps Dilemma: Fragmented Infrastructure and Configuration Drift
&lt;/h2&gt;

&lt;p&gt;Healthcare IT departments are notorious for being risk-averse, and for good reason: an unstable system directly impacts patient care and data accessibility. Deploying a production-grade agentic system requires a complex suite of components, including serverless agent runtimes, multi-modal knowledge bases, identity user pools, and granular access management policies.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Nightmare of Manual Orchestration: Setting up an AI agent runtime by executing one-off cloud commands works for developers in a sandbox environment. But a week later, it becomes impossible to track if the strict policy engines are still correctly attached to the data gateway.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Burden of Configuration Drift: Without code-driven automated tracking, manual updates to API gateways, memory resources, or user authorization systems create untraceable infrastructure mutations. In a heavily audited healthcare sector, a single undocumented resource configuration can shut down an entire digital pipeline during a compliance review.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. The Security Barrier: Zero-Trust Identity and Data Perimeters
&lt;/h2&gt;

&lt;p&gt;Healthcare stakeholders demand an absolute zero-trust framework. The core difficulty lies in translating conversational, fluid AI interactions into rigid, mathematically verifiable security policies.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Lack of Strict Identity Propagation: When a doctor or executive queries a RAG system, the agent cannot operate using a single master admin key. The system must verify exactly who is asking. If an agent makes downstream tool calls or accesses an S3 storage bucket containing sensitive text files, it must carry that user's specific JSON Web Token (JWT) credentials all the way through the execution pipeline. Integrating these complex identity federation flows across legacy healthcare networks is a major technical hurdle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The PII and Data Sovereignty Trap: Patient narratives and free-text summaries are heavily restricted. Organizations face severe legal liabilities if any clinical or patient information leaves sovereign cloud boundaries. Any automated RAG pipeline must process and scrub data within strict national perimeters while masking personal details, yet somehow preserve critical routing tokens like specific hospital and ward codes so data can still be directed to the correct local dashboard.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Human-In-The-Loop Governance and the "Autonomous" Fear
&lt;/h2&gt;

&lt;p&gt;The final hurdle isn't technological; it is cultural and regulatory. Hospital boards and clinical governance committees are inherently deeply skeptical of autonomous operations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Boundary of Automated Inference: Algorithms excel at parsing thousands of documents to surface complex patterns, but they cannot bypass existing human governance. If a RAG application flags an apparent medicine safety issue or an operational failure on an inpatient ward, it cannot automatically execute a systemic change on its own.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Accountability Void: When an AI agent triggers an API tool call, the legal responsibility remains with the institution. Designing an agent platform that restricts the AI's role to an informational assistant—while providing an immutable, auditable logging trail for every single document retrieval and tool invocation—is a persistent challenge for digital health executives.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Path Forward: Turning Infrastructure into Code
&lt;/h2&gt;

&lt;p&gt;To overcome these challenges, healthcare organizations must move past fragile, hand-built prototypes. The solution requires decoupling the AI's reasoning from the underlying infrastructure management.  &lt;/p&gt;

&lt;p&gt;By adopting centralized, hierarchical orchestration platforms—such as Amazon Bedrock AgentCore to run isolated, specialized worker agents under a strict zero-trust policy engine—and codifying the entire structure using Terraform, healthcare enterprise clients can ensure their systems are repeatable, secure, and fully auditable. This approach allows healthcare teams to confidently bridge the gap between unstructured text and structured, compliant clinical value.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>nlp</category>
      <category>automation</category>
    </item>
    <item>
      <title>Beyond Vibe Coding Trap: Are you still only playing with plain text attempting to solve multi-million dollar "info friction" problems in healthcare?</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Thu, 04 Jun 2026 17:17:32 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/beyond-vide-coding-trap-are-you-playing-with-plain-text-in-an-attempt-to-solve-multi-million-3a7j</link>
      <guid>https://dev.to/mindy_jen_phd/beyond-vide-coding-trap-are-you-playing-with-plain-text-in-an-attempt-to-solve-multi-million-3a7j</guid>
      <description>&lt;p&gt;When we analyze the healthcare sector, it appears to be a massive machine running on data. Jurisdictions invest millions in patient-reported experience measures (PREMs) and data collection pipelines, generating vast data lakes filled with valuable free-text clinical insights and customer sentiment.&lt;/p&gt;

&lt;p&gt;Yet, beneath this massive volume of data lies a structural failure. Healthcare stakeholders—from front-line ward managers and interdisciplinary discharge teams to executive board members—are drowning in a "plain-text trap." They are forced to manage high-stakes operations using fragmented, text-heavy reports and static dashboards that are detached from real-time workflows.&lt;/p&gt;

&lt;p&gt;By synthesizing the operational realities of healthcare governance with the architectural insights of modern &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; Apps, we can expose the deep friction points plaguing healthcare clients and stakeholders.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Operational Pain Point: High-Level Reporting Meets Localized Blindspots
&lt;/h2&gt;

&lt;p&gt;In healthcare administration, macro-level governance analytics are standard practice. Systems can statistically aggregate thousands of qualitative patient survey text files to present high-level trends. But for a clinical ward manager or a nursing lead, these reports suffer from a fatal flaw: they are too generic to drive local Quality Improvement (QI).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Problem of Aggregated Variance: A regional dashboard might show that "Wait Times" or "Communication Gaps" are operational bottlenecks across a dozen hospitals. &lt;strong&gt;However, the underlying clinical reasons differ drastically between a Surgical ward, an Emergency Department, and a Gynaecology unit.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The "One-Size-Fits-None" Trap: When positive and negative feedback points are flattened into a macro report, the nuance is lost. Clinical teams are left with an awareness that a problem exists, but lack any localized context to apply targeted clinical interventions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. The AI &amp;amp; Tech Dilemma: The Fragility of Fragmented Web Apps
&lt;/h2&gt;

&lt;p&gt;To solve this data opacity, healthcare systems are increasingly turning to AI agents and natural language chat interfaces to let staff query clinical insights. For instance, a hospital administrator might ask an AI agent, "What are the main causes of discharge delays on Ward 4B this month?"&lt;/p&gt;

&lt;p&gt;However, text-based AI agent chatflows introduce a severe technical challenge known as the external app breakout.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Disruptive Context Switching: Right now, when a text-based AI agent answers a query, the only way to let the user interact with that data (like filtering data by clinical themes or signing off on a protocol) is by forcing them out of the chat context and into an external legacy web application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Integration Engineering Tax: For enterprise healthcare developers, forcing users into external systems means wrestling with custom APIs, building redundant authentication layers across strict medical perimeters, and taping together fragile state management systems.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. User Experience Challenges: Walls of Text and Conversational Fatigue
&lt;/h2&gt;

&lt;p&gt;Healthcare professionals—especially doctors, pharmacists, and nursing leads—operate in high-stress, time-poor environments. When interacting with modern LLM conversational agents, they face severe conversational fatigue.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Plain-Text Wall: Forcing an emergency doctor or hospital executive to read through massive walls of text, markdown tables, or bulleted descriptions of complex clinical data is fundamentally inefficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Ambiguity of Manual Parsing: If a hospital coordinator needs to schedule staff shifts or log a Plan-Do-Study-Act (PDSA) quality improvement cycle via a chat tool, typing out unstructured text back-and-forth leads to massive parsing errors. Text-based AI chats struggle to efficiently capture specific, structured multi-parameter values (like dates, ward codes, and metric selectors) without multiple iterations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Severe Compliance and Governance Difficulties
&lt;/h2&gt;

&lt;p&gt;No industry faces a more complex web of governance, safety, and privacy mandates than healthcare. Moving toward autonomous AI agent pipelines introduces massive friction with standard operating regulations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Strict PII Redaction Demands: Clinical records and qualitative patient feedback are riddled with Personally Identifiable Information (PII) like patient names, addresses, Medicare numbers, and phone numbers. Healthcare entities face strict regulatory liabilities if any data leaks past secure perimeters. Yet, any filtering engine must selectively keep key routing tokens unmasked—such as hospital names and ward identifiers—so insights can reach the correct local dashboard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sovereign Cloud Data Control: Medical data compliance dictates that no patient records, text files, model inputs, or model outputs may leave national or state sovereign cloud infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The "Side-Effect" Liability: In a clinical setting, an AI cannot simply execute an action autonomously—such as registering a medication safety flag or altering a patient care pathway. Doing so without explicit human-in-the-loop clinical governance is a massive legal and operational risk. Every single data shift, clinical approval, and context update requires a transparent, completely auditable paper trail.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Moving Forward: The Interface Transformation
&lt;/h2&gt;

&lt;p&gt;The core problem for healthcare stakeholders isn't a lack of raw data or analytical intelligence—it is an interface failure. To make qualitative data useful at the frontline, healthcare systems must bridge the gap between AI text reasoning and real-world clinical action.&lt;/p&gt;

&lt;p&gt;By breaking out of the text-only paradigm and integrating secure, bidirectional interactive tools—such as MCP Apps that render interactive metrics and localized forms directly within a secure chat interface—healthcare organizations can finally empower their staff to move seamlessly from insight to clinical intervention without leaving their secure environments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>nlp</category>
      <category>automation</category>
    </item>
    <item>
      <title>Moving from Feedback to Interventions using AI + NLP: A Blueprint for Transforming Patient Insights into Clinical Action</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Thu, 04 Jun 2026 07:18:16 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/moving-from-feedback-to-interventions-a-blueprint-for-transforming-patient-insights-into-clinical-40mf</link>
      <guid>https://dev.to/mindy_jen_phd/moving-from-feedback-to-interventions-a-blueprint-for-transforming-patient-insights-into-clinical-40mf</guid>
      <description>&lt;p&gt;The true test of a healthcare data pipeline isn't how gracefully it visualizes problems—it’s how reliably it translates data points into actionable solutions. Having established that traditional high-level governance reporting often obscures localized pain points, the immediate question remains: How do we fix it?&lt;/p&gt;

&lt;p&gt;A look behind the curtain of Clinical Excellence Healthcare Provider’s Q1 2026 semantic analysis data shows exactly how healthcare systems can transition from passive surveillance to data-driven, continuous quality improvement (CQI). By utilizing automated analysis tools paired with structured, localized action frameworks, we can effectively address key institutional friction points.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faftnp1517yv7wsh79yn3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faftnp1517yv7wsh79yn3.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 1: Mitigating Emergency Room Distress via "Real-Time Waiting Communication"
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Pain Point&lt;/strong&gt;: Long Emergency Department wait times cause deep patient anxiety. However, semantic engines reveal that the real trigger for distress isn't always the capacity wait itself—it’s the "information blackout" patients feel while sitting in the triage room.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;: Rather than waiting on long-term infrastructure overhauls, healthcare leaders can roll out a targeted, Real-Time Waiting Communication Protocol.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Framework: Piloted using a structured 30-minute proactive update protocol for waiting patients, coupled with real-time ED status board integrations and modernized clear physical signage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Proof (Data Signal): In pilot Hospital and Health Services (HHSs) that deployed this communication protocol, negative comments surrounding ED updates dropped significantly from 71% to 53% (a massive -18 percentage point improvement). Meanwhile, comparison hospitals saw stagnant, minimal movement (-2 pp).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8o2t0j4mxbda8gr7781.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8o2t0j4mxbda8gr7781.png" alt=" " width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 2: Standardizing "Teach-Back" Care Transitions Beyond Medication
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Pain Point&lt;/strong&gt;: Patients leaving inpatient wards are frequently disoriented regarding medication updates, post-discharge warning signs, and exactly who to call if they take a turn for the worse at home.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;: Deploy a multi-disciplinary Discharge Teach-Back Expansion Protocol.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Framework: Standardize clinical workflows where discharge coordinators and ward teams don't just hand patients an informational packet; they utilize a formalized "teach-back" validation step. Patients explain back in their own words their understanding of their follow-up care, emergency escalation contacts, and medication updates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Proof (Data Signal): Targeted medication reconciliation pilots using this method yielded a dramatic 57% reduction in medication-related red flags. To solve the broader discharge gap, scaling this clinical teach-back strategy to non-medication discharge guidelines can systematically drive down avoidable readmission risks across any medical-surgical unit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffh55cw95lfsgala23fs8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffh55cw95lfsgala23fs8.png" alt=" " width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 3: Reclaiming Inpatient Healing Environments with "Night-Time Rest Protocols"
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Pain Point&lt;/strong&gt;: Constant beeping equipment alarms, loud staff conversations at central desks, and poorly-timed midnight interventions cause sleep deprivation on inpatient wards, directly impacting patient recovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;: Enforce a strict, structured ward-level Night-Time Rest and Sleep Bundle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Framework: Implement a hard-guided 10 PM to 6 AM protected rest window across inpatient units. This requires clinical teams to execute clustered nursing tasks (reducing non-essential room entries), practice quiet bedside-handover discipline, and engage in telemetry/alarm rationalization to curb sensory overload.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Proof (Data Signal): Across 41 pilot inpatient wards that rolled out this quiet rest framework, negative patient comments regarding sleep plummeted from 78% to 49% (a stark -29 percentage point shift). Non-participating comparison wards saw virtually no shift, confirming that ward-level operational change yields definitive experience improvements.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjo0kyibemhdnminbqzdc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjo0kyibemhdnminbqzdc.png" alt=" " width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 4: Bridging Vulnerabilities via Culturally Stratified Liaison Program Management
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Pain Point&lt;/strong&gt;: Fragmented communication barriers continue to marginalize access and undermine clinical safety for CALD, Aboriginal, and Torres Strait Islander patient populations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;: Expand embedded Cultural Liaison Evaluation Frameworks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Framework: Integrate proactive cultural liaison outreach directly inside high-risk service loops (such as Emergency Departments or complex Outpatient clinics) instead of relying on standard reactive, check-the-box interpreter requests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Proof (Data Signal): Early semantic evaluations tracked an immediate 8 percentage point reduction in negative cultural safety and language friction at pilot sites compared to flatlines at comparison sites, providing clear programmatic justification to continue funding stratified equity programs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhutwm4m5y7nlvn9ifwtv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhutwm4m5y7nlvn9ifwtv.png" alt=" " width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Infrastructure Enabler: Closed-Loop PDSA Governance Tracking
&lt;/h2&gt;

&lt;p&gt;Behind all of these operational fixes sits a programmatic infrastructure requirement: you cannot fix what you do not track in a closed loop. To successfully provide these solutions, a healthcare system must embed text-analytics platforms directly into a Plan-Do-Study-Act (PDSA) registration cycle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PLAN: Register intervention (e.g., ED Update Protocol) and tag target themes.
   │
   ▼
  DO: Roll out protocol to designated pilot units.
   │
   ▼
  STUDY: Semantic analysis engine automatically filters subsequent free-text 
         and compares pilot vs. comparison ward sentiment (Pre vs. Post).
   │
   ▼
  ACT: If validated (e.g., -18pp negative shift), deploy statewide adoption guidance.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By connecting qualitative text engines directly to localized PDSA templates, healthcare executives don't just see a static snapshot of what went wrong. They gain an ongoing validation engine that tells them exactly if what they tried is working. This shifts qualitative patient feedback from a standard administrative metric to the ultimate driver of clinical change.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>nlp</category>
      <category>visualization</category>
    </item>
    <item>
      <title>The Macro Failure of "One-Size-Fits-None" Reporting: Why Healthcare Providers Fail to Act on Patient Feedback</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Thu, 04 Jun 2026 00:36:16 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/the-macro-failure-of-one-size-fits-none-reporting-why-healthcare-providers-fail-to-act-on-4n5o</link>
      <guid>https://dev.to/mindy_jen_phd/the-macro-failure-of-one-size-fits-none-reporting-why-healthcare-providers-fail-to-act-on-4n5o</guid>
      <description>&lt;p&gt;Every month, healthcare jurisdictions pool millions of dollars into collecting Patient-Reported Experience Measures (PREMs). Millions of text files and survey comments flood central data lakes, yet front-line nursing staff and clinical leads rarely see any change. Why? Because the current system suffers from a classic structural failure: jurisdictional data is too generic to drive local quality improvement.&lt;/p&gt;

&lt;p&gt;When high-level governance reporting irons out localized friction, it masks the acute pain points felt at the hospital floor or ward level. Based on real-world semantic data and deployment insights from Clinical Excellence Healthcare Provider (Q1 2026), let's unpack the core stakeholder pain points, system challenges, and friction points across today's healthcare operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Pain Points from Patients (The Consumer Stakeholders)
&lt;/h2&gt;

&lt;p&gt;When analyzing massive text datasets via automated inference engines (such as The Clinician’s Q Engine), positive remarks tend to highlight compassionate, respectful staff interactions. However, statistical variance confirms that negative nuances are easily lost in aggregated data. At the patient level, the loudest, most persistent pain points center around operational communication gaps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Distress of "The Waiting Room Silence": In Emergency Departments (ED), wait times are a known hurdle. Yet, semantic tracking shows that long waits are exacerbated by an institutional lack of communication. As one patient shared: "I waited over [time] and nobody told us what was happening... the care was good once I was seen, but the silence made it frightening." Uncertainty breeds distress, turning a capacity challenge into an experience failure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Discharge Disconnect: Leaving the hospital is a critical care transition, yet it remains highly fragmented. Patients frequently express confusion regarding medication updates, warning signs to watch for, and who to contact if they become unwell post-discharge. They leave feeling medically cleared but informationally stranded.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Environmental Obstacles to Recovery: Inpatient wards are failing to protect fundamental recovery conditions, like sleep. Night-time noise caused by continuous medical equipment alarms, staff conversations, and a lack of quiet bedside-handover discipline severely impacts ward-based rest.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Marginalized Access Barriers: Cultural safety, accessibility, and language support remain significant pain points. Patients from culturally and linguistically diverse (CALD) or Aboriginal and Torres Strait Islander backgrounds often must ask multiple times for basic language help or an interpreter before understanding their immediate care plan.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Operational &amp;amp; Systems Challenges for Healthcare Providers
&lt;/h2&gt;

&lt;p&gt;For hospital executives, ward managers, and clinicians, the problems aren't born out of a lack of empathy; they stem from systems failures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Data Aggregation Disconnect: Standard macro reports offer great board-level data but contain virtually zero actionable value for local Quality Improvement (QI). For instance, looking across a macro system, patients might be statistically twice as likely to report positive aspects over negative ones. However, look closer at the ward level: a Surgical ward and a Gynaecology ward can both report issues on "Wait Times," &lt;strong&gt;but the underlying clinical context and administrative workflow causing those delays differ wildly&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cross-Functional Quality Risks: Discharges are interdisciplinary tasks. When post-discharge care falls short, it demands cross-functional alignment across pharmacy departments, ward nurses, and specific discharge programs. If these units operate in isolation, positive inpatient care can immediately deteriorate into avoidable readmission risks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clinical Safety Gaps: The sheer volume of incoming free-text data makes it impossible for manual staff review to identify critical red flags instantly. Severe safety issues like medication confusion, medication omissions, and potential infection prevention breaches get buried in stacks of paperwork.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Privacy &amp;amp; Governance Difficulties
&lt;/h2&gt;

&lt;p&gt;Implementing automated tools to parse through clinical notes and text feedback brings forth stringent governance and compliance difficulties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Strict PII Masking Demands: Before any free-text narrative can be pushed to clinical dashboards, it must run through a rigorous data redaction engine. Names, phone numbers, addresses, emails, URNs, and Medicare numbers must be scrubbed automatically. However, engines must keep hospital or Health Service names unmasked to preserve regional routing. Managing this balance without human intervention requires highly fine-tuned orchestration pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Data Sovereign Compliance: In modern healthcare infrastructure, strict compliance protocols dictate that no patient feedback, model inputs, or model outputs may leave sovereign cloud jurisdictions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Human-in-the-Loop SLA Burden: Relying strictly on automated artificial intelligence or semantic models creates legal and operational liabilities. If an algorithm flags a candidate "red flag" (e.g., an omitted dose), it cannot trigger an automated incident report directly. It requires strict clinical governance—meaning authorized clinical or pharmacy staff must manually audit these flags within Service Level Agreements (SLAs). Managing the backlog of these pending reviews is an ongoing administrative strain.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;To move from free-text to frontline action, healthcare systems must stop looking at aggregated regional averages. When clinical teams utilize &lt;strong&gt;automated pipelines&lt;/strong&gt; to extract context at the exact level where action occurs—the ward—they can transform passive patient feedback into immediate, structured quality improvements. Structured waiting room protocols, quiet night routines, and teach-back discharge models prove that when we address localized operational points, patient care outcomes shift globally.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>visualization</category>
      <category>automation</category>
    </item>
    <item>
      <title>Building LinkedIN Job Application Agents - Part 3</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Sun, 05 Apr 2026 23:34:17 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/building-linkedin-job-application-agents-part-3-in6</link>
      <guid>https://dev.to/mindy_jen_phd/building-linkedin-job-application-agents-part-3-in6</guid>
      <description>&lt;h2&gt;
  
  
  🎯 Project Overview
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;HunterAgent&lt;/code&gt; transforms the tedious job application process into an intelligent, automated workflow. Instead of spending hours crafting resumes and cover letters for each position, candidates can focus on interview preparation while AI handles the repetitive tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 AI Agent Architecture
&lt;/h2&gt;

&lt;p&gt;The system consists of 6 specialized AI agents, all using OpenAI’s Responses API:&lt;/p&gt;

&lt;p&gt;🔍 JobDiscoveryAgent: Real web search for job opportunities on LinkedIn, Indeed with URL validation&lt;br&gt;
📄 ResumeOptimizerAgent (ResumeManager): AI-powered resume customization with industry research and ATS optimization&lt;br&gt;
✍️ CoverLetterAgent (LetterWriter): Personalized cover letters with live company research and multiple tone variations&lt;br&gt;
🚀 ApplicationSubmitterAgent: Automated form filling and submission using Playwright MCP integration [planned; not implemented yet]&lt;br&gt;
📧 EmailNotificationAgent: Send a daily digest with all matching jobs to your Gmail. [Gmail MCP integration for workflow updates and application confirmations. (planned - not implemented yet)] &lt;br&gt;
👥 NetworkContactsAgent: Identify 3 people or the employee directory in the target company.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Technology Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: Streamlit + Pandas (Python web framework)&lt;/li&gt;
&lt;li&gt;Backend: Integrated Python application&lt;/li&gt;
&lt;li&gt;Database: Supabase (PostgreSQL + Storage)&lt;/li&gt;
&lt;li&gt;AI: OpenAI SDK for intelligent agents&lt;/li&gt;
&lt;li&gt;LinkedIn Scraping: &lt;a href="https://github.com/stickerdaniel/linkedin-mcp-server" rel="noopener noreferrer"&gt;linkedin-mcp-server&lt;/a&gt; via MCP for web scraping&lt;/li&gt;
&lt;li&gt;Indeed Scraping: requests + BeautifulSoup4&lt;/li&gt;
&lt;li&gt;Browser Automation: Playwright&lt;/li&gt;
&lt;li&gt;Email: Python smtplib for notifications (Gmail SMTP)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 Recent Achievements (April 5, 2026)&lt;/p&gt;

&lt;p&gt;✅ ALL 6 AI agents migrated to &lt;code&gt;OpenAI&lt;/code&gt; Responses API&lt;br&gt;
✅ Real web search integration working in production&lt;br&gt;
✅ Fixed all broken imports and API references&lt;br&gt;
✅ Complete multi-agent orchestration system implemented&lt;br&gt;
✅ Production-ready foundation for automated job applications&lt;/p&gt;

&lt;p&gt;📈 Technical Metrics&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agents: 6 production-ready AI agents&lt;/li&gt;
&lt;li&gt;API Migration: 100% Responses API adoption&lt;/li&gt;
&lt;li&gt;Web Search: Real-time job discovery implemented&lt;/li&gt;
&lt;li&gt;Import Issues: All resolved (0 broken imports)&lt;/li&gt;
&lt;li&gt;Test Coverage: All core components verified&lt;/li&gt;
&lt;li&gt;Architecture: Unified BaseAgent pattern established&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyctg3zvau0llvec9pt88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyctg3zvau0llvec9pt88.png" alt=" " width="799" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzd9ykimx8njaq1mbw2a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzd9ykimx8njaq1mbw2a.png" alt=" " width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg81cty1aww8wkb4snb71.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg81cty1aww8wkb4snb71.png" alt=" " width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>openai</category>
      <category>automation</category>
    </item>
    <item>
      <title>Building LinkedIN Job Application Agents - Part 2</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Sat, 04 Apr 2026 22:32:21 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/building-linkedin-job-application-agents-part-2-34af</link>
      <guid>https://dev.to/mindy_jen_phd/building-linkedin-job-application-agents-part-2-34af</guid>
      <description>&lt;h2&gt;
  
  
  The Technology Stack
&lt;/h2&gt;

&lt;p&gt;Here’s what I built the MVP with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: Streamlit + Pandas (Python web framework)&lt;/li&gt;
&lt;li&gt;Backend: Integrated Python application&lt;/li&gt;
&lt;li&gt;Database: Supabase (PostgreSQL + Storage)&lt;/li&gt;
&lt;li&gt;AI: OpenAI SDK for intelligent agents&lt;/li&gt;
&lt;li&gt;LinkedIn Scraping: &lt;a href="https://github.com/stickerdaniel/linkedin-mcp-server" rel="noopener noreferrer"&gt;linkedin-mcp-server&lt;/a&gt; via MCP for web scraping&lt;/li&gt;
&lt;li&gt;Indeed Scraping: requests + BeautifulSoup4&lt;/li&gt;
&lt;li&gt;Browser Automation: Playwright&lt;/li&gt;
&lt;li&gt;Email: Python smtplib for notifications (Gmail SMTP)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Working Features:&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-page Streamlit Application
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dashboard with metrics and analytics&lt;/li&gt;
&lt;li&gt;Navigation between Resume Manager, Job Search, Applications, etc.&lt;/li&gt;
&lt;li&gt;Clean, professional UI with sidebar navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Database Layer with Smart Fallbacks
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Complete ORM with Supabase integration&lt;/li&gt;
&lt;li&gt;Mock mode for development without database&lt;/li&gt;
&lt;li&gt;Proper error handling and graceful degradation&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Configuration Management
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Environment-based configuration&lt;/li&gt;
&lt;li&gt;Secure credential storage &lt;/li&gt;
&lt;li&gt;Easy deployment setup&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Developer Experience
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Comprehensive test suite&lt;/li&gt;
&lt;li&gt;One-command startup script&lt;/li&gt;
&lt;li&gt;Automated health checks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resume Optimization Agent: AI that tailors resumes to job descriptions
&lt;/h2&gt;

&lt;p&gt;Stop Losing Jobs to &lt;code&gt;ATS&lt;/code&gt; Filters: How AI Resume Tailoring Changes Everything&lt;/p&gt;

&lt;p&gt;Getting past Applicant Tracking Systems (ATS) is one of the biggest challenges in today's job market. Even highly qualified candidates get filtered out simply because their resume doesn't contain the right keywords. That's where AI-powered resume tailoring makes a real difference.                                                                    &lt;/p&gt;

&lt;p&gt;With the &lt;code&gt;Resume Optimizer&lt;/code&gt;, you can tailor your resume to any specific job in seconds — no manual rewriting required.    &lt;/p&gt;

&lt;p&gt;Just navigate to the &lt;code&gt;Resume&lt;/code&gt; page, open the &lt;code&gt;Optimize&lt;/code&gt; tab, select a job from your list, and choose your &lt;code&gt;optimization mode&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Three modes are available depending on what your resume needs most:                                                     &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Keyword&lt;/code&gt; mode analyzes the job description and naturally injects missing ATS keywords into your existing content — without making it sound robotic or keyword-stuffed.                                                                   &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Skills&lt;/code&gt; mode intelligently reorders your skills section so the most relevant abilities appear first, instantly signaling to both ATS systems and recruiters that you're a strong match.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Experience&lt;/code&gt; mode rewrites your bullet points using language that mirrors the job description, highlighting achievements and responsibilities most relevant to the role.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each optimization preserves your actual experience — nothing is invented. The result is a resume that speaks the employer's language, passes ATS filters, and puts your best qualifications front and center.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0reajo4dk1ta9m3t00ke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0reajo4dk1ta9m3t00ke.png" alt=" " width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzyxsi5ppai072vni09fr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzyxsi5ppai072vni09fr.png" alt=" " width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jr6hx1itsc56caddjvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jr6hx1itsc56caddjvl.png" alt=" " width="798" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cover Letter Agent: Personalized cover letter generation
&lt;/h2&gt;

&lt;p&gt;Never Send a Generic Cover Letter Again: AI-Powered Personalization at Scale&lt;/p&gt;

&lt;p&gt;A great cover letter can be the difference between landing an interview and being overlooked. But writing a tailored letter for every application is exhausting — most job seekers either skip it or send the same generic template everywhere. AI changes that entirely.&lt;/p&gt;

&lt;p&gt;With the Cover Letter Generator, you can produce a fully &lt;strong&gt;personalized&lt;/strong&gt; cover letter for any job in seconds. Simply select a job from your scraped listings, choose a tone that matches your personality and the company culture, and let &lt;code&gt;GPT-4o-mini&lt;/code&gt; do the writing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Four tones&lt;/strong&gt; are available to suit any situation. &lt;code&gt;Professional&lt;/code&gt; delivers a formal, polished letter built around concrete achievements. &lt;code&gt;Enthusiastic&lt;/code&gt; channels genuine excitement about the role while staying appropriate. &lt;code&gt;Confident&lt;/code&gt; leads with impact statements and asserts your value directly. &lt;code&gt;Creative&lt;/code&gt; opens with a memorable hook that makes your application stand out.&lt;/p&gt;

&lt;p&gt;Behind the scenes, the generator researches the company — its culture, tech stack, and values — and cross-references your resume to highlight the most relevant experience. Every letter is three focused paragraphs, written specifically for that company and role.&lt;/p&gt;

&lt;p&gt;The result is a cover letter that feels human, reads naturally, and speaks directly to what the employer is looking for — generated in under 30 seconds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feq5agsi2xtksjda0bk5u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feq5agsi2xtksjda0bk5u.png" alt=" " width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ortmsa1yxs4nym8fjfx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ortmsa1yxs4nym8fjfx.png" alt=" " width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>openai</category>
      <category>automation</category>
    </item>
    <item>
      <title>Building LinkedIN Job Application Agents - Part 1</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Sat, 04 Apr 2026 15:49:46 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/building-linkedin-job-application-agents-part-1-13k</link>
      <guid>https://dev.to/mindy_jen_phd/building-linkedin-job-application-agents-part-1-13k</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: Job Applications Are a Time Sink
&lt;/h2&gt;

&lt;p&gt;Job searching is broken. Candidates spend hours crafting resumes for each position, writing personalized cover letters, and manually filling out repetitive application forms. What if we could automate this entire process using AI?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That’s exactly what I set out to build: HunterAgent&lt;/strong&gt; — an AI-powered system that automatically discovers jobs, optimizes resumes, generates cover letters, and submits applications on behalf of job seekers.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Plan (Mar. 2026): Full Automation Stack
&lt;/h2&gt;

&lt;p&gt;The vision was ambitious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Job Discovery Agent: Scrape job sites using web automation&lt;/li&gt;
&lt;li&gt;Resume Optimization Agent: AI-powered resume customization for each job&lt;/li&gt;
&lt;li&gt;Cover Letter Agent: Generate personalized cover letters&lt;/li&gt;
&lt;li&gt;Application Submission Agent: Automate form filling and submission&lt;/li&gt;
&lt;li&gt;Email Notification Agent: Keep users informed of all activities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A technical deep-dive into integrating AI agents with &lt;code&gt;Streamlit&lt;/code&gt; UI and &lt;code&gt;Supabase&lt;/code&gt; for job application automation -&lt;/p&gt;

&lt;p&gt;The Journey So Far...&lt;/p&gt;

&lt;p&gt;Today marks a significant milestone in the HunterAgent project — I’ve successfully transformed three standalone AI agents into a fully integrated web application with persistent data storage. This blog post chronicles the technical challenges, architectural decisions, and breakthrough moments that brought our job application automation system to life.&lt;/p&gt;

&lt;p&gt;What had been Built Today:&lt;/p&gt;

&lt;p&gt;Core Achievement: Complete System Integration&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3 AI Agents fully integrated with Streamlit UI&lt;/li&gt;
&lt;li&gt;Supabase Database with 11 production tables&lt;/li&gt;
&lt;li&gt;Real-time Processing with async/await patterns&lt;/li&gt;
&lt;li&gt;Persistent Data Storage for all agent results&lt;/li&gt;
&lt;li&gt;Production-Ready Application running at localhost:8501&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Three AI Agents
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Resume Optimization Agent
&lt;/h4&gt;

&lt;p&gt;Purpose: AI-powered resume customization for specific job applications&lt;/p&gt;

&lt;p&gt;Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resume parsing and content extraction&lt;/li&gt;
&lt;li&gt;AI-powered optimization with company research&lt;/li&gt;
&lt;li&gt;Quality scoring and match analysis&lt;/li&gt;
&lt;li&gt;Multiple optimization approaches (keyword-focused, skills-based, experience-focused)&lt;/li&gt;
&lt;li&gt;Downloadable optimized resumes&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cover Letter Generation Agent
&lt;/h4&gt;

&lt;p&gt;Purpose: Personalized cover letter creation with company research&lt;/p&gt;

&lt;p&gt;Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple letter tones (professional, enthusiastic, confident, creative)&lt;/li&gt;
&lt;li&gt;Company research integration&lt;/li&gt;
&lt;li&gt;Candidate information processing&lt;/li&gt;
&lt;li&gt;Cover letter library with search and filtering&lt;/li&gt;
&lt;li&gt;Quality scoring and personalization metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Job Discovery Agent
&lt;/h4&gt;

&lt;p&gt;Purpose: Intelligent job search with market analysis&lt;/p&gt;

&lt;p&gt;Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-criteria job search&lt;/li&gt;
&lt;li&gt;Market trend analysis&lt;/li&gt;
&lt;li&gt;Company research capabilities&lt;/li&gt;
&lt;li&gt;Saved jobs management&lt;/li&gt;
&lt;li&gt;Real-time filtering and sorting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7cqpcmvlsxrir9hx7d9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7cqpcmvlsxrir9hx7d9.png" alt=" " width="799" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenAI Responses API Integration
&lt;/h3&gt;

&lt;p&gt;We chose OpenAI’s new Responses API for its structured output capabilities and web search integration. This allows our agents to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Access real-time company information&lt;/li&gt;
&lt;li&gt;Generate structured JSON responses&lt;/li&gt;
&lt;li&gt;Handle complex multi-step reasoning&lt;/li&gt;
&lt;li&gt;Integrate web search seamlessly &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Streamlit UI Framework
&lt;/h3&gt;

&lt;p&gt;Streamlit provided the perfect balance of simplicity and functionality:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rapid Development: Built complete UI in hours, not days&lt;/li&gt;
&lt;li&gt;Session State Management: Persistent data across user interactions&lt;/li&gt;
&lt;li&gt;Async Support: Native support for async/await patterns&lt;/li&gt;
&lt;li&gt;Component Ecosystem: Rich set of UI components out of the box&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Supabase Database Integration
&lt;/h3&gt;

&lt;p&gt;Supabase offered the ideal backend solution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;PostgreSQL: Full SQL capabilities with JSON support&lt;/li&gt;
&lt;li&gt;Real-time Features: Live updates and subscriptions&lt;/li&gt;
&lt;li&gt;REST API: Easy integration with Python&lt;/li&gt;
&lt;li&gt;Row Level Security: Built-in security features
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Database&lt;/span&gt; &lt;span class="k"&gt;Schema&lt;/span&gt; &lt;span class="n"&gt;Design&lt;/span&gt;

&lt;span class="n"&gt;Core&lt;/span&gt; &lt;span class="n"&gt;Tables&lt;/span&gt;
&lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;Users&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;full_name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;avatar_url&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;Resume&lt;/span&gt; &lt;span class="n"&gt;templates&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resume_templates&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;file_url&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;is_default&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;Specific&lt;/span&gt; &lt;span class="n"&gt;Tables&lt;/span&gt;
&lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agent_results&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;agent_type&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;task_type&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;input_data&lt;/span&gt; &lt;span class="n"&gt;JSONB&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;output_data&lt;/span&gt; &lt;span class="n"&gt;JSONB&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;error_message&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;Cover&lt;/span&gt; &lt;span class="n"&gt;letters&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cover_letters&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;job_title&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;company_name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;cover_letter_content&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;quality_score&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;generation_type&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;agent_result_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agent_results&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;Optimized&lt;/span&gt; &lt;span class="n"&gt;resumes&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;optimized_resumes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;original_resume_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resume_templates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;job_title&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;company_name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;optimized_content&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;job_match_score&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;optimization_type&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;agent_result_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agent_results&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Technical Challenges Overcome
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;LinkedIn scraping via Windows MCP server (repost + 100-applicant filter active)&lt;/li&gt;
&lt;li&gt;Job scoring with GPT-4o-mini (ATS fit score 0–100)
&lt;/li&gt;
&lt;li&gt;Resume tailoring + cover letter generation with GPT-4o-mini                                                                                                                                         4. LinkedIn Easy Apply automation (Playwright)
&lt;/li&gt;
&lt;li&gt;Email digest
&lt;/li&gt;
&lt;li&gt;Dashboard with full pipeline button
                                                                                                                                                                                                       Before each session, start the MCP server in Windows PowerShell:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx linkedin-scraper-mcp &lt;span class="nt"&gt;--transport&lt;/span&gt; streamable-http &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8765  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  HunterAgent — Step-by-Step Guide
&lt;/h2&gt;

&lt;p&gt;First-Time Setup (do once)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start the LinkedIn MCP server — open Windows PowerShell and run:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx linkedin-scraper-mcp &lt;span class="nt"&gt;--transport&lt;/span&gt; streamable-http &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8765
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Leave this window open in the background.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start the app — in your terminal:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;streamlit run streamlit_app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Check the dashboard — confirm the green LinkedIn MCP server: connected status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dd0da7qa7f4fpoxqd4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dd0da7qa7f4fpoxqd4n.png" alt=" " width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure your profile — open the app and go to Settings:

&lt;ul&gt;
&lt;li&gt;Keywords: software engineer, python developer (comma-separated)&lt;/li&gt;
&lt;li&gt;Location: Remote or New York, NY&lt;/li&gt;
&lt;li&gt;Resume Text: paste your full resume&lt;/li&gt;
&lt;li&gt;Companies Not Included: any companies to skip&lt;/li&gt;
&lt;li&gt;Notification Email: your Gmail address&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqwzbfm5btu14zd0lrhb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqwzbfm5btu14zd0lrhb.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;  &lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>claude</category>
      <category>programming</category>
    </item>
    <item>
      <title>Boost Your Agents with MCPs - Launch First Real-world Agentic App</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Fri, 27 Mar 2026 17:21:56 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/boost-your-agents-with-mcps-launch-first-real-world-agentic-app-3lbc</link>
      <guid>https://dev.to/mindy_jen_phd/boost-your-agents-with-mcps-launch-first-real-world-agentic-app-3lbc</guid>
      <description>&lt;h2&gt;
  
  
  Why MCP?
&lt;/h2&gt;

&lt;p&gt;MCP stands for &lt;strong&gt;Model Context Protocol&lt;/strong&gt;. Think of it as a standardised USB-C port for AI tools. Instead of every AI application inventing its own plugin system, MCP defines a common interface: a server exposes tools, a client (our agent here) discovers and calls them. The beauty is that the same MCP server can be reused by Claude Desktop, by a Strands agent, by any MCP-compatible client — without changing a single line of server code. This is the interoperability that the ecosystem has been missing. Here, we use FastMCP, a Python library that reduces an MCP server to almost nothing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mcp.server&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;

&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Calculator Server&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Add two numbers together&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stdio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a fully functional MCP server. The decorator &lt;a class="mentioned-user" href="https://dev.to/mcp"&gt;@mcp&lt;/a&gt;.tool is all you need to expose a function to any MCP client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review: Our Analyst (Sub-agent)
&lt;/h2&gt;

&lt;p&gt;We start with creating our first toolkit: an analyst. Running two terminals — one for the server, the other for the client — we immediately see the protocol in action.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fss2olkv8zdgz9ee8q8u3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fss2olkv8zdgz9ee8q8u3.png" alt=" " width="606" height="1183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The client (our agent here) connects, discovers the available tools (addition, subtraction, multiplication, and division), and calls them through the protocol (MCP). The agent calls a function without knowing whether the toolkit lives in a separate process or not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vedfdty5ub98gyzznfh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vedfdty5ub98gyzznfh.png" alt=" " width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The toolkit definitely resides within a server. The client (our agent here) receives a structured description and autonomously decides when and how to invoke the tool. No prompt engineering is needed to explain what the &lt;code&gt;addition&lt;/code&gt; does. &lt;/p&gt;

&lt;h2&gt;
  
  
  Review: Our Weather Forecaster (Sub-agent)
&lt;/h2&gt;

&lt;p&gt;The second toolkit is to introduce a weather forecaster that speaks the National Weather Service API. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qkubyabqpr9eyagqar2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qkubyabqpr9eyagqar2.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The weather forecaster on a server exposes three tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;get_alerts&lt;/code&gt;(state) - active weather alerts by US state code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_forecast&lt;/code&gt;(latitude, longitude) - multi-period forecast for a location&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_current_weather&lt;/code&gt;(latitude, longitude) - live conditions from the nearest observation station&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The implementation of the toolkit is fully &lt;code&gt;async&lt;/code&gt;, using &lt;code&gt;httpx&lt;/code&gt; for HTTP calls. We can call any external API, read from a database, run a subprocess - whatever our agent needs. The MCP layer is one communication contract between the agent (client) and a server where toolkits reside.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_forecast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Get weather forecast for a location.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;points_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;NWS_API_BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/points/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;points_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;make_nws_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;points_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;forecast_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;points_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;forecast&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;forecast_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;make_nws_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forecast_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# format and return
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Supervisor Agent (Head)
&lt;/h2&gt;

&lt;p&gt;Now we connect the dots. A supervisor-mode Strands agent built upon the Amazon Bedrock (Claude Sonnet) is given access to controlling multiple toolkits simultaneously via MCP. When we ask the supervisor something like: “What should I have for lunch given today’s weather in New York?”, the supervisor will leverage the magic power of MCP to pass along the command to different toolkits (sub-agents). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff029yjfomyl5713h420z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff029yjfomyl5713h420z.png" alt=" " width="800" height="1015"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The supervisor figures out that s/he needs to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calls the weather forecaster to get current conditions in New York&lt;/li&gt;
&lt;li&gt;Reasons which food delivery service makes sense in terms of the current temperature and traffic conditions&lt;/li&gt;
&lt;li&gt;Returns a recommendation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1mk7xv82wsdbtj96mna.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1mk7xv82wsdbtj96mna.png" alt=" " width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, the agent is not just completing the prompt texts. Instead, it is orchestrating tool calls, chaining results, and synthesising an answer. The Strands SDK handles the entire tool call loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockModel&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands.tools.mcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MCPClient&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;BedrockModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;anthropic.claude-sonnet-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;calculator_tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;weather_tools&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What should I eat for lunch in New York today?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Build A Text Analyzer (Sub-agent) From Scratch
&lt;/h2&gt;

&lt;p&gt;We can build a text analyzer to shorten the length of a URL. More importantly, we can internalize the URL pattern.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fml8a788n07lupt7s1acz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fml8a788n07lupt7s1acz.png" alt=" " width="800" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The server exposes four tools: &lt;code&gt;shorten_url&lt;/code&gt;, &lt;code&gt;expand_url&lt;/code&gt;, &lt;code&gt;get_url_stats&lt;/code&gt;, and &lt;code&gt;analyze_text&lt;/code&gt;. The implementation uses an in-memory JSON store (with a note that production code would use a real database). Here is the shortener:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Shorten a long URL into a compact format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;shorten_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;custom_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;short_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()[:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="c1"&gt;# store and return
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;short_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;short.ly/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;short_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;: Any Python function can become an AI tool in minutes. Have a legacy internal API? Wrap it. Have a spreadsheet formula? Wrap it. The barrier is almost zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch Our Agentic App (Research Analyzer) via Bedrock AgentCore
&lt;/h2&gt;

&lt;p&gt;From the development, we have our agent access toolkits via MCP locally over the &lt;code&gt;stdio&lt;/code&gt; transport. On the other hand, the real production systems need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Persistent&lt;/strong&gt; endpoints accessible over HTTPS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IAM-based&lt;/strong&gt; authentication (no open endpoints)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container&lt;/strong&gt; packaging for reproducible deployments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-scaling&lt;/strong&gt; based on load&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Amazon Bedrock AgentCore Runtime handles all of this. The deployment script is deceptively short:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bedrock_agentcore_starter_toolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;

&lt;span class="n"&gt;agentcore_runtime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Runtime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agentcore_runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;entrypoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text_utils_server.py&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;auto_create_execution_role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;auto_create_ecr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;requirements_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;requirements.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MCP&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text_utils_mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;launch_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agentcore_runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Agent ARN: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;launch_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agent_arn&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7zjcz46m3j5nous0fq5p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7zjcz46m3j5nous0fq5p.png" alt=" " width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Under the hood, the &lt;code&gt;bedrock_agentcore_starter_toolkit&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Packages your server and its dependencies into a Docker container&lt;/li&gt;
&lt;li&gt;Pushes it to ECR (auto-created if it does not exist)&lt;/li&gt;
&lt;li&gt;Creates an IAM execution role with least-privilege permissions&lt;/li&gt;
&lt;li&gt;Deploys to AgentCore Runtime and returns a live ARN&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After deployment (around 3–5 minutes), we update our agentic App configuration to point to the remote endpoint.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27f4bj5rs7z2smxxgqlo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27f4bj5rs7z2smxxgqlo.png" alt=" " width="800" height="823"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The remote MCP server is protected by &lt;strong&gt;AWS IAM via SigV4 signatures&lt;/strong&gt; — the same signing mechanism used by every other AWS API. Here, we include a custom transport class that handles this transparently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SigV4HTTPXAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Auth&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SigV4Auth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;auth_flow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;aws_request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AWSRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_auth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aws_request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aws_request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This extends HTTPX’s auth interface and plugs directly into the MCP &lt;code&gt;StreamableHTTPTransport&lt;/code&gt;. Our agentic App continues to call tools with the exact same code - authentication is completely transparent at the transport layer. No API keys in environment variables, no token rotation to manage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1y6enx6ibu44p6l5numo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1y6enx6ibu44p6l5numo.png" alt=" " width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the remote server is alive, activating it in the agentic app is a toggle:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fte5r5kt0qotm9fmmf1lx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fte5r5kt0qotm9fmmf1lx.png" alt=" " width="799" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting Everything Altogether - Our Agentic App (Research Analyzer)
&lt;/h2&gt;

&lt;p&gt;With the full stack in place — local servers, remote AgentCore server, SigV4 auth — our agentic app that combines all tools is now formed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficp80juade7ztwhrpjzs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficp80juade7ztwhrpjzs.png" alt=" " width="799" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The "Research Analyzer" can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetch and summarise web content&lt;/li&gt;
&lt;li&gt;Analyse and transform text (via the remote AgentCore server)&lt;/li&gt;
&lt;li&gt;Shorten URLs from its research&lt;/li&gt;
&lt;li&gt;Check the weather for context-aware suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All from natural language. All with tools that any developer could have written in an afternoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Multi-Tool Orchestration Layer
&lt;/h2&gt;

&lt;p&gt;Now, let's explore advanced implementation patterns — how to structure agents that manage many tools gracefully, handle tool failures, and maintain context across a conversation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1nrkpc04siyl760zdsb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1nrkpc04siyl760zdsb.png" alt=" " width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few things worth highlighting from &lt;code&gt;main.py&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Tool cache with TTL&lt;/code&gt;: tools are loaded once at startup and refreshed on demand, avoiding re-negotiation on every request&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Session-scoped agents&lt;/code&gt;: each user session gets its own agent instance with isolated memory&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Structured logging per server&lt;/code&gt;: each MCP server has its own log stream, invaluable for debugging multi-server interactions
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;refresh_tools_cache&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;cached_tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools_last_updated&lt;/span&gt;
    &lt;span class="n"&gt;cached_tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mcp_manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_all_tools&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;active_only&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tools_last_updated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern, loading tools once and reusing them, becomes critical at scale. Negotiating the MCP protocol on every request adds latency; &lt;strong&gt;caching eliminates it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MCP is the right abstraction. The separation between tool definition (server) and tool consumption (client/agent) is clean and powerful. It enables a genuine ecosystem of reusable tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;FastMCP&lt;/code&gt; makes it trivial to start. Going from idea to working MCP server takes minutes, not days. The barrier to contributing tools to the ecosystem is essentially zero.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AgentCore&lt;/code&gt; closes the last mile. The hardest part of agentic AI in production is not the model or the tools — it is infrastructure: endpoints, auth, containers, scaling. AgentCore Runtime handles all of it with three lines of configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;SigV4&lt;/code&gt; is the right auth for AWS-native stacks. No secret management overhead, no token rotation, automatic credential refresh. If your infrastructure is already on AWS, this is the obvious choice.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>mcp</category>
      <category>python</category>
    </item>
    <item>
      <title>Boost Your Agents with MCPs - Productivity Customized Tools</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Sun, 22 Mar 2026 04:45:10 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/boost-your-agents-with-mcps-productivity-customized-tools-3k7l</link>
      <guid>https://dev.to/mindy_jen_phd/boost-your-agents-with-mcps-productivity-customized-tools-3k7l</guid>
      <description>&lt;h2&gt;
  
  
  A. Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Calendar Integration
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Intelligence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;create_event&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Schedule new meetings/appointments&lt;/td&gt;
&lt;td&gt;Conflict detection, optimal time suggestions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;list_events&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;View calendar for specific dates&lt;/td&gt;
&lt;td&gt;Smart filtering, availability analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;check_availability&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Find free time slots&lt;/td&gt;
&lt;td&gt;Multi-day search, duration-aware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;delete_event&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remove scheduled events&lt;/td&gt;
&lt;td&gt;Cascade handling, notification support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  b. Weather Intelligence
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Intelligence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;get_alerts&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Get weather alerts for US states&lt;/td&gt;
&lt;td&gt;Real-time severe weather notifications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;get_forecast&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-day weather predictions&lt;/td&gt;
&lt;td&gt;Official NWS forecasts with detailed periods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;get_current_weather&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Current observation data&lt;/td&gt;
&lt;td&gt;Real-time conditions from weather stations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  c. Analyzer
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Intelligence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;add&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add two numbers together&lt;/td&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;subtract&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Subtract second number from first number&lt;/td&gt;
&lt;td&gt;Comparison&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;multiply&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multiply two numbers together&lt;/td&gt;
&lt;td&gt;multiplication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;divide&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Divide first number by second number&lt;/td&gt;
&lt;td&gt;Percentage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;power&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;power of a number&lt;/td&gt;
&lt;td&gt;Repitition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;factorial&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;factorial of positive number&lt;/td&gt;
&lt;td&gt;Is It A Prime Number?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  B. Testing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a. Calendar
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fodfhbi4bgbob3jmc6pc0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fodfhbi4bgbob3jmc6pc0.png" alt=" " width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Natural Language Queries
&lt;/h4&gt;

&lt;p&gt;Try these conversational requests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Expected Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"Schedule a team meeting tomorrow at 2pm"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Creates event, checks conflicts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"Do I have anything on Friday afternoon?"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lists events for specified time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"Find me 30 minutes free time this week"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Suggests available slots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"Cancel my 3pm meeting today"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Finds and removes matching event&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  2. Complex Scenarios
&lt;/h4&gt;

&lt;p&gt;The AI agent can handle complex requests as well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I need to schedule a 90-minute project review with the team. I'm free Tuesday and Wednesday afternoons. What works best?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent Process:
1. Calls check_availability() for Tuesday/Wednesday afternoons
2. Finds optimal 90-minute slots
3. Suggests best options based on preferences
4. Creates event when user confirms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Error Handling
&lt;/h4&gt;

&lt;p&gt;The calendar server handles various edge cases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error Type&lt;/th&gt;
&lt;th&gt;Handling&lt;/th&gt;
&lt;th&gt;User Experience&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Invalid Date Format&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Parse error with format help&lt;/td&gt;
&lt;td&gt;"Please use format: YYYY-MM-DD HH:MM"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Past Date Scheduling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Validation with warning&lt;/td&gt;
&lt;td&gt;"Cannot schedule events in the past"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File Corruption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Backup and recovery&lt;/td&gt;
&lt;td&gt;Graceful fallback to empty calendar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Concurrent Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;File locking&lt;/td&gt;
&lt;td&gt;Prevents data corruption&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  b. Weather
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9zk4xefl67r8w7amafg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9zk4xefl67r8w7amafg.png" alt=" " width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Natural Language Queries
&lt;/h4&gt;

&lt;p&gt;Try these conversational weather requests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Expected Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"Get current weather for Seattle"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Current conditions from nearest station&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"Show me the forecast for San Francisco"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5-day detailed forecast periods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"Are there any weather alerts in California?"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Active severe weather alerts for CA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"What's the weather like in New York?"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Current observations with temperature&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  2. Error Handling
&lt;/h4&gt;

&lt;p&gt;The server handles various failure modes gracefully:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network timeouts: 30-second timeout prevents hanging&lt;/li&gt;
&lt;li&gt;Invalid coordinates: Clear error messages for bad inputs&lt;/li&gt;
&lt;li&gt;API unavailable: Graceful degradation with error messages&lt;/li&gt;
&lt;li&gt;Missing data: Handles null/missing fields safely&lt;/li&gt;
&lt;li&gt;State code validation: Validates US state codes for alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  c. Analyzer
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhw31gikunqme4zzn1lge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhw31gikunqme4zzn1lge.png" alt=" " width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Natural Language Queries (Natural Language → Tool Mapping)
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Expected Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"add 25 and 17"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;→ add(x=25, y=17)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"25 plus 17"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;→ add(x=25, y=17)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"what's 25 + 17"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;→ add(x=25, y=17)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"sum of 25 and 17"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;→ add(x=25, y=17)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"15% of 200"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;→ percentage(number=200, percent=15)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"what is 15 percent of 200"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;→ percentage(number=200, percent=15)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"square root of 64"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;→ square_root(x=64)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"sqrt(64)"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;→ square_root(x=64)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  2. Complex Query Handling
&lt;/h4&gt;

&lt;p&gt;For complex queries like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I have $1000, spend $234 on groceries and $156 on gas. How much is left?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent breaks down the problem
Calls subtract(1000, 234) → 766
Calls subtract(766, 156) → 610
Responds: "You have $610 left"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Error Handling
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cannot divide by zero&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Provides clear error messages&lt;/li&gt;
&lt;li&gt;Prevents invalid operations&lt;/li&gt;
&lt;li&gt;Errors are automatically sent back to AI agent&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>mcp</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Boost Your Agents with MCPs - MCP Fundamentals</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Sun, 22 Mar 2026 00:42:44 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/boost-your-agents-with-mcps-mcp-fundamentals-14ok</link>
      <guid>https://dev.to/mindy_jen_phd/boost-your-agents-with-mcps-mcp-fundamentals-14ok</guid>
      <description>&lt;p&gt;We want to get every reader familiar with using MCP as a tool with LLMs to accomplish productivity tasks for our daily needs. We will see how LLMs can use multiple tools in concert to accomplish more advanced tasks.&lt;/p&gt;

&lt;p&gt;We will first learn the core concepts of MCP by building our first intelligent tool - an analyst that understands natural language and provides contextual responses. This exercise will introduce everyone to MCP, the universal open standard for connecting AI systems with data sources and demonstrate its capabilities.&lt;/p&gt;

&lt;p&gt;An analyst MCP server that goes beyond simple arithmetic:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Natural Language Processing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Understands conversational math/statistics queries&lt;/td&gt;
&lt;td&gt;"What's 15% of 250?" → Calculation + explanation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context Awareness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remembers previous analyses&lt;/td&gt;
&lt;td&gt;References earlier results in conversation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Graceful handling of invalid inputs&lt;/td&gt;
&lt;td&gt;Clear messages for division by zero, invalid syntax&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rich Responses&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detailed explanations with breakdowns&lt;/td&gt;
&lt;td&gt;Step-by-step calculation process&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What we need to do...
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;MCP Architecture: Understand how MCP connects AI models to tools&lt;/li&gt;
&lt;li&gt;Server Implementation: Build a working MCP server from scratch&lt;/li&gt;
&lt;li&gt;Tool Registration: Register functions that AI models can discover&lt;/li&gt;
&lt;li&gt;Response Formatting: Structure responses for optimal AI interaction&lt;/li&gt;
&lt;li&gt;Integration Testing: Test our server with the application&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A. MCP Protocol Overview
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; is an open standard designed to create a universal interface between AI models and external tools, data, and services. By using &lt;strong&gt;Bedrock AgentCore Runtime&lt;/strong&gt;, developers can transition these tools from local functions to secure, enterprise-grade managed microservices.&lt;/p&gt;

&lt;h4&gt;
  
  
  Core Concepts of MCP
&lt;/h4&gt;

&lt;p&gt;The protocol replaces custom, one-off integrations with a standardized request-response pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standardization&lt;/strong&gt;: Provides a single protocol for all tools (e.g., same interface for analysis or weather tools).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interoperability&lt;/strong&gt;: Works across different models (Claude, GPT, Nova) using the same toolset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Implements sandboxed execution, parameter validation via JSON Schema, and controlled access patterns.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Communication &amp;amp; Message Types
&lt;/h4&gt;

&lt;p&gt;MCP follows a structured flow to ensure the AI model understands and executes tools correctly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool &lt;strong&gt;Discovery&lt;/strong&gt; (&lt;code&gt;tools/list&lt;/code&gt;): The model identifies accessible tools and their required parameters (schemas).&lt;/li&gt;
&lt;li&gt;Tool &lt;strong&gt;Execution&lt;/strong&gt; (&lt;code&gt;tools/call&lt;/code&gt;): The model sends structured arguments to a specific tool to perform tasks beyond its internal knowledge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport&lt;/strong&gt; Methods: Supports &lt;strong&gt;stdio&lt;/strong&gt; (standard input/output) for local development, as well as &lt;strong&gt;HTTP&lt;/strong&gt; and &lt;strong&gt;WebSockets&lt;/strong&gt; for remote or real-time applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7g5aaibu3073zvwxkh5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7g5aaibu3073zvwxkh5.png" alt=" " width="800" height="888"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Production Deployment with AgentCore
&lt;/h4&gt;

&lt;p&gt;While local tools are useful for development, &lt;code&gt;Bedrock AgentCore Runtime&lt;/code&gt; provides the infrastructure for production scaling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Managed Infrastructure&lt;/strong&gt;: Moves tools to managed services, removing the burden of server maintenance and scaling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Security&lt;/strong&gt;: Integrates with Amazon Cognito to enforce strict authentication, ensuring only authorized agents can trigger sensitive operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Integration&lt;/strong&gt;: A Strands Agent can connect to a remote MCP server and handle authentication handshakes automatically, consuming cloud tools as if they were local functions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Summary Table: Benefits of Managed MCP&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Local MCP (stdio)&lt;/th&gt;
&lt;th&gt;Managed AgentCore Runtime&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Development &amp;amp; testing&lt;/td&gt;
&lt;td&gt;Enterprise-scale production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local process isolation&lt;/td&gt;
&lt;td&gt;Amazon Cognito Authentication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scaling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual/Local&lt;/td&gt;
&lt;td&gt;AWS-handled auto-scaling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited to one machine&lt;/td&gt;
&lt;td&gt;Shareable across teams/agents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;: This architecture allows developers to build a reusable library of secure MCP tools that any agent in an organization can invoke with minimal code.&lt;/p&gt;

&lt;h3&gt;
  
  
  B. Key MCP Concepts
&lt;/h3&gt;

&lt;p&gt;Deploying custom tools at scale requires moving beyond local functions to a managed infrastructure that is secure, authenticated, and scalable. &lt;strong&gt;Bedrock AgentCore Runtime&lt;/strong&gt; enables the deployment of &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; servers as managed services, transitioning tools from local Python decorators to enterprise-grade microservices.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Building and Deploying an MCP Server
&lt;/h4&gt;

&lt;p&gt;The development process is simplified using the &lt;code&gt;FastMCP&lt;/code&gt; framework, which automates protocol message formatting and JSON Schema generation.&lt;/p&gt;

&lt;h5&gt;
  
  
  a. Define the Local Server
&lt;/h5&gt;

&lt;p&gt;Using &lt;code&gt;FastMCP&lt;/code&gt;, you can quickly define tools with standard Python &lt;strong&gt;type hints&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mcp.server&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;

&lt;span class="c1"&gt;# Create the MCP server instance
&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyzer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Register a tool; FastMCP handles the schema generation automatically
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Add two numbers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;

&lt;span class="c1"&gt;# Run using stdio for local testing
&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stdio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  b. Deploy to AgentCore Runtime
&lt;/h5&gt;

&lt;p&gt;Once containerized, the server is registered with the Runtime Client to become a managed cloud service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bedrock_agentcore.tools.runtime_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RuntimeClient&lt;/span&gt;

&lt;span class="n"&gt;runtime_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RuntimeClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Deploy with Cognito security
&lt;/span&gt;&lt;span class="n"&gt;mcp_server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;runtime_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_mcp_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SearchService&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-docker-image-uri&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;auth_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COGNITO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_pool_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1_xxxxxxxxx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;client_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;xxxxxxxxxxxxxxxx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Connecting a Strands Agent to a Remote Tool
&lt;/h4&gt;

&lt;p&gt;Strands Agents leverage the &lt;code&gt;AgentCoreRuntime&lt;/code&gt; to connect to these remote services. The agent automatically manages the authentication handshake, treating the remote MCP server as a local capability.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockModel&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands_tools.runtime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AgentCoreRuntime&lt;/span&gt;

&lt;span class="c1"&gt;# Connect to the deployed runtime
&lt;/span&gt;&lt;span class="n"&gt;agentcore_runtime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentCoreRuntime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create agent using the remote managed tool
&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;BedrockModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us.amazon.nova-pro-v1:0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;agentcore_runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mcp_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SearchService&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Execution: Discovery -&amp;gt; Intent Recognition -&amp;gt; Parameter Extraction -&amp;gt; Execution
&lt;/span&gt;&lt;span class="nf"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What are the key highlights from the latest AWS Re:Invent?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Summary of MCP Implementation&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;User interface and real-time chat&lt;/td&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent orchestration&lt;/td&gt;
&lt;td&gt;FastAPI with Strands Agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Servers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tool implementations&lt;/td&gt;
&lt;td&gt;Python with &lt;code&gt;FastMCP&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Natural language processing&lt;/td&gt;
&lt;td&gt;Amazon Nova Pro / Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;: Bedrock AgentCore Runtime acts as the "production glue" for AI agents. It shifts the responsibility for security, scaling, and server management to AWS, allowing organizations to maintain a secure library of reusable tools accessible via a single line of code.&lt;/p&gt;

&lt;h3&gt;
  
  
  C. Building an Analyst MCP Server
&lt;/h3&gt;

&lt;p&gt;An Analyzer MCP Server is created using the &lt;code&gt;FastMCP&lt;/code&gt; framework. It demonstrates how to turn standard Python functions into tools that an AI agent can use to solve natural language math problems. Let's build our first MCP server - an analyst that handles natural language math queries with context and error handling.&lt;/p&gt;

&lt;p&gt;A short excerpt of this code is shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mcp.server&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;

&lt;span class="c1"&gt;# Create MCP server instance
&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyzer Server&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Add two numbers together&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Add two numbers and return the result.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;

&lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Divide first number by second number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Divide x by y and return the result.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cannot divide by zero&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;

&lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔢 Starting Analyzer MCP Server...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stdio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To build a successful MCP server, focus on these four pillars:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pillar&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Why it Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use detailed docstrings and descriptions.&lt;/td&gt;
&lt;td&gt;Helps the AI choose the right tool for a natural language query.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Always use Python type hints (&lt;code&gt;x: float&lt;/code&gt;).&lt;/td&gt;
&lt;td&gt;Prevents the AI from sending "garbage" data that crashes your code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resilience&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Raise specific errors (e.g., &lt;code&gt;ValueError&lt;/code&gt;).&lt;/td&gt;
&lt;td&gt;Allows the AI to explain the error to the user rather than failing silently.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chaining&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Design tools to be composable.&lt;/td&gt;
&lt;td&gt;Enables the agent to solve complex, multi-step problems (e.g., Compound Interest).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  1. Key Implementation Details
&lt;/h4&gt;

&lt;h5&gt;
  
  
  a. Server Creation (Core Implementation Flow)
&lt;/h5&gt;

&lt;p&gt;The server is built by defining a &lt;code&gt;FastMCP&lt;/code&gt; instance and decorating functions to expose them as tools.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a new MCP server with a descriptive name&lt;/li&gt;
&lt;li&gt;The name helps with debugging and tool discovery
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyzer Server&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transport&lt;/strong&gt;: Uses &lt;code&gt;stdio&lt;/code&gt; (Standard Input/Output) for local communication between the AI and the server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Registration&lt;/strong&gt;: The &lt;code&gt;@mcp.tool&lt;/code&gt; decorator tells the AI what the tool does and what inputs it requires.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  b. Tool Registration (Essential Tool Components)
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Add two numbers together&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To ensure the AI uses our tools correctly, every function should include:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;@mcp.tool()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Registers function as MCP tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;description&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Helps AI understand tool purpose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;Type hints&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enables automatic parameter validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;Docstring&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provides additional context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  c. Intelligence Error Handling
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cannot divide by zero&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Provides clear error messages (Natural Language Mapping) The AI automatically maps user phrases like "sum of 25 and 17" or "25 plus 17" to the &lt;code&gt;add(x=25, y=17)&lt;/code&gt; function.&lt;/li&gt;
&lt;li&gt;Prevents invalid operations (Complex Queries): The agent can "chain" tools. For a budget query, it might call &lt;code&gt;subtract()&lt;/code&gt; multiple times to reach a final answer. &lt;/li&gt;
&lt;li&gt;Errors are automatically sent back to AI agent (Graceful Failures): By raising a &lt;code&gt;ValueError("Cannot divide by zero")&lt;/code&gt;, the error message is passed directly back to the AI, allowing it to explain the mistake to the user rather than just crashing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  d: Best Practices for Developers
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Be &lt;strong&gt;Specific&lt;/strong&gt;: Use clear descriptions like "Calculate 15% of 200" instead of "Does percentage stuff."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict&lt;/strong&gt; Typing: Always use Python type hints to prevent the AI from sending the wrong data formats.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logging&lt;/strong&gt;: Use import logging to track how the AI invokes our tools in the background.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt;: We can add "Context Awareness" by storing results in a list (e.g., calculation_history) so the agent can reference previous answers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;: The Model Context Protocol (MCP) transforms isolated Python functions into intelligent, conversational tools that an AI agent can understand and execute. The transition from a local script to an enterprise-grade tool happens in three stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standardization (Local)&lt;/strong&gt;: Using &lt;code&gt;FastMCP&lt;/code&gt;, we wrap standard Python functions with decorators. By providing strict &lt;strong&gt;type hints&lt;/strong&gt; and &lt;strong&gt;descriptions&lt;/strong&gt;, you create a "contract" that the AI model (like Claude or Nova) can read to understand exactly how to perform math/analysis or data tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability (Managed)&lt;/strong&gt;: You move from running a script on your machine to deploying a containerized image via &lt;strong&gt;Bedrock AgentCore Runtime&lt;/strong&gt;. This shifts the burden of server maintenance and scaling to AWS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security (Enterprise)&lt;/strong&gt;: By integrating &lt;strong&gt;Amazon Cognito&lt;/strong&gt;, you ensure that only authorized agents can trigger your tools, protecting sensitive operations like database searches or proprietary calculations.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MCP isn't just about math; it's the &lt;strong&gt;universal glue&lt;/strong&gt; for the AI era. Whether we are building a simple analyzer or a complex anomaly detection system, MCP allows us to build our logic once and use it across any AI model or team in our organization.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Boost Your Agents with MCPs - Set up First Real-World Agentic App</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Sat, 21 Mar 2026 19:36:53 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/boost-your-agents-with-mcps-set-up-first-real-world-app-2p7l</link>
      <guid>https://dev.to/mindy_jen_phd/boost-your-agents-with-mcps-set-up-first-real-world-app-2p7l</guid>
      <description>&lt;p&gt;People use AI-powered tools for various purposes - from simple text completion to writing full reports. But what if your AI assistant could do more? What if it could check your calendar, get weather updates, or connect to your business systems?&lt;/p&gt;

&lt;p&gt;The answer is: Using MCP to connect to external tools like weather APIs and calendars can empower your AI assistant to do whatever you like!&lt;/p&gt;

&lt;h2&gt;
  
  
  About This Product
&lt;/h2&gt;

&lt;p&gt;In this week’s blog series, we highlight practical, real‑world applications that you can put into use immediately. We'll build a complete set of AI-powered productivity tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Key Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Smart Communicator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Performs advanced math/statistics operations&lt;/td&gt;
&lt;td&gt;Understands natural language, handles complex data analyses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Calendar Assistant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manages your schedule intelligently&lt;/td&gt;
&lt;td&gt;Detects conflicts, suggests optimal meeting times&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Weather Advisor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provides smart weather forecasts&lt;/td&gt;
&lt;td&gt;Recommends activities based on conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bring Your Own MCP (BYOM) Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom functionality you design&lt;/td&gt;
&lt;td&gt;Build tools specific to your needs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All integrated into a pre-built React application - so we can focus on building the intelligence, not the UI! "&lt;strong&gt;UI is Ready, Focus on the Intelligence&lt;/strong&gt;" - A complete frontend is provided in advance so we can focus on building the AI-powered backend tools that make a real difference in productivity. In the end, we'll have built multiple MCP servers with hands-on experience, production-ready code we can use daily, and practical patterns for building real-world AI applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environment Overview
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pre-Installed Tools
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Backend development&lt;/td&gt;
&lt;td&gt;3.11+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Frontend dependencies&lt;/td&gt;
&lt;td&gt;18+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS service access&lt;/td&gt;
&lt;td&gt;Latest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Version control&lt;/td&gt;
&lt;td&gt;Latest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  AWS Services Configured
&lt;/h3&gt;

&lt;p&gt;Our environment has access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amazon Bedrock: AI model access (Amazon Nova, Anthropic Claude)&lt;/li&gt;
&lt;li&gt;CloudWatch: Logging and monitoring&lt;/li&gt;
&lt;li&gt;Secrets Manager: Secure credential storage&lt;/li&gt;
&lt;li&gt;EC2: Compute resources&lt;/li&gt;
&lt;li&gt;VPC: Networking&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Frontend (React)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Modern chat interface&lt;/li&gt;
&lt;li&gt;Real-time message streaming&lt;/li&gt;
&lt;li&gt;Token usage tracking&lt;/li&gt;
&lt;li&gt;Session history&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend (FastAPI)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Strands Agents integration&lt;/li&gt;
&lt;li&gt;MCP server management&lt;/li&gt;
&lt;li&gt;Bedrock model access&lt;/li&gt;
&lt;li&gt;WebSocket support&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Launching Application
&lt;/h3&gt;

&lt;p&gt;This is the application...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4g3ehiugvh6asto9a3s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4g3ehiugvh6asto9a3s.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Left Navigation Panel
&lt;/h4&gt;

&lt;p&gt;On the left side, we have a navigation panel where we can choose the foundation model and and turn on/off MCP servers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy20vnw9frculcrg48mlc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy20vnw9frculcrg48mlc.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Chat Interface
&lt;/h4&gt;

&lt;p&gt;In the center of the application, we have a chat interface where we can type and see responses from the foundation model.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiu2gjjp1cnqbto61ce9a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiu2gjjp1cnqbto61ce9a.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Server logs
&lt;/h4&gt;

&lt;p&gt;On the right side, we have a panel with the server logs. We have the ability to filter through the different type of logs generated by our server. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4yk1qv21n8r7fwo2i3o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4yk1qv21n8r7fwo2i3o.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Accessing the Application
&lt;/h3&gt;

&lt;p&gt;Once started, we can access the application at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Frontend: CloudFront URL + /proxy/3000/ (e.g., &lt;a href="https://abc123.cloudfront.net/proxy/3000/" rel="noopener noreferrer"&gt;https://abc123.cloudfront.net/proxy/3000/&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backend API: CloudFront URL + /proxy/8000/ (e.g., &lt;a href="https://abc123.cloudfront.net/proxy/8000/" rel="noopener noreferrer"&gt;https://abc123.cloudfront.net/proxy/8000/&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can find the &lt;code&gt;CloudFront URL&lt;/code&gt; under the PORTS tab. Then, click on the globe icon next to the URL to open the page directly in the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvz5mmsvpvyrcsrx2ds92.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvz5mmsvpvyrcsrx2ds92.png" alt=" " width="799" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Troubleshooting Common Issues
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Important: Only use the following commands when you are facing an issue&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Port already in use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Run `pkill -f "python\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permission denied&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Run {% raw %}&lt;code&gt;chmod +x start.sh&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Module not found&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Activate virtual environment: &lt;code&gt;source .venv/bin/activate&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS access denied&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Environment should be pre-configured, contact instructor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;

&lt;p&gt;Once our environment is running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verify Application: Access the frontend using CloudFront URL + /proxy/3000/&lt;/li&gt;
&lt;li&gt;Test Chat Interface: Send a simple message&lt;/li&gt;
&lt;li&gt;Check Backend: Ensure API responds at CloudFront URL + /proxy/8000/&lt;/li&gt;
&lt;li&gt;Review Code Structure: Explore the ui/backend/mcp_servers/ directory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Environment Ready: Our development environment is configured and ready for building MCP servers!&lt;/strong&gt; &lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>agents</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Get Your Hands Dirty - AgentCore - Gateway</title>
      <dc:creator>Mindy Jen</dc:creator>
      <pubDate>Sun, 15 Mar 2026 01:50:04 +0000</pubDate>
      <link>https://dev.to/mindy_jen_phd/get-your-hands-dirty-agentcore-gateway-1omp</link>
      <guid>https://dev.to/mindy_jen_phd/get-your-hands-dirty-agentcore-gateway-1omp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepigon730n33kcjbzsbu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepigon730n33kcjbzsbu.png" alt=" " width="799" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Automating Tool Creation with Bedrock AgentCore Gateway
&lt;/h1&gt;

&lt;p&gt;One of the biggest hurdles in agent development is manually writing "glue code" for every external API. &lt;strong&gt;Bedrock AgentCore Gateway&lt;/strong&gt; eliminates this by providing a "zero-code" path to tool creation. By pointing the Gateway to a standard &lt;strong&gt;OpenAPI specification&lt;/strong&gt; (Swagger), it automatically generates a Model Context Protocol (MCP) server. This allows your Strands Agent to understand and interact with any REST API—complete with complex request schemas and authentication—without you writing a single line of integration logic.&lt;/p&gt;

&lt;p&gt;The Gateway also handles enterprise-grade security by managing the handshake between your agent and the external service. You can configure JWT-based authentication for the agent itself and link it to &lt;strong&gt;AgentCore Identity&lt;/strong&gt; to securely inject the external API keys (like Exa or Slack) into the headers of every outgoing request.&lt;/p&gt;

&lt;h2&gt;
  
  
  A. Generating MCP Tools from an OpenAPI Spec
&lt;/h2&gt;

&lt;p&gt;Instead of writing Python functions, you simply register the API's OpenAPI URL. The Gateway parses the specification and instantly exposes every endpoint as a callable tool for the agent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bedrock_agentcore.tools.gateway_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GatewayClient&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize the Gateway Client
&lt;/span&gt;&lt;span class="n"&gt;gateway_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GatewayClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create a Gateway that converts an OpenAPI spec into MCP tools
&lt;/span&gt;&lt;span class="n"&gt;gateway&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gateway_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_gateway&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ExaSearchGateway&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;auth_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JWT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;# Secure the gateway itself
&lt;/span&gt;    &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ExaAPI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openapi_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.exa.ai/openapi.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# The "source of truth"
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;credential_provider_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-secure-credential-id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;# Injected securely
&lt;/span&gt;    &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gateway generated MCP endpoint: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;endpoint&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  B. Using Generated Tools in a Strands Agent
&lt;/h2&gt;

&lt;p&gt;The Strands Agent treats the Gateway like any other toolset. Because the Gateway provides full semantic descriptions from the OpenAPI spec, the agent knows exactly which parameters to send to the external API to get the job done.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BedrockModel&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;strands_tools.gateway&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AgentCoreGateway&lt;/span&gt;

&lt;span class="c1"&gt;# Connect the Strands Agent to the Gateway
&lt;/span&gt;&lt;span class="n"&gt;agentcore_gateway&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentCoreGateway&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gateway_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;BedrockModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;us.amazon.nova-pro-v1:0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a research assistant. Use the Exa tools to find live data.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;agentcore_gateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# All OpenAPI endpoints are now tools
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# The agent automatically picks the correct 'search' endpoint from the spec
&lt;/span&gt;&lt;span class="nf"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Search for the top 5 trending research papers in Quantum Computing from this week.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;: Bedrock AgentCore Gateway is the ultimate bridge between AI and the existing web. It turns standard documentation into functional code, allowing you to scale an agent's capabilities from a single tool to an entire ecosystem of APIs in minutes. By moving from manual coding to specification-driven integration, you ensure your agents are always aligned with the latest version of the services they consume.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>agents</category>
      <category>apigateway</category>
    </item>
  </channel>
</rss>
