Chapter 6: React Integration Patterns: Chat UI and Inspector

March 21, 2026 · View on GitHub

Welcome to Chapter 6: React Integration Patterns: Chat UI and Inspector. In this part of use-mcp Tutorial: React Hook Patterns for MCP Client Integration, you will build an intuitive mental model first, then move into concrete implementation details and practical production tradeoffs.

This chapter extracts reusable architecture patterns from official example apps.

Learning Goals

  • compare chat-oriented vs inspector-oriented integration approaches
  • reuse server management, tool inspection, and prompt/resource panels
  • structure app state to isolate MCP concerns from core product logic
  • accelerate UI prototyping with known-good component boundaries

Example Pattern Highlights

  • Inspector: capability discovery/debug and operational visibility
  • Chat UI: conversational tooling and server/session UX
  • Server examples: reference backends for integration experiments

Source References

Summary

You now have an example-driven component architecture model for MCP-enabled React apps.

Next: Chapter 7: Testing, Debugging, and Integration Servers

Source Code Walkthrough

examples/chat-ui/scripts/update-models.ts

The filterAndTransformModels function in examples/chat-ui/scripts/update-models.ts handles a key part of this chapter's functionality:

}

function filterAndTransformModels(data: ModelsDevData) {
  const filtered: Record<SupportedProvider, Record<string, ModelData>> = {
    anthropic: {},
    groq: {},
    openrouter: {},
  }

  // Filter by supported providers
  for (const provider of SUPPORTED_PROVIDERS) {
    if (data[provider] && data[provider].models) {
      filtered[provider] = data[provider].models
    }
  }

  return filtered
}

async function main() {
  try {
    const data = await fetchModelsData()
    const filteredData = filterAndTransformModels(data)

    const outputPath = join(process.cwd(), 'src', 'data', 'models.json')
    writeFileSync(outputPath, JSON.stringify(filteredData, null, 2))

    console.log(`✅ Models data updated successfully at ${outputPath}`)

    // Print summary
    let totalModels = 0
    let toolSupportingModels = 0

This function is important because it defines how use-mcp Tutorial: React Hook Patterns for MCP Client Integration implements the patterns covered in this chapter.

examples/chat-ui/scripts/update-models.ts

The main function in examples/chat-ui/scripts/update-models.ts handles a key part of this chapter's functionality:

}

async function main() {
  try {
    const data = await fetchModelsData()
    const filteredData = filterAndTransformModels(data)

    const outputPath = join(process.cwd(), 'src', 'data', 'models.json')
    writeFileSync(outputPath, JSON.stringify(filteredData, null, 2))

    console.log(`✅ Models data updated successfully at ${outputPath}`)

    // Print summary
    let totalModels = 0
    let toolSupportingModels = 0

    for (const [provider, models] of Object.entries(filteredData)) {
      const modelCount = Object.keys(models).length
      const toolModels = Object.values(models).filter((m) => m.tool_call).length

      console.log(`  ${provider}: ${modelCount} models (${toolModels} support tools)`)
      totalModels += modelCount
      toolSupportingModels += toolModels
    }

    console.log(`\nTotal: ${totalModels} models (${toolSupportingModels} support tools)`)
  } catch (error) {
    console.error('❌ Failed to update models data:', error)
    process.exit(1)
  }
}

This function is important because it defines how use-mcp Tutorial: React Hook Patterns for MCP Client Integration implements the patterns covered in this chapter.

How These Components Connect

flowchart TD
    A[filterAndTransformModels]
    B[main]
    A --> B