A2UI + MCP Apps: Combining the best of declarative and custom agentic UIs

This post introduces three architectural patterns designed to integrate Model Context Protocol (MCP) Apps and Agent-to-User Interface (A2UI) to solve the tradeoff between highly custom iframe environments and native, declarative rendering. By combining these approaches, developers can serve native-feeling UIs directly over MCP servers, embed complex and stateful iframe apps securely inside declarative views, or inject generative UI components into legacy systems. Ultimately, these hybrid frameworks empower engineering teams to deliver secure, performant, and brand-consistent agentic user experiences tailored to their specific project constraints.

Make Gemini more helpful and relevant to your teaching goals with the Google Classroom app in Gemini

Educators have shared that AI is especially helpful when it understands the context of their teaching environment, from tailoring resources toward student needs or building on their existing materials. To support this, Gemini will be able to collaborate with your Google Classroom, using context from your classes to inform its outputs or help complete tasks. For example, educators can get insights on student progress and understanding, create resources and differentiated materials based on Classroom context, or get help drafting posts and assignments.

Students 18 and older can similarly use the Classroom app to stay organized across classes – from getting a list of upcoming assignments, creating study plans, doing test practice based on Classroom content, and staying up-to-date on the latest announcements. Based on your prompts, Gemini will identify when context from Google Classroom will be relevant, and use it to inform its outputs. You can also explicitly tell Gemini to use information from your Google Classroom account by typing, “@Classroom” and clicking on the Classroom app when it pops up.



For example, educators can ask Gemini to:

  • Draft communications: Draft communications and posts based on your Google Classroom information.
  • Draft differentiated assignments and plans: Help draft and update assignments, and generate timelines and structured plans, based on information and content from your Google Classroom.
  • Understand student progress and take action: Summarize who has submitted assignments, how students have done on prior assignments, and identify where students might need additional teacher support.
  • Streamline administrative tasks: Update assignment titles, descriptions, and more across multiple classes in draft mode, make seating charts, and find old assignments.

Important notes

Gemini Apps can’t perform certain actions in the Google Classroom app, like:

  • Enter grades or provide private feedback directly
  • Delete, archive, or directly post assignments or announcements (it can post to draft)
  • Create rubrics
This feature will be available in English for users designated as over the age of 18 who are using a Google Workspace for Education or Business account in Classroom and Gemini. The Classroom app in Gemini does not currently support data regionalization and your usage data may be stored outside of your designated data region. Data region support for the Classroom app in Gemini is expected later this year.

Getting started

  • Admins: Access to the Classroom app in Gemini will be ON by default for all Education domains and can be disabled at the OU or group level. For all other domains, access will be OFF by default and can be enabled at the OU or group level. Access can be turned on or off with a new Classroom app setting in the Gemini section of the Admin console. Visit the Help Center to learn more about turning Google apps in Gemini on or off for your organization.

Admin console settings to control Classroom in Gemini app


  • End users: Your admin configuration will determine if you can use the Classroom app in Gemini. Access to the Classroom app in Gemini will be ON by default and can be disabled at the end user level in the connected apps section of the Gemini app settings. Visit the Help Center to learn more about using apps connected to Gemini.

End user settings to enable Classroom in Gemini app

Rollout pace

Availability

Resources

Chrome for Android Update

 Hello Everyone! We've just released Chrome 150 (150.0.7871.28) for Android to a small percentage of users. It'll become available on Google Play over the next few days. You can find more details about early Stable releases here.

This release includes stability and performance improvements. You can see a full list of the changes in the Git log. If you find a new issue, please let us know by filing a bug.

Harry Souders
Google Chrome

Stable Channel Update for ChromeOS / ChromeOS Flex

The ChromeOS Stable channel is being updated to OS version 16667.47.0 (Browser version 149.0.7827.153) for most ChromeOS devices.

If you find new issues, please let us know one of the following ways:
  1. File a bug
  2. Visit our ChromeOS communities

    1. General: Chromebook Help Community

    2. Beta Specific: ChromeOS Beta Help Community

  3. Report an issue or send feedback on Chrome

  4. Interested in switching channels? Find out how.

Luis Menezes

Google ChromeOS 

