MCP Apps: Give the Model Data, Give the User a UI — Dustin Mihalik, Indeed

Read the talk

MCP Apps: Give the Model Data, Give the User a UI

Dustin Mihalik’s lessons from Indeed show why an attractive widget can weaken an agent—and how separating search, selection, rendering, and interaction context preserves both model capability and a useful interface.

From a talk by Dustin Mihalik

At a glance

Ideas worth remembering

  • Anything visible in an MCP App must also be available as model-readable data, or follow-up questions encounter a black box.

  • Tell the model that the tool renders UI; otherwise it may repeat the widget’s contents in prose.

  • Push meaningful interaction state—such as the selected job or shopping-cart contents—back into model context.

  • Separate repeatable data-processing tools from deliberate rendering tools so UI does not suppress exploration or multiply into clutter.

  • Build small composable search and render tools, and let the final render call include the model’s reasons or highlighted evidence.

Why a job-search UI is worth building

Dustin Mihalik works on job search, AI platform infrastructure, guardrails, gateways, and compliance at Indeed. His practical lessons come from building MCP Apps for Claude, ChatGPT, and Indeed’s Career Scout job-seeker agent. The examples revolve around a useful question: how can a chat host give the model enough freedom to search while giving the user an interface that feels like a real product? 0:14

Recording frame at 92 seconds
Recording frame at 92 seconds

A plain-text search for a barista job in Austin already works reasonably well. The model can divide results between Austin and nearby suburbs and explain what it found. But Indeed loses control over presentation: its branding disappears, the model chooses the organization, and links may not appear consistently. Mihalik says the team spent a “ridiculous number of hours” on evaluations intended to make Claude link to job results reliably. Five jobs “somewhere on the internet” are not very useful if the user cannot open them. 1:43

An MCP App can control the parts that matter. A job card can include an Apply button, emphasize selected information, and open View Details in a modal without sending the user away from the conversation. The host keeps the user in its environment, while Indeed supplies a recognizable and actionable job-search experience. That is the genuine advantage of UI—not decoration, but a controlled path from a result to the next action. 2:43

The trap is assuming that an existing website can simply be dropped into chat. Once a widget loads data through its own APIs, the user may see a rich interface while the model sees only that a tool ran. Product presentation improves, but the conversational agent loses access to the substance it needs for follow-up work. 3:39

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

0:13 · section reference included

Keep the model’s data view aligned with the UI

Suppose a widget displays ten jobs and the user asks, “Tell me about the first result” or “Rank these companies.” If the widget fetched those jobs privately, the model cannot identify the first item, inspect the companies, or compare them. The UI has become a black box. Mihalik’s first rule follows directly: anything shown to the user must also be provided as data to the model. 4:09

Recording frame at 280 seconds
Recording frame at 280 seconds
  • Return model-readable data: The tool should return the structured content that a text-based MCP integration would already expose.
  • Return the interface resource: The accompanying resourceURI identifies the HTML used to render the experience.
  • Maintain parity: When the displayed API response gains a field or changes shape, the model-visible representation must change with it. Returning both forms once is insufficient if they later drift apart.

Giving the model the data creates a second problem: duplication. The widget renders the results, then the model behaves as if no interface exists and narrates the same list underneath it. The tool description must therefore explain the presentation side effect. Mihalik found that a direct instruction such as results were automatically displayed to the user as UI components covers many cases. The model can then offer a short summary and point to the displayed links instead of reconstructing the entire UI in prose. 5:30

These two requirements solve different problems. Model-readable data preserves reasoning and follow-up questions; the tool description coordinates who presents the answer. There will still be some tension between what belongs in prose and what belongs in the widget, but the description gives the model enough information to avoid obvious repetition.

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

3:39 · section reference included

A click is new context, not merely a UI event

Static result parity does not cover what happens after rendering. Imagine that the widget returns ten jobs and the user opens one job’s View Details modal. The interface now contains a full job description, but the model may not know which job was selected or what appeared in the modal. Requests such as “summarize this description” or “write a cover letter for this job” fail for the same reason as the original black-box widget: the user and model are looking at different state. 6:30

