FeaturesTemplatesShowcaseTownie
AI
BlogDocsPricing
Log inSign up
c15r
c15rChat
Public
Like
Chat
Home
Code
18
backend
1
frontend
6
shared
2
test
4
AFFORDANCE-COMPONENT-GUIDE.md
AFFORDANCE-FRAMEWORK.md
AFFORDANCE-IMPLEMENTATION-SUMMARY.md
COMMAND-PALETTE-REVIEW.md
DEPENDENCY-INJECTION-REVIEW.md
IMPLEMENTATION-SUMMARY-AFFORDANCES.md
IMPLEMENTATION-SUMMARY.md
NextSteps-Examples.md
NextSteps-README.md
README.md
ResourceViewer-README.md
TESTING.md
package.json
H
test-runner.ts
Branches
1
Pull requests
Remixes
1
History
Environment variables
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data โ€“ all from the browser, and deployed in milliseconds.
Sign up now
Code
/
README.md
Code
/
README.md
Search
6/29/2025
Viewing readonly version of main branch: v1234
View latest version
README.md

Anthropic Streaming Chat with MCP

A mobile-optimized single page chat application that uses the Anthropic Messages API with real-time streaming and MCP (Model Context Protocol) server support, featuring centralized client management and performance optimizations.

Source: https://www.val.town/x/c15r/Chat

Live server: https://chat.parc.land

Bundles Contextual MCP server by default: https://contextual.parc.land/mcp

๐Ÿš€ Key Features

  • ๐Ÿš€ Real-time streaming responses - See Claude's responses appear word-by-word as they're generated
  • โน๏ธ Stream control - Stop streaming at any time with the stop button
  • ๐Ÿ”ง Client-side Tools - Interactive tools that run in the browser (ask_user, calculator, js_exec)
  • ๐ŸŽจ UI Affordance Framework - Dynamic UI component registration system for rich interactions
  • ๐Ÿ’ฌ Inline User Input - Sophisticated ask_user tool with text, multiline, choice, and confirm inputs
  • ๐Ÿงฎ Built-in Calculator - Mathematical expression evaluation tool
  • ๐ŸŽจ UI Affordance System - Register custom UI components in overlays, sidebars, headers, footers, and inline
  • ๐Ÿ”„ NextSteps Auto-Execution - MCP tools can propose follow-up actions with automatic or manual execution
  • ๐Ÿ“„ Resource Viewer - MCP tools can display file content with syntax highlighting and fullscreen support
  • ๐Ÿ”ง Centralized Client Pool - Unified MCP client management for optimal performance and reliability
  • ๐Ÿ“Š Performance Optimizations - Memoized rendering, stable references, and efficient connection reuse
  • ๐Ÿ” Automatic MCP Server Status Checking - Real-time server health monitoring with detailed diagnostics
  • ๐ŸŽฏ Command Palette - Quick access to MCP tools, prompts, and client-side tools via / commands
  • ๐Ÿ’พ Persistent Storage - Chat history and settings saved locally with automatic restoration
  • ๐ŸŽจ Exquisite Design System - Sophisticated visual design with glassmorphism, smooth animations, and depth
  • ๐Ÿ“ฑ Mobile-First Experience - Optimized for mobile viewports with touch-friendly interactions
  • โœจ Smooth Animations - Delightful micro-interactions and transitions throughout the interface
  • ๐ŸŒˆ Advanced Theming - Comprehensive design tokens with CSS custom properties
  • โ™ฟ Accessibility First - Full keyboard navigation, screen reader support, and reduced motion preferences

๐Ÿ—๏ธ Architecture Improvements

Centralized Client Management

The application now uses a unified MCPClientPool that eliminates duplicate connections and provides consistent access to MCP operations:

// Single source of truth for all MCP operations const clientPool = new MCPClientPool(connectedClients, serverConfigs); // Unified API across all components await clientPool.testServer(serverName); await clientPool.fetchTools(); await clientPool.callTool(serverName, toolName, args);

Performance Optimizations

  • โœ… No Duplicate Client Connections: Single client instance per server
  • โœ… Memoized Client Resolution: Cached lookups prevent unnecessary re-renders
  • โœ… Stable Reference Management: Arrays memoized to prevent reload loops
  • โœ… Optimized useEffect Dependencies: Minimal effect re-executions
  • โœ… Connection Reuse: Existing connections used for all operations