Building a Mixed-Reality Tour Guide with Android XR, the Geospatial API, and Gemini

Posted by Coco Fatus, UX Designer, Alon Hetzroni, UX Engineer, Azin Mehrnoosh, Product Manager Android XR




At this year's Google I/O, we announced an update for spatial experiences: the Geospatial API is now available as a preview in ARCore for Jetpack XR. By bringing Google's Visual Positioning System (VPS) to Android XR, Android XR enables anchoring digital content to the physical world with sub-meter accuracy and precise orientation in supported areas.* To explore what the Geospatial API could unlock, our team built a demo: the XR Geospatial Tour.

Imagine walking into a new city, putting on a pair of wired XR glasses (like the upcoming XREAL Project Aura), and instantly having a knowledgeable, local guide showing you around. You don't need to stare down at a 2D map—instead, 3D models gently guide your path, and an intelligent voice tells you about the historical landmarks right in front of you. We combined the Geospatial APIs, Gemini API using Firebase AI Logic, Google Maps Grounding, and Jetpack XR SDK to create a hands-free, immersive walking tour experience.

*Disclaimer: Video and Tour Guide application are for demonstration purposes only. Some sequences have been shortened. Any hardware depicted may be under development; final product details may differ.

Let’s walk through the implementation details and show how we tied these APIs together to build a world-scale spatial experience.

1. Pinpointing the User with ARCore Geospatial API (VPS)

Enhance your navigation experience on XR by combining the power of GPS with the precision of VPS. The accuracy and precise orientation that comes with VPS allows 3D waypoints to align with the physical world.

This is why the Geospatial API on Android XR can help you build custom experiences. By using advanced computer vision, VPS tries to provide a GeospatialPose (including latitude, longitude, and heading) that is more accurate than GPS.

Here's how we retrieve the user's Geospatial pose by mapping the device's orientation to a Geospatial coordinate:

// Retrieve the current geospatial pose from the ARCore session
val result = geospatial.createGeospatialPoseFromPose(arDevice.state.value.devicePose)
if (result is CreateGeospatialPoseFromPoseSuccess) {
val pose = result.pose
Log.d("VPS", "Accurate Location: ${pose.latitude}, ${pose.longitude}")
}

Because the entire experience relies on this accuracy, we monitor the horizontalAccuracy and orientationYawAccuracy until they meet our thresholds. If the user is indoors or in an unrecognized area, we prompt them to "walk to an outdoor public space and look around".

2. Crafting the Itinerary with Gemini API & Google Maps Grounding

Once we have a location, we use the Gemini API using Firebase AI Logic to prompt the Gemini model to act as a local tour guide. We pass the user's coordinates to the model and ask it to output a structured JSON response containing nearby walking tours:

val configForTools = ToolConfig(
functionCallingConfig = null,
retrievalConfig = retrievalConfig {
latLng = FirebaseLatLng(pose.latitude, pose.longitude)
languageCode = "en"
}
)
val responseJsonSchema = Schema.obj(
mapOf(
"locationIntro" to Schema.string(),
"tours" to Schema.array(
Schema.obj(
mapOf(
"title" to Schema.string(),
"description" to Schema.string(),
"stops" to Schema.array(
Schema.obj(
mapOf(
"name" to Schema.string(),
"detailedName" to Schema.string(),
"description" to Schema.string()
)
)
)
)
)
)
)
)
val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
modelName = "gemini-3.5-flash",
tools = listOf(Tool.googleMaps()),
generationConfig = generationConfig {
responseMimeType = "application/json"
responseSchema = responseJsonSchema
}
)
val result = model.generateContent("The user is at latitude ${pose.latitude} and longitude ${pose.longitude}. Generate exactly 3 diverse tours near this location (e.g., historical, food, nature). All tour ideas should be walking distance only.")

Large Language Models are great at generating rich descriptions, but they can sometimes hallucinate exact latitude/longitude coordinates. To solve this, we used Google Maps Grounding to ground the AI.

3. A Voice to Guide You: Gemini 2.5 TTS

To make the tour guide feel truly present, we implemented dynamic voiceovers.

Using the gemini-2.5-flash-tts model, we can configure our model generation config to natively return audio data instead of just text! Here’s how you can request the ResponseModality.AUDIO:

