Your Agent Doesn’t Like Your APIs

Introduction: Why Agents Don't Like APIs

Mike Chambers, an AI specialist at AWS, introduces himself and his open-source MCP Lambda handler work, then frames the talk's central question: why agents struggle with traditional APIs and what can be done about it. He shares provocative industry quotes about spending as many tokens as possible and hundreds of tools being fine, setting up a contrast he plans to challenge.

Agents We Use vs. Agents We Build

Mike distinguishes between 'agents we use' (where token spending is acceptable for rich exploration) and 'agents we build' (where token efficiency matters because they're deployed at scale). He argues that when building agents for others to use, careful token and API design becomes critical, unlike when using an agent tool for personal tasks.

Demo Setup: A Realistic but Clunky REST API

Mike introduces a demo REST API modeled on real-world business systems with customer, invoice, and payment endpoints. He poses a natural-language business request—finding the status of a customer's latest invoice—that he will use to test how agents interact with the API in the upcoming live demonstrations.

Live Demo: Using an Agent (Kiro CLI) to Query the API

Mike demonstrates using Kiro, a CLI coding agent similar to Claude Code, to fulfill the invoice request by pointing it directly at the API. Despite some Wi-Fi hiccups, the agent successfully retrieves the answer (an $18,000 coffee invoice) but at the cost of burning a large number of tokens figuring out the API on its own.

Live Demo: Building a Custom Agent with Strands SDK

Mike shows the code for a custom-built agent using the open-source Strands Agents SDK, with a one-to-one tool mapping to each API endpoint. Running this agent to answer the same invoice question succeeds but consumes around 15,000 tokens, which Mike argues is unacceptable if deployed to hundreds of thousands of users.

Why Agents Want to Work Like Humans, Not Like APIs

Mike makes the observation that humans rarely interact directly with raw APIs, preferring dashboards and UIs, and argues that agents—being built on LLMs trained on natural language—have similar preferences. He explains that tools provided to agents effectively serve as their 'user interface' to the world, setting up the need for better tool design principles.

Four Principles for Designing Agent-Friendly Tools

Mike presents four key principles for tool design: creating coarse-grained, outcome-oriented tools instead of many fine-grained operations; flattening and clearly typing arguments; providing rich, descriptive error messages and context; and curating tools ruthlessly to avoid bloated servers with too many tools, parameters, or oversized responses. He emphasizes giving agents just enough context and letting them fetch more data on demand rather than stuffing everything into the context window.

Live Demo: Refactored Outcome-Oriented Agent

Mike demonstrates a refactored version of his Strands agent with fewer, more descriptive, outcome-oriented tools like 'get latest invoice status' that combine multiple API calls internally. Running the same invoice query now returns the answer almost instantly using only about 50 tokens instead of 15,000, dramatically illustrating the efficiency gains from better tool design.

Scaling to Production with MCP and AWS Bedrock Agent Core

Mike addresses how to move from a local prototype to production scale, recommending MCP and an MCP gateway with authentication for tool usage. He introduces AWS Bedrock Agent Core, a suite of components for cloud-scaling agents, including a fully managed gateway service that can wrap APIs for agent consumption, while cautioning that doing so isn't always the right choice.

Closing Thoughts: Outcome Maxing and Resources

Mike wraps up by reframing the earlier 'token maxing' mantra into 'outcome maxing' for agents being built for production use. He shares QR codes and links for Strands Agents (open source), Amazon Bedrock Agent Core sample code, his LinkedIn, and the GitHub repository containing the demo code shown in the talk.

Q&A: Tool Argument Trade-offs and API Wrapping Strategies

During the Q&A, Mike fields audience questions about the trade-off between fewer tools with more arguments versus more tools with fewer arguments, emphasizing that it's a balance requiring careful curation. He also discusses the quickest ways to wrap APIs for agent consumption, mentioning AWS Gateway's semantic tool lookup feature for handling hundreds of API calls, and clarifies that outcome-oriented natural language tools work best for business-specific agents versus general-purpose ones before the session closes.

That's it. Okay. Thank you very much. So hello, everybody. My name is Mike. I'm an AI specialist with Amazon. I work for AWS. And I specialize in agents. So I work with agent framework teams and agent infrastructure teams. And I have built an open source library for the MCP Lambda handler, which is being downloaded about 25 to 30,000 times a month is being used in some production workflows for MCP.

And what I wanted to come here to talk about today is why your agents don't like your APIs and potentially what we can do about it. Let's see if my clicker works at least. Yes. Okay. I picked up some quotes and then I decided last minute not to say who said this, because it doesn't really matter. But we've been hearing this kind of thing today actually and in general. Just throw away, just throw data at the thing that is really good at dealing with data.

It's a good approach to this problem. If you're going to take a picture of this and try to de blur that, you won't actually see who's saying that. Is this my fault? Yes, it is. So that just says, a trusted person that we all like said this in a podcast once. Hundreds of tools is still a fairly safe bet, at least for Claude. Similar kind of thing.

This is what we're saying. It's all about spending as many tokens as we can. We all want as many tokens as we can. We should we all should be token maxing is is a statement which I hear a lot. Now, I don't necessarily disagree with any of this, but at the same time, I completely disagree with all of this.

And so this is just going to step into this just a little bit because there are there are two distinct ways that we use agents. And I've been building agents since slightly before we called them agents and agentic. It was all used and all that kind of stuff. I'd like to point out that there's two very distinct camps here, I think, anyway. That's agents we use versus the agents we build.

And when it's with agents we use, sure, go for it. Spend all the tokens. Do all kinds of things you can do to try to rip into your data and to make amazing application stacks and all the rest of it. But then when we're building agents, we really need to be very conscious about how many tokens we're using and about how we're using our agents to interact with data.

And so this slide I added very last minute, just after listening to everybody talking this morning. Yes, we are all about spending as many tokens as we can, some of us anyway, but not necessarily when we're building our own agents, when we're making agents for other people to use kind of makes sense. So I wanna introduce you to this.

This is an API and it's an API that I want to interact with. It's an API that I've made up for this session and I realize now that I've missed a trick here with the actual name of it. I get that, but it doesn't matter. This is a perfectly reasonable REST API that would pass many secure many reviews. You might not like it, but it's sort of the kind of thing that you'll find that you're working with, of course, that we're all working with this kind of API.

So I have this running right now on my laptop. And aside from all of those issues that I had with my laptop a second ago, I'm planning to do some live stuff. So let's see if that works. And this is the way that the API looks. It's a bit longer than configured on the screen. But it's, you know, it's a customer it's got customer information.

It's got invoice information. It's got payments. It's got all those bit different kinds of things. So this is a REST API and we wanna interact with this. We want our agents to be able to go and get stuff for us because we have this request. You'll notice I've changed the font to a business font because this is a business request where what is the status of the latest invoice for this particular customer?

Include full details, the amount, the due date and the description, etcetera, etcetera. Now, let's go and have a go at doing just that. And I'm sure this is all going to work fine. And it's going to be fine and it's going to be great. Let's see if I can can I scroll? Oh, I can. Yes. Excellent. Okay. So remember I was talking before about the agents that we use and the agents that we build.

So first of all, let's have a go at doing this with an agent that we use. So if you use a, you know, TUI agent for building code, I've got one here. I don't know if you can tell what it's called, but the developers of it decided to put it in really big letters at the top. So this is Kiro.

And so there's this works in a very similar way to all kinds of other kinds of CLI tools like Claude code and the rest of it. So let's so how do I do this then? How do we get to my oh, gosh. Oh, Okay. Here we go. That's going to be fun. And so I've got a prompt here that I'm going to give to that thing. I'm going to scroll through very quickly.

There we go. Okay. Cool. Okay. So this is essentially that natural language version of that business prompt that we had before. But I do just need do need to tell it about where my API is so that it can go and find it. So let's run that and see that run. So more pressing enter, less talking. Remind me of that as we go through this.

And so it seems to be kind of working. I think this is good. It's going to hiccup a little bit here because it is just a local API. Oh, by the way, on the left hand side, this is the the essentially the logs, if you like, of the API. So we can see that it's actually hitting something and doing something. That little hiccup is not something I'm very concerned about.

It's currently using the hotspot in my pocket because I couldn't find WiFi. I don't know if everybody else has managed to find it. But hopefully, it'll manage to get through here and and get the data. So this is just a a quick fast API that's running on my machine. The data is actually hosted up in the cloud somewhere because I can't help myself and that's what I do.

But there we go. So it's churning through it and it's going to go and get the it's going to get the answer for us. And so, yeah, it's managed to find this person. Sample data, don't, you know, read too much into this. But there is an enormous invoice there for coffee. But we're in Melbourne. Right? So that's that's that's I'm I'm reaching out to you guys.

I'm from Brisbane. We don't drink coffee up there. It's taking a little longer to to run than I was hoping, but that's again probably because of the the the WiFi and stuff. And so we've got an $18,000 bill for coffee. Excellent. So it's managed to do it. Right? So what did I do? You saw the prompt that I gave it.

So I pointed it at the API. I said, go figure it out. And what did it do? It burnt a whole ton of tokens to be able to go and figure it out with an agent that I'm using. Let's go and have a look at an agent that I am building. So let's quit out of this. Let's clear that out and then I'm gonna scroll all the way over here and get this thing because I don't like live typing.

You've seen how good I am at PowerPoint. Imagine what it would be like if I never mind. Okay. So if we're going to paste this in here, I'm going to run an agent. Now let me go and find where that agent code actually is so I can actually show you what's running here. So here we go. So this is the Kiro IDE.

It's the IDE version of the CLI we were just looking at. And here, I have I'm sure I'm looking at the right one. The agent that I'm just running in the background now, but for saving time, I'm gonna walk through what the code looks like. And so you can see that it's strands agents SDK. So it's an open source SDK for building agents.

It's pretty cool. I like it a lot. You can see that we've imported agent and tool. I've imported lots of other things as well because I want it to pretty print some stuff at the end just so that we can see what's happened. But I'm pointing it at my API And if I scroll down here, then I have a tool definition.

So tool definitions are very easy with all of these frameworks, just a bit of a decorator and I can say, okay, well, I've gonna have list customers, get customer, blah blah blah blah blah. For each one of my APIs, I've got a separate tool which is going to go and work with that particular API. It's a one to one mapping.

So what's gonna happen? A very similar kind of thing to the where we just used our command our Kiro CLI version. So if I just scroll down here, there's a bunch of stuff in here about making it look pretty and then you'll see why in a minute. But if I scroll down to here, here is the agent itself. And in the agent itself, you've got all of those different things listed.

So we just say, here are all my tools. Here's a system prompt for you. And then I'm actually basically hard coding this agent to just go and find the answer to that question that we were talking about just a second ago. Okay. Let me scroll all the way back over here and it's finished. Fantastic. And so you can see the pretty stuff that it's done at the end here.

And so it's managed to get the same answer out that this person owes a lot of money for coffee for some reason and we look at the amount of tokens that it's estimates that it's burnt on this. So around about 15,000 tokens burnt on doing just this. So if I'm using my my coding assistant agent, my Kira, my Claude code, my whatever it is to go and hammer on my API, fine. Okay.

I'm maybe I'm okay with that. But if I'm shipping this out to a 100,000, 200,000 people as part of a mass deployment of my agent, then this is awful. Right? So I'm spending way too many tokens. We need to slim this right down. Okay. Let's go back to here. Let's see what happens if I press that, And let's let's keep going. I'm going to make one of the most obvious comments that you ever see said today.

Agents are not human. But okay. But let's think about what humans do for a second when it comes to them using data. So humans, us, we don't use APIs. So why do we make an agent use them? But we don't use APIs. Right? We don't. Like, if I'm asking you that question, you would probably go to a dashboard.

Ultimately, as a developer, maybe I'm gonna use an SDK. Maybe I'm going to use a library, but I'm more likely to go and use a user interface to be able to work with that data. I'm gonna go to some kind of dashboard to work with that data. And agents want that too. Why do they want that? Well, agents wanna be just like us.

Now, why is that? I mean, under the hood of an agent is an LLM, and the large language model has been trained on natural language, our natural language, the natural language that we've come up with. So it thinks and behaves sort of like us. It wants to work with the same kind of the data in the same kind of way that we work with that data.

Can it work with the API? Yes, of course, it can. I'm sure you could as well if I gave you long enough and, you know, postman and whatever and you're just hammering away and you're getting the data results back, but you don't want to work like that and the agent in its in its happiest state, if you will, doesn't wanna work like that either.

It wants to be just like us. And so the tools that we provide it are essentially the agent's UI, the the the user interface for the agent. That's how it gets access to the world around it is through those tools. So I want to present the four principles. This is a very grandiose thing. I'm sure there are some more principles out there we could gather as well that we've seen, that I've seen, that we've collected together to say, okay, well, this is how we wanna think about it when we're designing tools for agents.

And we'll see this done in just a second. Some of these might be kind of obvious, but it's kinda good to sort of like frame it like this. So rather than having that massive, great, big, long list of all of our APIs, the APIs that were built probably ten years ago and felt good at the time, we want to surface these.

We want to give these to the agent in a much more coarse grained kind of way. This sort of steals my thunder for what I how I want to finish this presentation, but I saw this this morning when we're talking about being output or outcomes oriented rather than, you know, token token spending. So we want to be outcomes oriented, not operations oriented.

Get ourselves some coarse grained tools. And the definition of these tools is going to depend, of course, on what it is that we're looking and focusing the agent to do, but giving it access to be able to combine together different API calls so that it can become much more efficient. It's kind of obvious when I say it like this, but, you know, if you've had any kind of gray hairs like I do and you've thought about service oriented architecture and stuff, then I feel your pain as well.

But it's a similar kind of thing to that, right? So next thing, principle number two, is to flatten the arguments. Now this is really just about making sure that the agent has got access to as rich and as concise information about how to go and use the the tools that we're giving it. So just skipping to the what is good, clear, typed, constrained, annotated, described. So we've got the types there.

We've got the enums there, so it doesn't have to guess what parameters are sent. It's easy to be able to make a simple tool, throw it together, and give it to an LLM or give it to an agent. And it will figure it out, but you're paying for all of those tokens whilst it's figuring it out. No need to do that.

Let's go ahead and and put in these details here. And of course, we can use agents to write this stuff, but let's just make sure it's there. Something I missed from that, I suppose, is the description of the tool. And I'm sort of saying that's kind of table stakes at this point, like docstrings or however you need or can add in the description of your tool.

But don't forget, it's not just about that. All the information you can get into the context, this context engineering, super important, and there's lot of things you can leverage here. Something that I'm gonna point out here is the errors that you send back because not all calls to these tools are gonna be successful. But saying four zero four not found is not necessarily that useful for your agent, not just as it wouldn't be for you.

You know, you'd have to then go and look in the documentation or find some esoteric error message and then just Google it and then go, okay. They don't know what it is either. Whereas if you can actually pass more context back at all times, even during the error, not entirely sure that the one in great makes a lot of sense, but maybe it does in this particular business case. I don't know.

But giving information back to the large language model behind the agent. It's going to read all of this stuff and it's going to use this to figure out where to go next. So in a sense, the last one I'm just going to say here, curate ruthlessly. Make sure that at each stage, you're actually thinking that we're not pushing this too far.

So yes, I even I put a slide up before saying, you know, 100 tools into a tool server, not necessarily a problem. It depends on a few things. But if you are getting to more than 50 tools in a server, something's probably gone wrong somewhere, and you need to start thinking and refactoring and and pairing that down.

Doesn't mean you can't have another tool server. The number of parameters. The response size. Huge one, this one. This is actually something that we've learned a lot is when you're responding back to an agent call, you don't necessarily need to give it all of the data it asked for. You could, and there's a lot of power in saying back to the agent, yep, I did that.

You asked for that and I've done that. Not only have I done that, but all of the data you want is in this location. Go get it at a point when you want it in the future. So you don't have to stuff the context with that massive 200 gigabytes worth of data. Obviously, that wouldn't work. Okay. So let's look at that what that might look like in my strands agent world and I'm gonna try where where am I?

Yes. Okay. So let's go back over here and over here and here. So I have a fixed, hopefully, version of this agent. So let's do take a quick look at it. And again, it's a strands agent, so it's pretty simple code. And I've got my tool decorators on my tools here. So GET latest invoice status, much more descriptive, much more outcomes oriented, got a lot more description about what it is that I want my tool to do.

And of course, it's then going to go and potentially knock on the door of a couple of different API calls to be able to get this information back and then be able to add that context to the data when it brings that back. Same with find overdue invoices, same with these smaller number of tools. And then my agent itself is down here.

So similar kind of thing. Yes, I know I'm using an old model, by the way, but that's kind of even not the point. Still works and I've got a smaller number of these outcome oriented tools. So let's whiz to here and here and this is the last one. So let's see if this works. And come all the way back to here and let's clear this out. Has actually worked, hasn't it?

Oh, I said that before I ran it. Come on. Okay. So we're going to run the same thing again or a similar kind of thing again but this time that version that we just looked at with the same question going in there. And look, comes back with the answer straight away. What a surprise like I would have done it otherwise.

And we've spent about 50 tokens rather than 15,000 tokens. I know that if I'm shipping something to my customers and ultimately, we're going to have to figure out how much this thing's going to cost, this is the way that I want to do it. Okay. Let's go back to to wrap it up. Had my sign held up to me just a second ago.

Elephant in the room that I haven't talked about, MCP. Obviously, if I was actually going to ship this out at production scale like I'm talking about, then there's a lot of things that I need to do to this to this agent to get it to work at cloud scale. MCP, definitely the way I would go for my tool usage, and I would definitely be looking to put that into an MCP gateway with my authentication to be able to host this at scale in the cloud. Not a surprise to any of you, I'm guessing, if you're looking at my shirt.

At AWS, we do have Amazon Bedrock Agent Core, which is a massive collection of different components and pieces you can cherry pick from to be able to take your agents and then cloud scale them and take them out to your breakout success. One of them is gateway. I'm not going to jump into the console now, but if you go into the AWS console, this diagram is in there, so you can pick it apart.

Gateway is a fully managed MCP gateway service. So if you've got APIs, you could put them behind gateway and make them available to everybody. Should you do that? Well, hopefully, we've just been talking a lot about that. Maybe not. Maybe So put some Lambda functions there to be able to combine together your API calls. Bits and pieces all there.

Please go and come and see me later if you'd like to know more about any of these components. But other than that, I will move on. So we all should be token maxing. I kind of spoiled my own ending here. I think we should all be outcome maxing. I'm not even the first person to have said that today, and I know that's a contentious point if you go and Google it.

But in terms of the agents that we are building, we should definitely be outcome maxing. Just some QR codes for those who are aligned at the very end. If you are interested in playing around with Strands agents, it's free. It's open source. I love it. Then there's a QR code there, strandsagents.com. If you don't get it now, you could get it later.

It's very easy to find. If you're interested in Amazon Bedrock Agent Core, I'm not going to send you to the product page because that doesn't speak to us, does it? But if you go to that QR code, it's a GitHub page with sample code in there, which takes you through all of those different pieces and componentry and all the rest of it and including that gateway service.

If you'd like to carry on the conversation with me, this is my LinkedIn QR code. So this is the one you take a picture of. Yeah. So please feel free to connect with me. I'd love to talk to you more about this kind of stuff. And very finally, this is more or less the code that I just showed. If you want to sort of pick it apart and play with it yourself, there's a couple of differences in here, but it's all based off of this repository.

Thank you so much. It's been a pleasure. I look forward to talking to you again at the conference. Thank you.

Thank you, Mike. We're actually running sort of five or six minutes ahead of schedule. Can I yeah? So I was wondering, can we can we throw you under the bus for a few for some q and a's? Does anyone have any questions for Mike?

Yeah. Yeah. Yeah. I was watching the timer down there. It went red. So I was like, hey, that's why

I was Yeah, no, I think that the timer was fine, but I think I started you early. Does anyone have any questions for Mike at all while we got in?

Why? That's a question.

Someone.

Oh, come on. Some one person has just one question, even if it's a frivolous question. What's the meaning of life? Yes. We'll have to go and find out. We'll get clawed on that one. Yeah. Question here.

You're showing the design, the recommended tool design. And on the right, you had tools that had a lot of arguments. On the left, you had a lot of tools but without arguments. One of the principles that you've been sharing.

Okay. So this is on one of my slides? Okay. You picking holes in one of my slides? Yeah. I mean, I would. Yeah, yeah.

You're suggesting that the tools we have less tools but more arguments. Doesn't it lead to quality degradation if we try to call those tools? Because now arguments needs to be picked by LLM whereas before, there's no arguments needs to be picked by LLM. It just chooses the tool.

Yeah. So so it's a good point. It's a balancing point. Right? So I guess it's about outcome, defining what the outcome is that you want. Again, if if we are going in there and being very specific about what those arguments are going to be, then all of that stuff's well within the bounds of what an LLM is going to be able to manage inside of the agentic loop, right? So it's a balance.

If you end up with, you know, 50 different parameters going in, then all of a sudden, hey, this isn't working for us. But I think one of the one of the four up there was just looking at when we were talking about ruthlessly refactoring, making sure that you don't have too many arguments. So it's it's correct that it's a balance.

But, you know, the way that that API was designed was in a pre agentic world and it was pretty ugly intentionally to make the demo work. And so, yeah, it was it was more efficient in this particular case. Yeah. Yeah. If there's anybody else putting their hand up, I can't see you because of the lights. You have to shout.

But the question here.

What would you say is this quickest way to wrap the API calls to something that agents could consume easiest?

That's the quickest way to wrap API calls into something that an agent can consume most easily. So using an agent probably to help you do that for a coding assistant, why not? Let's be honest about it. So the thing is to then is to actually go in to look at what the outcomes are that you actually want to actually get. So there is a bit of sort of like business analysis kind of stuff going on here where you want to define in the same way that you would for what does a human want to see when they look at a dashboard of this data or what does the agent wanna see?

And what the agent wanna see is probably related to what a human wants to see because a human's gonna be using the interface probably, but not necessarily. So, yeah, doing a bit of that analysis, getting an agent on board is probably the way to do it. One thing I will mention as I have time and because this gets me paid is because it's that gateway product that we talked about. One of the things it has is the ability to do semantic tool lookup. So if you do have and in in a longer version of this presentation, I would say and demo that if you do have like hundreds of API calls and hundreds of things that you simply can't refactor or for whatever reason you can't, then you can put it into agent core gateway.

And then gateway has a feature on it which allows the agent to be able to do semantic lookup of those tools. So it's a tool discovery thing which sort of sits in between it and then having hundreds of tools in there, which is pretty cool.

Awesome. I think we had one more question Yeah. From the gentleman in white. I can't quite see. You might have to shout.

Yeah. So if if you're building an agent which is going to have some sort of business use case, then making those outcome oriented tools and then having natural language based around them, yes, I'm finding that's working. If if what it is is if what you're doing is I have a general purpose agent which just has to deal with everything in my life from my emails to my Slack to my API, then it will get there and you'll have to spend a bunch of tokens to get there.

This is all about writing an agent that I am going to deploy to the masses, and they may not even know they're using an agent at that point, I suppose. So, yeah, I'm finding natural language is going to be beneficial there, especially with the things like those error messages to sort of explain what is the current situation.

So it doesn't so it just eliminates the guesswork. It will get there anyway, but we're just trying to get it there quicker. Does that does that answer that? Does it make sense?

Yeah.

Okay. We can talk. Okay. Cool. Awesome.

And if anyone's got any other questions for Mike, catch him afterwards. He'll be hanging around. So one more time. Let's put your hands together for Mike Chambers.

Thank you very much. Thank you.

AIE MEL 2026

Your Agent Doesn't Like Your APIs

Mike Chambers

AI Specialist & Senior Developer Advocate

© 2024, Amazon Web Services, Inc. or its affiliates. All rights reserved.
AWS logo.
Just throw data at that thing that is really good at dealing with data is a good approach to this problem.

© 2024, Amazon Web Services, Inc. or its affiliates. All rights reserved.

Hundreds [of tools] is still a fairly safe bet, at least for Claude.
"We all should be tokenmaxxing."

AWS © 2023, Amazon Web Services, Inc. or its Affiliates. All rights reserved.

Agents we use

Agents we build

Two large circles are displayed side-by-side. The left purple circle is labeled "Agents we use" and has a ghost-like icon below it. The right blue circle is labeled "Agents we build" and has a terminal prompt icon below it.

Acme Accounting REST API v1

A "perfectly reasonable" REST API. Would pass any review.

Acme Accounting REST API v1

A "perfectly reasonable" REST API. Would pass any review.

  • GET /customers [{customer_id, name, company}, ...]

  • GET /customers/{id} {customer_id, name, company}

  • GET /customers/{id}/contacts [{customer_id, email, phone}]

  • GET /customers/{id}/name {name}

  • GET /customers/{id}/company {company}

  • GET /invoices [{invoice_id, customer_id, amount, currency, status, ...}]

  • GET /invoices/{id} {invoice_id, customer_id, amount, currency, status, ...}

  • GET /invoices/{id}/status {invoice_id, status}

  • GET /invoices/{id}/amount {invoice_id, amount, currency}

  • GET /invoices/{id}/dates {invoice_id, created_at, due_at}

  • GET /payments [{payment_id, invoice_id, amount, paid_at, method, ...}]

  • GET /payments/{id} {payment_id, invoice_id, amount, paid_at, method, ...}

  • GET /reports/outstanding (count, total_amount, currency)

  • GET /reports/overdue (count, total_amount, currency)

  • GET /reports/revenue (total_revenue, payment_count, currency)

What is the status of the latest invoice for alice@acme.com?

Include the full details — amount, due date, and description.

© 2024, Amazon Web Services, Inc. or its affiliates. All rights reserved.

An AWS logo is visible at the bottom left. In the bottom right corner, a white outline icon of a command-line terminal is shown, with a purple icon of a friendly ghost character overlaid or placed next to it.

Kiro CLI Terminal Demonstration


127.0.0.1:5000 - "GET /api/v1/customers/01BA-A000-0004-9FD2" 200 -
127.0.0.1:5000 - "GET /api/v1/customers/01BA-A000-0004-9FD2" 200 -
127.0.0.1:5000 - "GET /api/v1/customers/01BA-A000-0004-9FD2" 200 -
127.0.0.1:5000 - "GET /api/v1/customers/01BA-A000-0004-9FD2/invoices" 200 -
127.0.0.1:5000 - "GET /api/v1/customers/01BA-A000-0004-9FD2/invoices" 200 -
127.0.0.1:5000 - "GET /api/v1/invoices/01BA-A000-0004-9FD2" 200 -
127.0.0.1:5000 - "GET /api/v1/invoices/01BA-A000-0004-9FD2/lineItems" 200 -
... (many similar GET requests for customers, invoices, and line items)

KIRO
Welcome to the new Kiro CLI TUI! /tui to learn more, /feedback for thoughts.
Prefer the classic experience? Relaunch with kiro-cli --classic.

Trust All Tools active, confirmations are off /quit to exit
Kiro auto > 50%                                     ~/Documents/Decks/alextb/demo master
> ask a question or describe a task --
>
Screenshot of a terminal interface displaying API request logs on the left and the Kiro CLI TUI welcome message and command prompt on the right.
Screenshot of a macOS desktop featuring an abstract blue and light yellow wavy wallpaper, the macOS menu bar, and a folder icon labeled "Untitled" in the top right.

macOS Desktop

Screenshot of a macOS desktop. The desktop features an abstract wallpaper with blue and yellow wavy shapes. The macOS menu bar is visible at the top, displaying the Apple logo, Finder application menu items, and system status icons including Wi-Fi, battery, search, Siri, Control Center, and the current date and time (Wed 3 Jun 4:26 pm). A single folder icon labeled "desktop" is located in the top right corner of the screen.

Kiro CLI Demo

API Server Logs

uv run uvicorn demos.demo_1_disaster_accounting_api_app --port 8001

Kiro CLI Interface

Welcome to the new Kiro CLI UX! /tui to learn more, /feedback for thoughts.

Prefer the classic experience? Relaunch with kiro-cli --classic.

Trust All Tools active, confirmations are off. /quit to exit

Kiro auto ↻ 9%

Ask a question or describe a task 🡒

Screenshot of a presentation slide showing two dark-themed terminal windows side-by-side.

The left terminal displays server logs for an API running on port 8001, showing repeated GET requests for customers, invoices, and payments.

The right terminal displays the Kiro CLI application, featuring a large, stylized 'KIRO' logo made of small dots at the top.

Welcome to the new Kiro CLI UX!

/tui to learn more, /feedback for thoughts.

Prefer the classic experience? Relaunch with kiro-cli --classic.

Trust All Tools active, confirmations are off · /quit to exit

Kiro auto ↻ 9%

I have a REST API running at http://localhost:8001. It's an accounting system for a coffee supply company. The API has auto-generated docs at <

Welcome to the new Kiro CLI UX!

I have a REST API running at http://localhost:8001. It's an accounting system for a coffee supply company. The API has auto-generated docs at http://localhost:8001/docs.

Using only this API (do not access DynamoDB directly), answer this question:

What is the status of the latest invoice for alice@acme.com? Include the full details - amount, due date, and description.

Screenshot of a terminal interface demonstrating the Kiro CLI tool. The right pane features a pixelated 'KIRO' logo, a welcome message, a user-provided prompt, and a 'Thinking...' status. The left pane displays a list of HTTP GET requests as API logs.

KIRO

Welcome to the new Kiro CLI UX! /tui to learn more, /feedback for thoughts. Prefer the classic experience? Relaunch with kiro-cli --classic.

I have a REST API running at http://localhost:8001. It's an accounting system for a coffee supply company. The API has auto-generated docs at http://localhost:8001/docs.

Using only this API (do not access DynamoDB directly), answer this question:

What is the status of the latest invoice for alice@acme.com? Include the full details - amount, due date, and description.

WebFetch localhost/docs mode=full

::: Thinking... (esc to cancel)

Trust All Tools active, confirmations are off. /quit to exit

Kiro auto 9%

Kiro is working. type to queue a message

Examples from API Logs (left panel):

  • INFO 127.0.0.1:53489 "GET /api/v1/customers/cust-9d83954d/contacts HTTP/1.1" 200 OK
  • INFO 127.0.0.1:53592 "GET /openapi.json HTTP/1.1" 200 OK
  • INFO 127.0.0.1:53846 "GET /api/v1/customers HTTP/1.1" 200 OK
  • INFO 127.0.0.1:55317 "GET /api/v1/invoices/INV-ALICE-9999 HTTP/1.1" 200 OK

A screenshot of a command-line interface for the KIRO AI tool. The screen is dark with light purple ASCII art displaying "KIRO" as the main title. The left panel shows a scrolling stream of API request logs, including GET requests to customer, invoice, payment, and openapi.json endpoints. The right panel displays the KIRO CLI's welcome message, a multi-line natural language prompt asking the AI to get the latest invoice status for a specific customer from a REST API, and the AI's current action of fetching API documentation via a "WebFetch" command. Status messages indicating "Thinking..." and "Kiro is working" are visible at the bottom.

KIRO

INFO: 127.0.0.1:53489 "GET /api/v1/customers/CUST-9D8395d/contacts HTTP/1.1" 200 OK
INFO: 127.0.0.1:53490 "GET /api/v1/customers/CUST-9D8395d HTTP/1.1" 200 OK
INFO: 127.0.0.1:53500 "GET /api/v1/invoices HTTP/1.1" 200
127.0.0.1:8001 - "GET /kapi/customers HTTP/1.1" 200 OK
127.0.0.1:8001 - "GET /kapi/customers/CDT-MKT-001/invoices HTTP/1.1" 200 OK
127.0.0.1:8001 - "GET /openapi.json HTTP/1.1" 200 OK
127.0.0.1:8001 - "GET /openapi.json HTTP/1.1" 200 OK
127.0.0.1:8001 - "GET /kapi/customers HTTP/1.1" 200 OK
127.0.0.1:8001 - "GET /kapi/customers/CDT-MKT-001/invoices HTTP/1.1" 200 OK
127.0.0.1:8001 - "GET /openapi.json HTTP/1.1" 200 OK
127.0.0.1:8001 - "GET /openapi.json HTTP/1.1" 200 OK
...

KIRO

Welcome to the new Kiro CLI UI! /tui to learn more, /feedback for thoughts.

Prefer the classic experience? Relaunch with kiro-cli --classic.

I have a REST API running at http://localhost:8001. It's an accounting system for a coffee supply company. The API has auto-generated docs at http://localhost:8001/docs.

Using only this API (do not access DynamoDB directly), answer this question:

What is the status of the latest invoice for alice@acme.com? Include the full details - amount, due date, and description.

Trust All Tools active, confirmations are off - /quit to exit

Kiro auto > %

Kiro is working - Type to speak a message

~/Documents/Decks/aiemlb/demo master

Screenshot of a terminal interface demonstrating the Kiro CLI UI, featuring API logs on the left and an interactive prompt on the right with tool interactions and a question.

Welcome to the new Kiro CLI UI!

/Tol to learn more, /Feedback for thoughts. Prefer the classic experience? Relaunch with `kiro-cli --classic`.

I have a REST API running at http://localhost:8001. It's an accounting system for a coffee supply company. The API has auto-generated docs at http://localhost:8001/docs.

Using only this API (do not access DynamoDB directly), answer this question: What is the status of the latest invoice for alice@acme.com? Include the full details - amount, due date, and description.

  • WebFetch localhost/docs
       data-full
    
  • WebFetch localhost/openapi.json
       data-full
       Tool execution failed
    
  • Shell curl -s http://localhost:8001/openapi.json | python3 -m json.tool
    
{
  "openapi": "3.1.0",
  "info": {
    "title": "Accounting API",
    "description": "Enterprise accounting API v1",
    ... +19 lines (Ctrl-C to Toggle)
  }
}

Thinking... (esc to cancel)

Trust All Tools active, confirmations are off /quit to exit

Kiro auto - > %

Kiro is waiting - Type to send a message

API Logs

127.0.0.1:53096 - "GET /api/customers/CM01/invoices?skip=0&limit;=10 HTTP/1.1" 200 OK
127.0.0.1:53096 - "GET /api/customers/CM01/invoices?skip=0&limit;=10 HTTP/1.1" 200 OK
... (multiple similar GET requests)
127.0.0.1:53096 - "GET /openapi.json HTTP/1.1" 500 Internal Server Error
127.0.0.1:53096 - "GET /openapi.json HTTP/1.1" 500 Internal Server Error
A dark-themed terminal interface displaying CLI interactions. The word "KIRO" is shown in large purple ASCII art at the top. On the left side of the screen is a log panel showing HTTP requests and responses. In the main console area, commands and JSON output are visible, with green and red vertical bars indicating execution status.

Welcome to the new Kiro CLI UX! /tui to learn more, /feedback for thoughts.

Prefer the classic experience? Relaunch with kiro-cli --classic.

I have a REST API running at http://localhost:8001. It's an accounting system for a coffee supply company. The API has auto-generated docs at http://localhost:8001/docs.

Using only this API (do not access DynamoDB directly), answer this question:

What is the status of the latest invoice for alice@acme.com? Include the full details – amount, due date, and description.

Now I need to find the customer_id for alice@acme.com, then find their invoices. Let me first list customers to find Alice's customer_id.

  • Shell
    curl -s http://localhost:8001/api/v1/customers
  • esc to cancel

Trust All Tools active, confirmations are off · /quit to exit

Kiro · auto · 9%

Kiro is working · type to queue a message

INFO: 127.0.0.1:55489 "GET /api/v1/customers/CUST-9d03954d/contacts HTTP/1.1" 200 OK
INFO: 127.0.0.1:55498 "GET /api/v1/customers HTTP/1.1" 200 OK
INFO: 127.0.0.1:55500 "GET /api/v1/customers/CUST-9d03954d HTTP/1.1" 200 OK
INFO: 127.0.0.1:51876 "GET /api/v1/customers/INV-ALICE HTTP/1.1" 200 OK
INFO: 127.0.0.1:51878 "GET /api/v1/invoices HTTP/1.1" 200 OK
INFO: 127.0.0.1:51880 "GET /

API Demonstration Output

The left terminal shows a log of API requests made to various endpoints, all returning a 200 OK status:

  • GET /api/v1/customers/CUST-[ID]/contacts
  • GET /api/v1/customers/CUST-[ID]
  • GET /api/v1/payments?skip=0&limit=100
  • GET /api/v1/invoices?skip=0&limit=100
  • GET /openapi.json
<

Welcome to the new Kiro CLI UX!

/tui to learn more, /feedback for thoughts. Prefer the classic experience? Relaunch with `kiro-cli --classic`.

I have a REST API running at http://localhost:8001. It's an accounting system for a coffee supply company. The API has auto-generated docs at http://localhost:8001/docs.

Using only this API (do not access DynamoDB directly), answer this question:

  • What is the status of the latest invoice for alice@acme.com? Include the full details - amount, due date, and description.
  WebFetch localhost/docs
     └ mode=full
  WebFetch localhost/openapi.json
     └ mode=full
     └ Tool execution failed
  Shell curl -s http://localhost:8001/openapi.json | python3 -m json.tool

Now I need to find the customer_id for alice@acme.com, then find their invoices. Let me first list customers to find Alice's customer_id.

  Shell curl -s http://localhost:8001/api/v1/customers

Alice Mitchell at Acme Corp looks like the match. Let me verify her email by checking contacts for CUST-9D83954d.

  Shell curl -s http://localhost:8001/api/v1/customers/CUST-9D83954d/contacts
  esc to cancel
  Trust All Tools active, confirmations are off . /quit to exit
  Kiro   auto   9%
  Kiro is working . type to queue a message

Screenshot of a command-line interface for a tool named Kiro, displaying commands and output for interacting with a local REST API. On the left side, there is a smaller log pane showing HTTP GET requests to `localhost` and `openapi.json` from `127.0.0.1` at various ports.

notes.md

uv run uvicorn demos.demo_1_disaster.
accounting_api:app --port 8001

I have a REST API running at http://localhost:8001. It’s an accounting system for a coffee supply company. The API has auto-generated docs at http://localhost:8001/docs.

Using only this API (do not access DynamoDB directly), answer this question:

What is the status of the latest invoice for alice@acme.com? Include the full details - amount, due date, and description.

uv run python -m demos.demo_1_disaster.
agent_attempt
uv run python -m demos.demo_2_fix.
accounting_tools

Screenshot of the Kiro IDE, showing a file explorer on the left, an open notes.md file in the main editor pane displaying code and instructions, and a "Let's build" AI assistant panel on the right.

notes.md

uv run uvicorn demos.demo_1_disaster.accounting_api:app --port 8001

I have a REST API running at http://localhost:8001. It's an accounting system for a coffee supply company. The API has auto-generated docs at http://localhost:8001/docs.

Using only this API (do not access DynamoDB directly), answer this question:

What is the status of the latest invoice for alice@acme.com? Include the full details - amount, due date, and description.

uv run python -m demos.demo_1_disaster.agent_attempt
uv run python -m demos.demo_2_fix.accounting_tools
Screenshot of the Kiro IDE showing a file explorer on the left and a `notes.md` file open in the main editor area, along with a "Let's build" pane on the right.
def main():
    console.print(Panel(
        "The Disaster",
        border_style="red",
    ))

    agent = Agent(
        model="us-anthropic.claude-sonnet-4-20250514-v1:0",
        tools=[
            list_customers,
            get_customer,
            get_customer_contacts,
            list_invoices,
            get_invoice,
            get_invoice_status,
            get_invoice_amount,
            get_invoice_dates,
            list_payments,
            get_payment,
            get_outstanding_report,
            get_overdue_report,
        ],
        system_prompt=(
            "You are an accounting assistant. Use the available API tools to answer questions."
            "Be thorough and verify your answers."
        ),
    )

    start = time.time()
    result = agent("What is the status of the latest invoice for alice@acme.com?"
                   "Give me the full details including amount, dates, and payment status.")
    elapsed = time.time() - start

    console.print(Panel(f"[green]{result.message['content'][0]['text']}[/green]", title="Agent Response"))
    console.print(f"Total wall time: [red]{elapsed:.2f}[/red]")
Screenshot of a code editor (likely VS Code) displaying a Python file named `agent_attempt.py`. The left panel shows a file explorer, while the main editor area contains Python code defining an `Agent` with various accounting-related tools and a system prompt.

INFO: 127.0.0.1:51489 "GET /api/v1/customers/CUST-9d83954d/contacts HTTP/1.1" 200 OK
INFO: 127.0.0.1:51560 "GET /api/v1/customers/CUST-9d83954d/contacts HTTP/1.1" 200 OK
INFO: 127.0.0.1:51678 "GET /api/v1/customers?skip=0&limit;=100 HTTP/1.1"

Agents Are Not Humans

Humans

Agents

The 4 Principles

Principle #1: Outcomes, Not Operations

GRANULAR: 12 tools, multiple calls (tool-per-API)

list_customers(skip, limit)        # No emails!
get_customer(customer_id)        # Opaque IDs
get_customer_contacts(customer_id) # Email here!
list_invoices(skip, limit)       # No filter!
get_invoice(invoice_id)
get_invoice_status(invoice_id)
get_invoice_amount(invoice_id)
get_invoice_dates(invoice_id)
list_payments(skip, limit)        # No filter!
get_payment(payment_id)
get_outstanding_report()
get_overdue_report()

COARSE-GRAINED: 5 tools, one call (workflow-driven)

get_latest_invoice_status(email)
# Complete workflow:
#   email: str
find_overdue_invoices(email, limit)
# Complete workflow:
#   email: str
#   limit: int
# -> list
generate_invoice_report(email, status)
# Complete workflow:
#   email: str
#   status: str
# -> list
track_payment(invoice_id)
# Complete workflow
#   invoice_id: str
search_invoices_by_amount(email, min, max)
# Complete workflow
#   email: str
#   min: float
#   max: float

Principle #2: Flatten Arguments

BAD: Agent must guess the structure

def search_invoices(filters: dict) -> list:
	# {"customer": {"email": "..."}} ?
	# {"email": "..."} ?
	# {"customer_email": "..."} ?
	pass

GOOD: Clear, typed, constrained

def search_invoices(
	email: str,
	status: Literal[
		"all", "draft", "sent",
		"paid", "overdue"
	] = "all",
	limit: int = 20,
) -> list:
	pass

Principle #4: Curate Ruthlessly

Target Recommendation
Tools per server < 50 (split if more)
Parameters per tool < 8
Response size < 10KB
Naming convention domain_noun_verb
"If you have more than 50 tools in a single server, you should consider splitting it." -- AWS Prescriptive Guidance
  • Due Date: March 31, 2026
  • Days Overdue: This invoice is significantly overdue (due date has passed)
  • Payment Status:
  • Payment Received: NO - No payments have been recorded for this invoice
  • Outstanding Amount: AUD $18,750.00 (full amount still due)

Summary:

Alice Mitchell from Acme Corp has an overdue invoice (INV-ALICE-9999) worth AUD $18,750.00 for a Q1 2026 Flat White Bulk Order. The invoice was created on March 28, 2026, and was due on March 31, 2026. No payments have been received for this invoice, so the full amount of $18,750.00 remains outstanding and overdue.

This appears to be a substantial bulk order that requires immediate attention for collection.

Total wall time: 25.57s

API CALL LOG - THE DAMAGE

API Calls Made

Endpoint Response Size Est. Tokens
1 GET /customers 4,892 chars 1,364
2 GET /customers/CUST-908395d/contacts 69 chars 23
3 GET /invoices 23,755 chars 7,918
4 GET /invoices/INV-ALICE-9999 229 chars 76
5 GET /payments 15,809 chars 5,269
TOTAL 43,954 chars 14,650 tokens
  • API calls: 5
  • Total response data: 43,954 characters
  • Estimated tokens consumed: 14,650
  • Time for API calls: 24.85s

demo $

API Call Log Snippet


GET /customers HTTP/1.1 200 206
GET /customers HTTP/1.1 200 206
GET /customers HTTP/1.1 200 206
...
GET /customers/CUST-908395d HTTP/1.1 200 69
GET /customers/CUST-908395d/contacts HTTP/1.1 200 23
GET /invoices HTTP/1.1 200 102
GET /invoices HTTP/1.1 200 102
...
GET /invoices/INV-ALICE-9999 HTTP/1.1 200 229
GET /payments HTTP/1.1 200 259
GET /payments HTTP/1.1 200 259
...

A screenshot of a terminal interface on the left displaying a log of HTTP GET requests to a local API, and a structured text panel

def main():
    agent = Agent(
        model="xs.anthropic.claude-sonnet-4-20240216-v1:0",
        tools=[
            get_latest_invoice_status,
            find_overdue_invoices,
            generate_invoice_report,
            track_payment,
            search_invoices_by_amount,
        ],
        system_prompt="""
            "You are an accounting assistant. You have 5 powerful tools that each complete "
            "a full workflow. Pick the right tool and let it do the work."
            "Return the tool's response directly - don't try to orchestrate multiple calls "
            "unless the user explicitly asks for multiple things."
        """,
    )

    start = time.time()
    result = agent("What is the status of the latest invoice for alice@acme.com?"
                   "Give me the full details including amount, dates, and payment status.")
    elapsed = time.time() - start

    console.print(Panel("[green]"+result.message['content'][0]['text']+"[/green]", title="Agent Response"))
    console.print("Total wall time: [green]{:.2f}s[/green]".format(elapsed))

    show_results()


if __name__ == "__main__":
    main()
A screenshot of a Visual Studio Code editor displaying Python code for an agent. The code defines a `main` function that initializes an `Agent` with a Claude Sonnet model, a list of accounting-related tools (e.g., `get_latest_invoice_status`, `find_overdue_invoices`), and a `system_prompt` instructing it to act as an accounting assistant. The agent is then queried for the status of an invoice, and the results are printed to the console. The left sidebar shows a file explorer with `accounting_tools.py` selected.

I have the resources and support I need to learn about AI.

A screenshot of a web application, possibly an internal HR or feedback tool, with a 'Connections' pop-up survey in the foreground. The survey asks "I have the resources and support I need to learn about AI." and provides five radio button options from "Strongly Agree" to "Strongly Disagree", along with options to defer or skip the question and a "Submit" button.
demo $ ls -l
total 40
drwxr-xr-x  5 mikekg  staff   160 Jun  2 19:26 .
drwxr-xr-x  9 mikekg  staff   288 Jun  2 19:26 ..
-rw-r--r--  1 mikekg  staff   12789 Jun  2 19:26 _init_.py
-rw-r--r--  1 mikekg  staff   3103 Jun  2 19:26 db.py
drwxr-xr-x  3 mikekg  staff    96 Jun  2

Invoice Status and API Call Details

Customer: Alice Mitchell (Acme Corp)

Invoice ID: INV-ALICE-9999

Description: Q1 2026 Flat White Bulk Order

Amount: 18,750.00 AUD

Created Date: 2026-03-20

Due Date: 2026-03-31

Payment Status: OVERDUE (the invoice was due on March 31st, 2026)

The invoice is currently overdue, meaning payment was expected by March 31st, 2026 but has not been received yet.

Here are the full details for Alice's latest invoice:

Agent Response

Customer: Alice Mitchell (Acme Corp)

Invoice ID: INV-ALICE-9999

Description: Q1 2026 Flat White Bulk Order

Amount: 18,750.00 AUD

Created Date: 2026-03-20

Due Date: 2026-03-31

Payment Status: OVERDUE (the invoice was due on March 31st, 2026)

The invoice is currently overdue, meaning payment was expected by March 31st, 2026 but has not been received yet.

Total wall time: 7.77s

Tool Calls Mode

# Test Response Size Est. Tokens
1 get_latest_invoice_status 198 chars 49
TOTAL 198 chars 49 tokens

Tool calls: 1

Total response data: 198 characters

Estimated tokens consumed: 49

Screenshot of a terminal displaying system output, showing invoice details and a table summarizing API tool calls with their response size and estimated tokens.

Components

  • Agent
  • MCP Gateway
  • MCP
A diagram illustrates a system architecture. It shows an "Agent" connected via a cloud icon to an "MCP Gateway", which features a yellow padlock icon indicating security. The "MCP Gateway" then connects to an "MCP" component. In the top right corner, there is a stylized M-shaped logo in white.

Agent

Any framework, any model, all popular protocols

Build, Deploy, Assess

AgentCore

  • Harness - Models, tools, skills, memory
  • CLI - Strands, models, tools, skills, memory
  • SDK - Strands, models, tools, skills, memory
Core Services
  • Built-in tools: Browsers, Code interpreter, Knowledge Bases, Search
  • Gateway: APIs, Lambda functions, configuration bundles
  • Identity: Inbound and outbound authentication
  • Memory: Short & Long term memory
  • Policy: Authorization control
  • Payments: Automate microtransactions
  • Registry: Agents, MCP servers, Tools, Skills
  • Runtime: Agents, tools
Supporting Capabilities
  • Observability: Monitor and debug
  • Evaluations: Batch evaluations, online evaluation configurations, custom evaluators

© 2024, Amazon Web Services, Inc. or its affiliates. All rights reserved.

20

A technical architecture diagram for an 'Agent' system, showing layered components for building, deploying, and assessing agents. Key components include AgentCore, Harness, CLI, SDK, Built-in tools, Gateway, Identity, Memory, Policy, Payments, Registry, Runtime, Observability, and Evaluations, with descriptions for each.

A green square icon depicting a white globe with a mouse pointer clicking on it.

AWS logo.

Agent

Any framework, any model, all popular protocols

  • AgentCore
  • Harness: Models, tools, skills, memory
  • CLI: Strands, models, tools, skills, memory
  • SDK: Strands, models, tools, skills, memory

Core Components:

  • Built-in tools: Browser, Code interpreter, Knowledge Bases, Search
  • Gateway: APIs, Lambda functions, configuration bundles
  • Identity: Inbound and outbound authentication
  • Memory: Short & Long term memory
  • Policy: Authorization control
  • Payments: Automate microtransactions
  • Registry: Agents, MCP servers, Tools, Skills
  • Runtime: Agents, Tools

Cross-cutting Concerns:

  • Observability: Monitor and debug
  • Evaluations: Batch evaluations, online evaluation configurations, custom evaluators

A layered architecture diagram illustrating an "Agent" system. The top layer shows "AgentCore", "Harness", "CLI", and "SDK" interacting with flows labeled "Build", "Deploy", and "Assess". Below this, a set of core components includes "Built-in tools" (Browser, Code interpreter, Knowledge Bases, Search), "Gateway" (APIs, Lambda functions, configuration bundles), "Identity" (inbound and outbound authentication), "Memory" (short & long term), "Policy" (authorization control), "Payments" (automate microtransactions), "Registry" (Agents, MCP servers, Tools, Skills), and "Runtime" (Agents, Tools). At the bottom, "Observability" (Monitor and debug) and "Evaluations" (Batch evaluations, online evaluation configurations, custom evaluators) are shown as foundational services. A green square icon depicting a globe with a cursor is also present on the right.

"We all should be tokenmaxxing."

outcome-maxxing

Strands Agents SDK

https://strandsagents.com
A QR code and the Strands Agents SDK logo, which features a green double helix symbol.

© 2026, Amazon Web Services, Inc. or its affiliates. All rights reserved.

strandsagents.com aws.amazon.com/bedrock/agents

An AWS logo.

Two QR codes. One links to strandsagents.com and the other to aws.amazon.com/bedrock/agents.

Amazon Bedrock AgentCore

* Code

An icon depicting a stylized brain merging with a sparkling star, representing intelligent agents or AI. A QR code. The AWS logo.

Mike Chambers

AI Specialist & Senior Developer Advocate

https://www.linkedin.com/in/mikechambers/

© 2023, Amazon Web Services, Inc. or its affiliates. All rights reserved.

A QR code linking to Mike Chambers' LinkedIn profile.

The AWS logo.

Code >>

https://github.com/aws-samples/amazon-bedrock-rag-chatbot-with-langchain
A QR code.

Technologies & Tools

  • AWS Lambda
  • Claude
  • Claude Code
  • Kiro
  • MCP Lambda handler
  • Postman
  • Strands Agents SDK

Standards & Specs

  • MCP
  • REST API

Concepts & Methods

  • Context Engineering
  • Outcome Maxing
  • Semantic Tool Lookup
  • Service Oriented Architecture

Organisations & Products

  • Agent Core Gateway
  • Amazon Bedrock Agent Core
  • AWS
  • GitHub
  • LinkedIn
  • strandsagents.com