Before vs After Consolidation

Before

  • โŒ Multiple client instances per server (4 separate creation points)
  • โŒ Duplicate connection logic across components
  • โŒ ResourceViewer reload loops due to unstable references
  • โŒ Inconsistent error handling

After

  • โœ… Single client instance per server via centralized pool
  • โœ… Unified connection logic in MCPClientPool
  • โœ… Stable component rendering with memoized references
  • โœ… Consistent error handling across all components

Streaming Implementation

This app implements Anthropic's official streaming guide using:

  • Server-Sent Events (SSE) for real-time communication
  • Proper event parsing (message_start, content_block_delta, message_stop, etc.)
  • Content block reassembly for text, tool use, and thinking responses
  • Error handling and keep-alive support
  • Token usage tracking
  • Support for all delta types (text, JSON, thinking)

Project Structure

โ”œโ”€โ”€ backend/
โ”‚   โ””โ”€โ”€ index.ts            # Hono server with static file serving
โ”œโ”€โ”€ frontend/
โ”‚   โ”œโ”€โ”€ index.html          # Main HTML template
โ”‚   โ”œโ”€โ”€ index.tsx           # React app entry point
โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”œโ”€โ”€ App.tsx         # Main app component
โ”‚   โ”‚   โ”œโ”€โ”€ StreamingChat.tsx # Real-time streaming chat interface
โ”‚   โ”‚   โ”œโ”€โ”€ Settings.tsx    # Settings flyout
โ”‚   โ”‚   โ”œโ”€โ”€ MCPStatus.tsx   # MCP server status dashboard with progressive disclosure
โ”‚   โ”‚   โ”œโ”€โ”€ CommandPalette.tsx # MCP prompt command palette
โ”‚   โ”‚   โ”œโ”€โ”€ HTMLRenderer.tsx # HTML output renderer with MCP context
โ”‚   โ”‚   โ”œโ”€โ”€ NextSteps.tsx   # NextSteps auto-execution component
โ”‚   โ”‚   โ”œโ”€โ”€ ResourceViewer.tsx # File/resource viewer with syntax highlighting
โ”‚   โ”‚   โ”œโ”€โ”€ Message.tsx     # Individual message component
โ”‚   โ”‚   โ””โ”€โ”€ affordances/    # UI affordance components
โ”‚   โ”‚       โ”œโ”€โ”€ CounterAffordance.tsx      # Example counter component
โ”‚   โ”‚       โ”œโ”€โ”€ StatusDashboard.tsx        # System status dashboard
โ”‚   โ”‚       โ”œโ”€โ”€ NotificationCenter.tsx     # Notification management
โ”‚   โ”‚       โ””โ”€โ”€ TestAffordance.tsx         # Simple test component
โ”‚   โ”œโ”€โ”€ hooks/
โ”‚   โ”‚   โ””โ”€โ”€ useAnthropicStream.tsx # Streaming chat hook
โ”‚   โ”œโ”€โ”€ utils/
โ”‚   โ”‚   โ”œโ”€โ”€ clientTools.ts      # Client-side tools utility with dynamic tool management
โ”‚   โ”‚   โ”œโ”€โ”€ affordanceManager.ts # UI affordance registration framework
โ”‚   โ”‚   โ”œโ”€โ”€ containers/         # Affordance container managers
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ overlayContainer.ts    # Modal/popup containers
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ sidebarContainer.ts    # Collapsible side panels
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ headerContainer.ts     # Fixed header extensions
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ footerContainer.ts     # Footer extensions
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ inlineContainer.ts     # Chat-embedded components
โ”‚   โ”‚   โ”œโ”€โ”€ mcpTesting.ts       # Frontend MCP server testing
โ”‚   โ”‚   โ”œโ”€โ”€ mcpPrompts.ts       # Frontend MCP prompt fetching
โ”‚   โ”‚   โ”œโ”€โ”€ mcpTools.ts         # MCP tools fetching with caching
โ”‚   โ”‚   โ”œโ”€โ”€ mcpClientPool.ts    # Centralized MCP client pool
โ”‚   โ”‚   โ””โ”€โ”€ MCPClient.ts        # Individual MCP client wrapper
โ”‚   โ””โ”€โ”€ style.css           # Custom styles with streaming animations
โ”œโ”€โ”€ shared/
โ”‚   โ”œโ”€โ”€ types.ts            # Shared TypeScript types for streaming
โ”‚   โ””โ”€โ”€ affordance-types.ts # UI affordance framework types
โ”œโ”€โ”€ test/                   # Test suite
โ”‚   โ”œโ”€โ”€ components/         # Component tests
โ”‚   โ”‚   โ””โ”€โ”€ Message.test.tsx # Message component tests
โ”‚   โ”œโ”€โ”€ utils/              # Test utilities and helpers
โ”‚   โ”‚   โ””โ”€โ”€ test-helpers.ts # Common test utilities
โ”‚   โ”œโ”€โ”€ setup.ts           # Global test setup and configuration
โ”‚   โ””โ”€โ”€ README.md          # Test-specific documentation
โ”œโ”€โ”€ package.json           # NPM configuration with test scripts
โ”œโ”€โ”€ TESTING.md             # Comprehensive testing guide
โ””โ”€โ”€ README.md

