A ChatGPT-like interface for interacting with the Universal Tool Calling Protocol (UTCP) client. This application features a modern, responsive UI with support for multiple LLM providers and various call template types.
- 🤖 Multiple LLM Providers: Support for OpenAI, Anthropic, Google, Cohere, and more
- 🔧 UTCP Integration: Full support for HTTP, MCP, CLI, SSE, and Text call templates
- 💬 Streaming Responses: Real-time streaming of LLM responses
- 🎨 Modern UI: Built with React, TypeScript, and TailwindCSS
- 🌓 Dark Mode: Support for light and dark themes
- 📱 Responsive Design: Works seamlessly on desktop and mobile
- 🔐 Secure Storage: API keys stored locally with encryption warnings
- 🚀 Static Site: Fully client-side, deployable to GitHub Pages
# Install dependencies
npm install
# Start development server
npm run dev# Build the application
npm run build
# Preview the build
npm run preview# Deploy to GitHub Pages
npm run deployOr push to the main branch to trigger automatic deployment via GitHub Actions.
chat-utcp/
├── src/
│ ├── components/ # React components
│ │ ├── sidebar/ # LLM selector and call template list
│ │ ├── chat/ # Chat interface components
│ │ └── ui/ # Reusable UI components
│ ├── agent/ # UTCP Agent implementation
│ ├── stores/ # Zustand state management
│ ├── types/ # TypeScript type definitions
│ ├── lib/ # Utility functions
│ └── utils/ # Helper functions
├── public/ # Static assets
└── Plan.md # Detailed development plan
Configure your LLM provider in the sidebar:
- Select a provider (OpenAI, Anthropic, etc.)
- Enter your API key
- Choose a model
- Adjust parameters (temperature, max tokens, etc.)
Add call templates to register UTCP tools:
- HTTP: REST APIs and webhooks
- MCP: Model Context Protocol servers
- CLI: Command-line tools
- SSE: Server-Sent Events streams
- Text: File-based tool definitions
- Using environment variables
- Implementing a backend proxy
- Using OAuth flows where available
- Regularly rotating API keys
Edit src/types/llm.types.ts to add new providers:
export const LLM_PROVIDERS: Record<LLMProvider, LLMProviderInfo> = {
"my-provider": {
id: "my-provider",
name: "My Provider",
models: ["model-1", "model-2"],
requiresApiKey: true,
supportsStreaming: true,
},
// ...
};Import the appropriate serializer and add to the UI:
import { HttpCallTemplateSerializer } from "@utcp/http";
const serializer = new HttpCallTemplateSerializer();
const template = serializer.validateDict({
name: "my_api",
call_template_type: "http",
// ... configuration
});- React 19 - UI framework
- TypeScript - Type safety
- Vite - Build tool
- TailwindCSS - Styling
- Zustand - State management
- UTCP SDK - Universal Tool Calling Protocol
- Lucide React - Icons
- React Markdown - Markdown rendering
This project is part of the UTCP ecosystem and follows the same licensing as the main UTCP project.
Contributions are welcome! Please see the Plan.md file for development roadmap and guidelines.