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 explains how Indeed separates job search from presentation so an assistant can explore results, understand user interactions, and display a useful shortlist without stopping its work too early.

From a talk by Dustin Mihalik

At a glance

Ideas worth remembering

  • A widget can make job details and application controls dependable, but its displayed data and changing interaction state must also reach the model for follow-up questions to work.

  • Tool descriptions should explain what the UI already presents and where rendering inputs come from. This steers the assistant’s behavior, without guaranteeing that duplicate output disappears.

  • Separate retrieval from rendering so exploratory calls do not each produce a visible answer. Indeed’s job-ID renderer lets the assistant filter a pool of 100 jobs to five before displaying them.

  • Start with the data the model needs and use small tools it can compose. Rendering can then express the selected results and, as a proposed extension, the model’s reasons for selecting them.

Why job search benefits from an interface

Selected presentation frame from MCP Apps: Give the Model Data, Give the User a UI — Dustin Mihalik, Indeed at 92 seconds
Why job search benefits from an interface

Dustin Mihalik introduces practical lessons from Indeed’s work on MCP connectors and apps for Claude, ChatGPT, and its own job seeker agent. His team works on AI platform infrastructure, including guardrails, gateways, and compliance. Job search provides the examples throughout: a conversation must help someone discover opportunities and then act on them.

A plain text response to a search for barista jobs in Austin can already be useful. Claude can organize results into jobs in the city and jobs in nearby suburbs. But the host controls the presentation, leaving Indeed with limited control over branding and the information emphasized. More consequentially, Mihalik reports that getting Claude and ChatGPT to include outbound links consistently was difficult. Five job suggestions without usable links leave the user without a practical next step; Indeed spent substantial time on evaluations to improve that behavior. His explanation that hosts prefer users to stay in their environment is an interpretation of the difficulty.

An MCP app gives the provider explicit presentation controls. Indeed can supply an apply button, highlight important information, and offer a details control that opens the full job description in a modal. The user can inspect a job without leaving the conversation, while the provider can make the path to applying visible and dependable.

0:150:30
Suggest correction

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

0:01 · section reference included

Give the model everything the interface displays

Selected presentation frame from MCP Apps: Give the Model Data, Give the User a UI — Dustin Mihalik, Indeed at 280 seconds
Give the model everything the interface displays

Putting a website inside a chat interface requires more than embedding its existing presentation. If the widget loads data through its own APIs without returning that information to the model, it becomes a black box. The model knows that it called a tool, but it does not know which results appeared. A follow-up request to explain the first result or rank the displayed companies then refers to information the assistant cannot identify.

Mihalik’s first rule is that anything shown to the user must also be provided as data to the model. He describes returning both structured content, as a text-based MCP tool would already do, and a resource URI pointing to the interface. These serve different consumers: the structured content gives the assistant information it can reason about, while the resource supplies the presentation. They must stay synchronized. Adding a field to the data displayed by the app also requires returning that field to the model.

3:093:16
Suggest correction

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

3:09 · section reference included

Explain the presentation in the tool description

Selected presentation frame from MCP Apps: Give the Model Data, Give the User a UI — Dustin Mihalik, Indeed at 343 seconds
Explain the presentation in the tool description

Returning model-readable data solves visibility, but it introduces another problem: the assistant may produce its usual full text presentation underneath the widget. The user receives the interface and then a second version of essentially the same results. The model has the data, yet still lacks an explanation of what the app already displayed.

The second rule is to tell the model, through the tool description, that the app displays results. This can steer it toward a short summary rather than reconstructing an entire result list in text. Mihalik says that placing a statement near the top of the description explaining that results are automatically displayed as UI components covers many cases. He describes an ongoing tension between interface output and model output, so the description is a steering mechanism rather than a guarantee that duplication disappears.

5:075:10
Suggest correction

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

5:00 · section reference included

Make user interactions visible to the assistant

Selected presentation frame from MCP Apps: Give the Model Data, Give the User a UI — Dustin Mihalik, Indeed at 440 seconds
Make user interactions visible to the assistant

An interactive app can drift away from the model’s knowledge after the initial tool response. Opening a job’s details may load a description dynamically or through another API. Even if the initial response contained 10 jobs, the model does not automatically know which one the user clicked. Requests to summarize this job description or write a cover letter for this job require both the selected job’s identity and the relevant details.