val ttsModel = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativeModel(
modelName = "gemini-2.5-flash-tts",
generationConfig = generationConfig {
// Instruct the model to return Audio
responseModalities = listOf(ResponseModality.AUDIO)
}
)
val response = ttsModel.generateContent("Say in a neutral but positive voice:\n$prompt")
// Extract the raw audio bytes from the response
val audioBytes = response.candidates.firstOrNull()?.content?.parts
?.filterIsInstance<InlineDataPart>()
?.firstOrNull { it.mimeType.contains("audio") }?.inlineData

4. Bringing it to Life in 3D with Jetpack XR

The final piece of the puzzle is rendering this data in the user's field of view. The Jetpack XR SDK makes it intuitive to transition from a 2D Android UI to spatial computing.

We used Jetpack Compose for XR to build spatial components. To represent points of interest along the tour, we built a Composable called InfoSphere, which contains a GltfModel of a 3D orb that floats in space and can be interacted with to reveal information.

Using Jetpack XR SDK, we can place 3D models alongside the Compose UI using SpatialBox and SceneCoreEntity. We also used InteractableComponent to respond to user taps.

@Composable
fun InfoSphere(
content: InfoBubbleContent,
session: Session,
sphereModel: GltfModel,
isSelected: Boolean,
onClick: () -> Unit
) {
// SpatialBox lets us arrange 3D components and SpatialPanels together
SpatialBox(
SubspaceModifier
.offset(x = 2.dp, y = 1.dp, z = (-3).dp) // Positioned in 3D space
) {
// Smoothly animate the visibility of our 2D Compose UI Panel
AnimatedSpatialVisibility(visible = isSelected) {
SpatialPanel {
InfoBubble(content) // Regular 2D Compose UI
}
}
// Render our interactive 3D sphere
SceneCoreEntity(
factory = {
GltfModelEntity.create(session, sphereModel).also { entity ->
// Make the 3D model respond to user taps
entity.addComponent(InteractableComponent.create(session) { inputEvent ->
if (inputEvent.action == InputEvent.Action.UP) {
onClick()
}
})
}
}
)
}
}

By combining AnimatedSpatialVisibility for traditional Compose UI surfaces with SceneCoreEntity 3D elements, we're able to seamlessly blend data into the physical world.

Explore what’s possible with Android XR today

Building the XR Geospatial Tour app showed us that the barrier to entry for world-scale spatial experiences is lower than ever for Android developers. With the Geospatial API now available in preview on Android XR, your apps can seamlessly understand the physical world around them. By combining Compose for XR’s APIs with the high-precision location data of VPS and the generative capabilities of Gemini, we can create experiences that understand both where the user is and what they are looking at.

To help you get hands-on with Android XR, we are thrilled to open applications for the Android XR Developer Catalyst Program, which includes XREAL Project Aura. Starting today, you can apply to get access to an XREAL Project Aura devkit or our display glasses devkit over the coming months!

*Disclaimer: Available on select devices. Internet connection required. Works on compatible apps and surfaces. Results may vary.


Custom event colors in Google Calendar

Google Calendar is expanding its event coloring options, moving beyond the current limitation of 11 predefined colors for events. Going forward, users are offered an expanded color palette so they can personalize events and visually organize their calendar with ease, giving each user access to up to 200 custom colors for individual events via both the native web and mobile apps as well as the Calendar API. This fulfills a long-standing feature request from both business and personal users for more customizable options.

Users will be able to select from 24 default colors. On Calendar on the web (or via API), users can define additional colors by using a full RGB color picker.

UI showing how to select an event color in Calendar

Getting started

  • Admins: There is no admin control for this feature.
  • End users: This feature will be ON by default and can be customized by the user. Visit the Help Center to learn more.

Rollout pace

  • Rapid Release domains: Extended rollout (potentially longer than 15 days for feature visibility) starting on June 17, 2026
  • Scheduled Release domains: Extended rollout (potentially longer than 15 days for feature visibility) starting on June 29, 2026

Availability

  • Available to all Google Workspace customers, Workspace Individual subscribers, and users with personal Google accounts

Resources