Recording frame at 440 seconds
Recording frame at 440 seconds

Interaction state must therefore flow back into model context. The MCP Apps mechanism Mihalik describes is update model context, which accepts a string. Because the interface supplies a single string, an app that needs a history of several events may have to append them over time. The model does not need every low-level click; it needs the resulting semantic state, such as which job is open and which details the user can now see. 7:20

A shopping-cart example makes the pattern concrete. The app can write the cart’s total cost and item list into model context, allowing the user to ask about the items currently in the cart. For job search, the equivalent update would identify the selected job and expose the relevant description. The observable change is simple—a modal opens—but the causal chain matters: the click changes application state, the app summarizes that state into model context, and only then can the model answer a referential follow-up such as “this job.”

At this point the model can see both rendered results and subsequent interactions. Yet the architecture can still make the overall product worse, because visibility alone does not preserve the model’s willingness to explore.

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

6:00 · section reference included

Why coupling search to a widget stops exploration

Mihalik does not use an agent merely to perform one easy search: “I give Claude my really hard problems to solve.” His richer job-search request spans a desired title, several possible relocation cities, compensation preferences, and industries to exclude. With text-based MCP, the model can run ten or fifteen searches, collect candidates, filter them, and produce one final table. 8:36

Recording frame at 569 seconds
Recording frame at 569 seconds

Attaching rendering directly to that search changes the model’s behavior. After one call produces a carousel, the model may treat the results as already delivered and stop the deeper search. Repeating the call would also create ten different carousels, which neither the user nor the model is likely to want. This was an observed failure in the presented workflow, not a quantified comparison across models or deployments, so its frequency remains uncertain; the architectural consequence is still clear when it occurs. 9:43

Mihalik’s third rule supersedes the first two: separate data processing from UI rendering. Search should remain a plain, model-readable operation that can run repeatedly without producing interface clutter. A separate render tool should be called only after the model has explored, compared, and selected what deserves presentation. 10:13

What does that split make possible? The flow below follows the concrete Indeed example from a broad request to five displayed jobs.

The relationship to inspect is the gap between retrieval and presentation. The model can call search jobs as often as needed, accumulate perhaps 100 candidates, and reduce them to five. Only those five IDs cross into the render widget. UI becomes the result of reasoning rather than a side effect of every exploratory call. 10:43

The render tool’s description must identify where its inputs come from and what format it expects. For example, it can instruct the model to call one of several data tools before rendering. This is a modest amount of coordination logic, but it preserves a valuable asymmetry: data tools are cheap to compose and repeat, while rendering is deliberate and sparse.

How it fits togetherHow can the model search 100 jobs but render only five?

Title, multiple cities, compensation preference, and excluded industries.

Exploration stays model-readable and repeatable; rendering happens once after selection.

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

8:06 · section reference included

Let rendering carry the model’s judgment

The same split generalizes beyond jobs. An e-commerce agent can explore many products before rendering a shortlist. A mapping agent can consider several locations before passing five selected addresses into a map. In each case, the useful boundary sits between broad data exploration and the smaller set chosen for human inspection. 12:13

Recording frame at 783 seconds
Recording frame at 783 seconds

A render tool can carry more than identifiers. Indeed could accept a job ID plus the model’s reason that the job is a good fit, or an ID plus a highlighted passage from the description. That lets the interface preserve the model’s comparative judgment instead of reducing its work to a generic set of cards. The model explores freely, then contributes explanation to the final presentation. 12:43

  • Search variants: Two or three small tools can expose different ways to find jobs without attaching UI to every result.
  • List rendering: One render tool can display a curated set of jobs.
  • Focused rendering: Another can highlight one particular job in detail.
  • Simple descriptions: Narrow tools need less explanation, reducing tool-description overload while leaving the model several ways to compose a workflow.

The ending reverses the usual framing of MCP Apps. Start by deciding what data the model needs and what operations it should be free to perform. Treat rendering as the outcome of that exploration. A good interface remains valuable, but it should not become the point where the agent stops thinking. 13:42

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

12:13 · section reference included

Resources