Mihalik extends the visibility requirement to user interactions and describes a method for updating model context. In the mechanism he presents, the app supplies a single string; retaining multiple events over time requires appending information to that string. His shopping-cart example includes the cart’s items and total cost, allowing the assistant to answer questions about its contents. The important capability is communicating the app’s changing state to the assistant; the talk does not establish an exact API signature.

6:246:26
Suggest correction

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

6:24 · section reference included

Why attaching a widget can reduce exploration

Selected presentation frame from MCP Apps: Give the Model Data, Give the User a UI — Dustin Mihalik, Indeed at 568 seconds
Why attaching a widget can reduce exploration

An app that exposes its data and interactions can still undermine the reason someone asked an assistant for help. Mihalik’s harder job-search example combines a target title, willingness to relocate across several cities, a preference for the highest-paying options, and industries the user wants to exclude. This requires exploration and comparison. He reports that text-based MCP works well for this pattern: Claude may perform 10 or 15 searches, filter the results, extract relevant information, and assemble a table.

When the search tool also displayed a widget, Mihalik observed Claude calling it once and then stopping because results were already on screen. Repeated searches would also produce repeated presentation: a user would not want 10 separate carousels. Coupling retrieval to rendering therefore made an exploratory call look like a completed answer. This is a reported behavior from Indeed’s implementation, rather than a universal claim about every MCP app.

His third rule addresses that coupling: separate data processing from UI rendering. He gives this rule priority over the earlier rules because making information visible and explaining the widget’s behavior still does not give the assistant room to search freely before presenting its answer.

8:078:10
Suggest correction

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

8:05 · section reference included

Search freely, then render selected results

Selected presentation frame from MCP Apps: Give the Model Data, Give the User a UI — Dustin Mihalik, Indeed at 651 seconds
Search freely, then render selected results

Mihalik attributes the separation principle’s wording to OpenAI’s Apps SDK documentation. Indeed implements it with a search tool that returns no UI and a separate job-rendering widget. The assistant can call the search tool repeatedly without adding a visible result carousel each time. Rendering becomes an explicit action after the model has decided what to show.

A render tool can accept the full data to display or references to that data. Indeed chooses references: its widget takes a list of job IDs. In Mihalik’s example, Claude can gather 100 jobs, filter them to five, and pass those five to the renderer. This separates the size of the candidate pool from the size of the visible answer. Tool descriptions must explain where rendering inputs come from and what format they require; he suggests describing the prerequisite retrieval tools that should be called first.

The same boundary can apply to other domains. An assistant can explore e-commerce options before choosing which ones to present. For a map, it might first identify five addresses and then pass those addresses to a renderer. The design question is where the model needs freedom to investigate data and where it should commit to a particular presentation.

10:1810:22
Suggest correction

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

10:18 · section reference included

Let the presentation carry the model’s explanation

Selected presentation frame from MCP Apps: Give the Model Data, Give the User a UI — Dustin Mihalik, Indeed at 783 seconds
Let the presentation carry the model’s explanation

Separating rendering also creates room for the model to contribute more than a list of identifiers. In text responses, Mihalik has seen the assistant explain why it selected a particular job. He proposes extending the rendering widget to accept a job ID together with a reason the job fits, or an ID together with a passage from the job description to highlight. The interface could then present both the opportunity and the assistant’s explanation of its relevance.

This is a proposed extension, with no measured improvement reported in the talk. Its purpose is to preserve the assistant’s useful explanatory contribution within the rendered experience, giving the widget more character and helping the user understand why a result was selected.

12:4112:42
Suggest correction

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

12:41 · section reference included

Build around data and small composable tools

Mihalik closes by recommending that developers decide what data the model should receive and what it should be able to do with that data before focusing on the interface. Rendering follows the model’s exploration. This changes the starting point for an MCP app: the useful capability is the assistant’s access to information and freedom to work with it, with the UI presenting the resulting selection.

Small composable tools support that freedom. If there are two or three ways to search for jobs, those can become separate search tools feeding one renderer. Alternatively, two rendering tools might serve different purposes: displaying a list and highlighting a single job. Mihalik recommends keeping descriptions fairly simple so they do not overload the model, while preserving its flexibility to choose how to explore and how to present. He ends by offering to answer questions in the hall.

13:3413:37
Suggest correction

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

13:34 · section reference included

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.