UI Affordance Framework

The application includes a powerful UI Affordance Registration Framework that allows the assistant to dynamically create and control custom UI components. This system provides:

Container Types

  • Overlay: Modal/popup containers with backdrop support
  • Sidebar: Collapsible side panels (left/right positioning)
  • Header: Fixed header extensions with priority ordering
  • Footer: Footer extensions alongside existing controls
  • Inline: Components embedded directly in the chat flow

Client Tools

  • attach_affordance: Attach new UI components from file keys with optional persistence
  • call_affordance_method: Invoke methods on attached components
  • detach_affordance: Remove attached components
  • list_affordances: List all active affordances
  • get_affordance_errors: Get runtime errors from affordance components
  • clear_affordance_errors: Clear/acknowledge affordance errors
  • restore_affordances: Manually restore persistent affordances from localStorage
  • clear_persisted_affordances: Clear all saved affordance configurations
  • get_persisted_affordances_info: View information about saved affordances

Example Usage

// Attach a persistent counter in the sidebar const counterId = await attach_affordance('sidebar', '/frontend/components/affordances/CounterAffordance.tsx', { title: 'Counter', position: 'right', width: '250px', persistent: true // Will be restored on next session } ); // Interact with the counter await call_affordance_method(counterId, 'increment', []); const value = await call_affordance_method(counterId, 'getValue', []); // Check for any errors const errors = await get_affordance_errors(counterId); if (errors.length > 0) { console.log('Component has errors:', errors); // Clear the errors after handling await clear_affordance_errors(counterId); } // View persistent affordances info const info = await get_persisted_affordances_info(); console.log(`${info.count} affordances will be restored on next session`);

For detailed documentation, see AFFORDANCE-FRAMEWORK.md. For component development guide, see AFFORDANCE-COMPONENT-GUIDE.md.

Affordance Persistence

The affordance framework supports automatic persistence across sessions:

  • Persistent Affordances: Set persistent: true in the affordance config to automatically save and restore across browser sessions
  • Automatic Restoration: Persistent affordances are automatically restored when the app starts and MCP clients are ready
  • State Management: Components can implement optional getState() and setState() methods to preserve internal state
  • Replacement Logic: Attaching an affordance with the same fileKey and type automatically replaces the existing one (prevents duplicates)
  • Error Recovery: Failed restorations are logged but don't break the app startup

Storage Location: Persistent affordances are saved in localStorage under the key affordance_registrations.

Configuration

The app stores configuration and chat history in localStorage:

  • anthropic_api_key: Your Anthropic API key
  • selected_model: The chosen Claude model (defaults to claude-3-5-sonnet-20241022)
  • mcp_servers: Array of configured MCP servers
  • chat_messages: Complete chat history (persists between page loads)
  • auto_execute_next_steps: Global setting for NextSteps auto-execution (defaults to true)

Development

Testing

The project includes a comprehensive test suite using Deno Test and React Testing Library:

# Run all tests npm test # Run tests in watch mode npm run test:watch # Run tests with coverage npm run test:coverage # Generate HTML coverage report npm run test:coverage-report

For detailed testing information, see TESTING.md.