From the talk

  • Mihalik’s page describes his work building AI platforms at Indeed and provides a place to follow his engineering work.

Read the complete timestamped transcript
  1. 0:01

    [music]

  2. 0:13

    >> Uh hey everyone, I'm Dustin Macholic. Uh

  3. 0:15

    I work at Indeed.

  4. 0:18

    Uh we're the number one job site in the

  5. 0:19

    world. And I have to apologize for my

  6. 0:22

    voice. I'm recovering from a cold that I

  7. 0:24

    had last week.

  8. 0:25

    Um

  9. 0:26

    Yeah, so at Indeed, we build

  10. 0:30

    uh

  11. 0:30

    job search. And uh I also work on a team

  12. 0:34

    that does AI platform. And I do like AI

  13. 0:37

    guardrails and and gateways and

  14. 0:40

    compliance stuff. Uh occasionally uh my

  15. 0:43

    team gets cool projects to work on

  16. 0:45

    because we have relationships with the

  17. 0:46

    vendors. Uh MCP apps is one of those.

  18. 0:49

    And um

  19. 0:51

    MCP connectors. So, this is a little bit

  20. 0:53

    of like practical MCP apps. They gave a

  21. 0:56

    great introduction uh to MCP apps. This

  22. 0:59

    is a little bit of a lessons from the

  23. 1:01

    trenches, uh which is a little bit of

  24. 1:03

    like what did we learn in building MCP

  25. 1:06

    and MCP apps for Claude chat chat GPT

  26. 1:09

    and our own internal

  27. 1:11

    uh

  28. 1:12

    uh career scout, which is our uh agent

  29. 1:15

    that we have for job seekers.

  30. 1:18

    So, this is the this is the chat-based

  31. 1:20

    interface. So, a lot of my examples are

  32. 1:22

    going to be job search. This will I have

  33. 1:24

    a lot of screenshots of job searches.

  34. 1:27

    Um So, this is this is a job search,

  35. 1:30

    which is basically uh you know, I'm

  36. 1:32

    looking for barista in Austin. And this

  37. 1:34

    is a text-based response. And this works

  38. 1:37

    pretty well. Uh as we kind of discussed,

  39. 1:40

    like there's no branding here. There's

  40. 1:41

    no Indeed branding. Uh you know, Claude

  41. 1:45

    decided to say these are some jobs in

  42. 1:47

    Austin. These are some jobs in some

  43. 1:48

    suburbs of Austin. That's cool. That's

  44. 1:50

    probably good for the user. There may be

  45. 1:52

    some limitations uh

  46. 1:55

    of like what we can do for branding or

  47. 1:58

    how we can uh

  48. 1:59

    you know, how we can control things. And

  49. 2:02

    you'd be actually be surprised uh unless

  50. 2:04

    you've tried to do this yourself that um

  51. 2:07

    it's really hard to get Claude or

  52. 2:09

    ChatGPT to link to things cuz they don't

  53. 2:12

    want you to leave their environment. It

  54. 2:14

    makes complete sense, but uh if you get

  55. 2:17

    back, here's five jobs that are

  56. 2:19

    somewhere on the internet uh without any

  57. 2:22

    links, that's a terrible user

  58. 2:24

    experience. Uh so it's it took us a

  59. 2:27

    ridiculous number of hours and evals to

  60. 2:29

    make sure that like Claude would

  61. 2:31

    consistently link to things.

  62. 2:34

    So with MCP apps and with uh apps SDK,

  63. 2:37

    uh we could kind of control that. Uh we

  64. 2:40

    can decide

  65. 2:42

    uh you know, that we've got an apply

  66. 2:43

    button. We can decide what stuff is

  67. 2:46

    important that we want to highlight at

  68. 2:47

    the top. We can provide a link to view

  69. 2:50

    details

  70. 2:52

    um so that when you click it, you get uh

  71. 2:55

    a a pop-up, a a modal that has all the

  72. 2:58

    job details so you don't have to leave

  73. 3:00

    the environment. So it's it's a win-win

  74. 3:03

    uh for for both for both uh for both

  75. 3:06

    companies.

  76. 3:09

    So uh MCP apps is really good, but if

  77. 3:13

    you're thinking about hey, I want to

  78. 3:15

    build an MCP app or I want to take my

  79. 3:16

    website, I want to put it in ChatGPT or

  80. 3:18

    Claude, uh it's not quite just as easy

  81. 3:22

    as like dragging and dropping into a

  82. 3:24

    chat interface. Uh you really want to

  83. 3:26

    think about how you are representing the

  84. 3:29

    data, how you're making it available to

  85. 3:31

    the user.

  86. 3:32

    So if you do a very naive thing,

  87. 3:35

    uh which is you still call your existing

  88. 3:37

    APIs uh for loading data, um then it

  89. 3:42

    basically becomes a black box to the

  90. 3:44

    model, right? So you say, "Hey, I want

  91. 3:46

    to do something." The model says, "Cool,

  92. 3:48

    I'll call a tool."

  93. 3:50

    The tool says, "Okay, I'm going to show

  94. 3:52

    some stuff, but the model has no idea

  95. 3:56

    what what you're displaying." So,

  96. 3:58

    there's all these like follow-up

  97. 3:59

    questions, like tell me about the first

  98. 4:01

    result, or please rank this list of

  99. 4:03

    companies. The model has no idea what

  100. 4:06

    data is being displayed.

  101. 4:07

    So, the very first rule

  102. 4:10

    uh for me

  103. 4:11

    uh building MCP apps, anything that you

  104. 4:13

    show to the user also needs to be

  105. 4:16

    provided as data to the model. I think

  106. 4:19

    this makes sense, but uh I've definitely

  107. 4:22

    seen some MCP apps where they just, you

  108. 4:24

    know, use it to inject some HTML on the

  109. 4:26

    page and then call some APIs,

  110. 4:29

    uh and that's that just makes a big

  111. 4:31

    black box for the model. So, this is

  112. 4:33

    really easy to do

  113. 4:35

    uh using MCP spec and the MCP app spec.

  114. 4:38

    Uh this structured content, this is what

  115. 4:40

    you would already be returning if you

  116. 4:41

    were doing just text-based MCP. Um and

  117. 4:45

    then this resource URI, that's points to

  118. 4:47

    where the HTML is. You need to return

  119. 4:50

    both of these, and you need to keep them

  120. 4:51

    in sync, right? If you add something new

  121. 4:53

    to the API, you make sure you add

  122. 4:55

    something add that same data

  123. 4:57

    uh back.

  124. 5:00

    So, kind of the next step um that uh

  125. 5:05

    that once you do that,

  126. 5:07

    uh you'll find is that now you've

  127. 5:10

    provided data to the model,

  128. 5:12

    and you provided this black box that it

  129. 5:14

    has no idea about, it's still going to

  130. 5:16

    try and describe the it's still going to

  131. 5:19

    try and take the output and describe it

  132. 5:21

    as it normally would. So, you end up

  133. 5:23

    with like, "Here's your display." and

  134. 5:24

    then here's the model doing basically

  135. 5:27

    the same thing that it would normally

  136. 5:28

    do. Um so, what you need to do is you

  137. 5:30

    need to update your description in order

  138. 5:33

    to tell it that you're going to be

  139. 5:34

    displaying stuff in your MCP app. Uh

  140. 5:37

    that way you get this like nice, you

  141. 5:39

    know, here's a list of you know, here's

  142. 5:41

    a little summary of things, and you

  143. 5:43

    know, the results are are are showed

  144. 5:45

    above the links, rather than it trying

  145. 5:47

    to like do a whole text-based display.

  146. 5:50

    Um

  147. 5:51

    you'll end up with this a little bit of

  148. 5:52

    a battle between like what gets

  149. 5:54

    displayed in UI and what gets displayed

  150. 5:56

    by the model. You can try and steer that

  151. 6:00

    with descriptions. So, even something as

  152. 6:02

    simple as results were automatically

  153. 6:04

    displayed to the user as UI components

  154. 6:07

    at the top of your description, your

  155. 6:09

    tool description,

  156. 6:10

    uh that covers that covers quite a bit

  157. 6:13

    of the cases. Um

  158. 6:16

    So, that's one of the next things that

  159. 6:18

    you're going to want to do uh once

  160. 6:20

    you're providing both data and API

  161. 6:23

    access.

  162. 6:24

    Uh the next thing is there's these

  163. 6:26

    interactable pieces, right? There's the

  164. 6:28

    apply button, there's a view details

  165. 6:30

    button, which pops up a big job

  166. 6:32

    description.

  167. 6:33

    Um this is the same case where, you

  168. 6:36

    know, as you interact with those, the

  169. 6:38

    model's not going to know necessarily

  170. 6:40

    what you're looking at. So, you click

  171. 6:41

    view details, you get a big modal that's

  172. 6:44

    here's everything about the job.

  173. 6:47

    There's once again a whole bunch of

  174. 6:49

    questions that the user could ask.

  175. 6:51

    Uh write a cover letter for this job,

  176. 6:53

    summarize this job description. It has

  177. 6:56

    no idea because you've loaded that data

  178. 6:58

    in either in via API or you loaded it in

  179. 7:01

    dynamically,

  180. 7:02

    uh you know, hit you return 10 jobs and

  181. 7:05

    user clicks on one,

  182. 7:07

    the model has no idea which one you

  183. 7:09

    clicked on.

  184. 7:11

    Uh so, any information about user

  185. 7:14

    interactions, you also need to provide

  186. 7:17

    to the model.

  187. 7:20

    And

  188. 7:21

    uh once again, MCP abstract has a pretty

  189. 7:24

    easy way to handle it. There's this

  190. 7:25

    update model context

  191. 7:27

    um method, which lets you pass in a

  192. 7:30

    string

  193. 7:31

    uh that is

  194. 7:33

    So, for MCP apps, there's a single

  195. 7:35

    string. Uh so, if you like want to track

  196. 7:37

    multiple events over time, you kind of

  197. 7:39

    have to append

  198. 7:41

    uh multiple things to the string, but

  199. 7:43

    this is this is this is an example from

  200. 7:46

    the MCP apps uh documentation where

  201. 7:49

    basically, you know, this is a shopping

  202. 7:51

    cart application and they add the total

  203. 7:53

    cost and all the items that are on the

  204. 7:56

    shopping cart so the user can ask for

  205. 7:59

    uh you know, "Tell me information about

  206. 8:01

    the items that are in my shopping cart."

  207. 8:03

    >> [snorts]

  208. 8:05

    >> So, these

  209. 8:07

    two things give you an app that like the

  210. 8:10

    model could kind of see what's going on.

  211. 8:13

    Um but it doesn't necessarily make a

  212. 8:15

    really good MCP app yet

  213. 8:19

    uh because it gives you it gives you

  214. 8:20

    some UI that looks like what you want,

  215. 8:23

    but

  216. 8:25

    the thing that I usually do, I don't

  217. 8:27

    give I don't give the I don't I don't

  218. 8:29

    give Claude

  219. 8:31

    uh my easy problems to solve. I give

  220. 8:33

    Claude my really hard problems to solve,

  221. 8:36

    right? Like if I just wanted to do one

  222. 8:37

    search, I would go to the web and do one

  223. 8:40

    search. I want to do a whole bunch of

  224. 8:41

    searches. Uh

  225. 8:43

    this is this is out of date cuz there's

  226. 8:45

    no Sonic 5 here yet, but uh this is

  227. 8:49

    screenshot from 2 days ago.

  228. 8:51

    Uh but yeah, so that So, like this job

  229. 8:53

    search is "Hey, I'm looking for this I'm

  230. 8:55

    looking for this title.

  231. 8:57

    I'm willing to relocate, so I want to

  232. 8:59

    search across a whole bunch of different

  233. 9:01

    cities.

  234. 9:02

    Um you know, I'm looking for the highest

  235. 9:04

    paying option, so I want you to just

  236. 9:05

    cherry-pick a few out of there. There's

  237. 9:07

    some industries that I absolutely don't

  238. 9:09

    want to work in."

  239. 9:11

    Text-based MCP

  240. 9:14

    does really well. Like

  241. 9:15

    we all see this, right? Claude will do

  242. 9:18

    10 different searches, 15 different

  243. 9:20

    searches. It'll filter, it'll pull out

  244. 9:23

    all the individual pieces,

  245. 9:25

    uh and then it gives you a nice table at

  246. 9:26

    the bottom, uh which is which is super

  247. 9:29

    nice.

  248. 9:30

    >> [snorts]

  249. 9:30

    >> But with the MCP app that we were just

  250. 9:32

    discussing, you know, we we said, "Hey,

  251. 9:36

    uh you know, my results are going to be

  252. 9:38

    displayed in this UI. Uh

  253. 9:43

    We know Claude Claude will call it once

  254. 9:46

    and then it'll be like, "Oh, I guess the

  255. 9:47

    results are already displayed. I'm not

  256. 9:48

    going to like do a deep dive, right?"

  257. 9:50

    Like it doesn't It's you as a user are

  258. 9:53

    not going to want 10 different carousels

  259. 9:56

    and Claude

  260. 9:58

    will also notice that like it's already

  261. 9:59

    been displaying some stuff and it won't

  262. 10:02

    call to show 10 different carousels.

  263. 10:05

    Um

  264. 10:06

    and so what you really want to do, and

  265. 10:07

    this is rule three, this like supersedes

  266. 10:10

    all the other rules,

  267. 10:12

    uh which is basically you want to

  268. 10:13

    separate your data processing from your

  269. 10:15

    UI rendering.

  270. 10:18

    And this particular wording I stole uh

  271. 10:22

    from OpenAI uh

  272. 10:24

    >> [snorts]

  273. 10:24

    >> OpenAI

  274. 10:26

    uh

  275. 10:27

    Apps SDK documentation. There's a couple

  276. 10:29

    places where they say this.

  277. 10:32

    Um but basically they want to You want

  278. 10:34

    to separate your data processing from

  279. 10:36

    your UI rendering. So the job search

  280. 10:41

    that we had

  281. 10:42

    we're just going to have that be a

  282. 10:43

    standard text-based MCP application.

  283. 10:47

    Claude can call that as many times as it

  284. 10:49

    wants. And then we have a render tool

  285. 10:52

    that either

  286. 10:53

    you can pass

  287. 10:55

    you can have the model basically pass

  288. 10:57

    all the data that it wants to render in

  289. 10:59

    or you can do a reference uh to it. So

  290. 11:02

    in our particular case

  291. 11:04

    uh you know, we had search jobs. Now we

  292. 11:07

    have a search jobs that doesn't return

  293. 11:09

    any UI and we have a render jobs widget

  294. 11:12

    that takes a list of IDs.

  295. 11:14

    Um and so that list of IDs

  296. 11:17

    uh

  297. 11:18

    can be, you know, Claude can do a

  298. 11:19

    search. It can get

  299. 11:22

    a hundred different jobs that it cares

  300. 11:23

    about. It can filter those. It can find

  301. 11:26

    five that it cares about and it can show

  302. 11:28

    those five to the user.

  303. 11:30

    Um now as you make these like render

  304. 11:34

    uh as you make these render calls, you

  305. 11:36

    need to update the descriptions to say

  306. 11:38

    like where did they get the data, what

  307. 11:40

    format the data should be.

  308. 11:42

    But it's a fairly easy fairly easy

  309. 11:45

    mechanism to update your tool

  310. 11:46

    description to say you need to always

  311. 11:48

    call one of these three tools first in

  312. 11:51

    order to get

  313. 11:53

    the data that you're going to be using

  314. 11:54

    for rendering.

  315. 11:56

    So, search jobs, this is a pretty good

  316. 11:59

    um

  317. 12:00

    It's a pretty good example

  318. 12:03

    of of how we where we want to split data

  319. 12:06

    from rendering. I think there's a ton of

  320. 12:08

    other like

  321. 12:10

    in most industries, you can kind of come

  322. 12:12

    up with like, "Hey, where do I want to

  323. 12:15

    you know, where do I want to split?"

  324. 12:16

    Like I want to be I want

  325. 12:18

    the model to be able to explore this

  326. 12:20

    data and then I want it to turn around

  327. 12:22

    and choose to be able to render it.

  328. 12:24

    Right? Like there's there's examples of

  329. 12:28

    you know

  330. 12:29

    e-commerce, right? Like

  331. 12:32

    a bunch of e-commerce options.

  332. 12:34

    If you've got a map, you know, maybe you

  333. 12:36

    want to come up with like five different

  334. 12:38

    addresses and then you pass in

  335. 12:40

    addresses.

  336. 12:41

    The other thing that you can do is you

  337. 12:42

    can let the model be a lot more

  338. 12:44

    creative. Like one of the things that

  339. 12:46

    we've seen in some of this text-based

  340. 12:49

    stuff is that

  341. 12:52

    you know, the model will say like, "This

  342. 12:53

    is a

  343. 12:54

    >> [clears throat]

  344. 12:54

    >> This is a reason why I picked this one."

  345. 12:56

    Or "This is a reason why this is really

  346. 12:58

    good."

  347. 12:59

    And so, you know, potentially we can add

  348. 13:01

    something to the render jobs widget

  349. 13:03

    where you say give us an ID and a reason

  350. 13:07

    why you think that this is a good fit.

  351. 13:09

    Or give us an ID and highlight a section

  352. 13:13

    of the job description that is really

  353. 13:14

    good. Um, so you can get really creative

  354. 13:18

    with your render tools to be able to

  355. 13:20

    have to be able to give some extra

  356. 13:23

    character that the model can inject

  357. 13:26

    into those so that

  358. 13:29

    so that you've got a much better

  359. 13:30

    experience for the user.

  360. 13:34

    So [snorts] the key takeaways

  361. 13:36

    right

  362. 13:37

    when building MCP apps, you want to

  363. 13:39

    focus on the data before you focus on

  364. 13:42

    the UI which sounds sounds opposite of

  365. 13:44

    you know how we were thinking about it

  366. 13:46

    of like hey there's all these there's

  367. 13:47

    these MCP apps like it's how I put UI

  368. 13:50

    into chat GPT.

  369. 13:52

    I think if you want to really have a

  370. 13:55

    good MCP apps experience, you need to

  371. 13:58

    you need to look at and see what data do

  372. 14:01

    I want to what data do I want to give to

  373. 14:02

    the model, what data do I want it to be

  374. 14:04

    able to do and then

  375. 14:07

    rendering is a side effect of of that or

  376. 14:10

    it's a result of the the model exploring

  377. 14:14

    the data.

  378. 14:15

    And then I think small composable tools,

  379. 14:18

    right? So

  380. 14:20

    uh

  381. 14:22

    basically, you know

  382. 14:24

    maybe there's like two or three

  383. 14:25

    different ways you can search for jobs.

  384. 14:27

    We could build two or three different

  385. 14:28

    search tools and then there's one render

  386. 14:30

    tool or maybe there's like maybe there's

  387. 14:33

    two render tools there's one that's

  388. 14:35

    render a list of jobs, one that's, you

  389. 14:37

    know, highlight one particular job. So

  390. 14:40

    you could build a bunch of much smaller

  391. 14:41

    tools. The descriptions can be fairly

  392. 14:44

    simple so you don't overload the model,

  393. 14:46

    but it gives the model flexibility about

  394. 14:49

    how it wants to explore the data and how

  395. 14:51

    it wants to render the tools.

  396. 14:54

    So that's

  397. 14:56

    basically basically my talk. I'm a few

  398. 14:59

    minutes few minutes fast.

  399. 15:01

    But I don't have a booth that I'm going

  400. 15:04

    to hang out in, but I'll I'll hang out

  401. 15:05

    in the hall if anyone has any questions.

  402. 15:08

    And I am either my last name or my first

  403. 15:12

    initial last name on most social media

  404. 15:14

    platforms.

  405. 15:15

    Thank you.

  406. 15:32

    >> [music]

  407. 15:33

    >> Mhm.