API Endpoints

  • GET / - Main application (serves frontend)
  • GET /frontend/* - Frontend static files
  • GET /shared/* - Shared utility files

Note: MCP server testing and prompt fetching are now handled directly on the frontend for improved performance and reduced server load.

Usage

  1. Open the app at the provided URL
  2. Click "Settings" in the footer to configure your Anthropic API key and select your preferred Claude model
  3. Add/remove/toggle MCP servers as needed
  4. Use the "Test" button next to each MCP server to verify connectivity (shows โœ… for success, โŒ for errors)
  5. Configure NextSteps auto-execution in settings (enabled by default)
  6. Start chatting with Claude and watch responses stream in real-time!
  7. Use the stop button (โน๏ธ) to interrupt streaming at any time
  8. Switch models anytime in settings without losing your chat history
  9. Your chat history and settings will be automatically saved and restored when you return
  10. When MCP tools return NextSteps proposals, they'll appear as interactive pills that can auto-execute or require manual selection

Default MCP Server

The app comes pre-configured with the Val Town MCP server:

  • Name: Val Town MCP
  • URL: https://c15r--81c497c63c0a11f081e29e149126039e.web.val.run/mcp
  • Status: Enabled by default (you'll need to add your authorization token)

Features in Detail

  • ๐ŸŽจ Exquisite Design System: Sophisticated visual design featuring:
    • Glassmorphism Effects: Translucent surfaces with backdrop blur for depth
    • Smooth Animations: Delightful micro-interactions and state transitions
    • Advanced Typography: Carefully crafted font hierarchy and spacing
    • Color Psychology: Harmonious color palette designed for extended use
    • Depth & Shadows: Multi-layered shadow system for visual hierarchy
    • Responsive Design: Fluid layouts that adapt beautifully to any screen size
  • ๐Ÿ“ฑ Mobile-First Experience: Optimized for mobile devices with:
    • Touch-Friendly Controls: Generous tap targets and gesture support
    • Adaptive Layouts: Content reflows intelligently on smaller screens
    • Performance Optimized: Smooth 60fps animations on mobile devices
    • iOS/Android Polish: Native-feeling interactions and visual cues
  • Real-time Streaming: Watch Claude's responses appear word-by-word as they're generated
  • Stream Control: Stop streaming responses at any time with the stop button
  • Client-side Tools: Interactive tools that run directly in the browser:
    • ask_user: Sophisticated user input with text, multiline, multiple choice, and confirmation dialogs
    • calculate: Mathematical expression evaluator for quick calculations
  • NextSteps Auto-Execution: MCP tools can propose follow-up actions that execute automatically after a countdown or require manual selection. See NextSteps-README.md for implementation details.
  • Resource Viewer: MCP tools can display file and resource content with syntax highlighting, fullscreen support, and intelligent rendering based on file type
  • MCP Integration: Support for multiple Model Context Protocol servers
  • Enhanced MCP Display: Collapsible sections for tool calls and results with proper JSON formatting
  • Unobtrusive Footer Controls: Settings (โš™๏ธ) and clear chat (๐Ÿ—‘๏ธ) buttons positioned in the footer alongside the input
  • Persistent Chat History: All messages automatically saved to localStorage and restored on page load
  • Persistent Settings: All configuration stored in browser localStorage
  • Auto-scroll: Messages automatically scroll to bottom during streaming
  • Auto-resize: Input field grows with content
  • Error Handling: Clear error messages for API issues with stream recovery
  • Loading States: Visual feedback during API calls and streaming
  • Structured Responses: MCP tool use and results are displayed in organized, collapsible sections
  • Clean Interface: Maximized chat area with no header, footer contains all controls
  • Streaming Animations: Visual cursor and highlighting for active streaming responses
  • โ™ฟ Accessibility Features:
    • Keyboard Navigation: Full keyboard support for all interactions
    • Screen Reader Support: Semantic HTML and ARIA labels
    • Reduced Motion: Respects user's motion preferences
    • High Contrast: Supports high contrast mode
    • Focus Management: Clear focus indicators and logical tab order
Go to top
X (Twitter)
Discord community
GitHub discussions
YouTube channel
Bluesky
Product
FeaturesPricing
Developers
DocsStatusAPI ExamplesNPM Package Examples
Explore
ShowcaseTemplatesNewest ValsTrending ValsNewsletter
Company
AboutBlogCareersBrandhi@val.town
Terms of usePrivacy policyAbuse contact
ยฉ 2025 Val Town, Inc.