The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the MCP Dino listing page.
A production-grade MCP server with interactive HTML dashboard UI — written in Go, styled for delight.
dino-mcp is a reference implementation of the Model Context Protocol (MCP) in Go that demonstrates every layer of the modern MCP stack:
| Layer | Implementation | Why it matters |
|---|---|---|
| Transport | stdio + Streamable HTTP | Works in Claude Desktop AND web browsers |
| MCP Apps | @modelcontextprotocol/ext-apps App class | Interactive HTML UIs in Claude Desktop iframes |
| Tools | dino_think, dino_ask, dino_dashboard | Typed Go handlers, structured JSON results |
| Resources | //go:embed HTML → text/html;profile=mcp-app | Self-contained ~11MB binary, zero deps at runtime |
Whether you're building an MCP server from scratch, learning the MCP Apps protocol, or need a Go — Gin — ext-apps SDK integration blueprint, this project has you covered.
Data flows through three pipes:
| Pipe | Protocol | Client | Use case |
|---|---|---|---|
| MCP Tools | JSON-RPC over stdio | Claude Desktop | Text tools (dino_think, dino_ask) |
| MCP Apps | JSON-RPC over stdio + postMessage | Claude Desktop iframe | Interactive UI (dino_dashboard) |
| Standalone | HTTP GET | Browser | Direct access (/dashboard, /api/dinosaurs) |
| Feature | Status | Notes |
|---|---|---|
Tools (tools/list, tools/call) | ✅ Complete | 3 typed tools with structured JSON responses |
Resources (resources/list, resources/read) | ✅ Complete | //go:embed HTML served at ui:// URIs |
| MCP Apps protocol | ✅ Complete | _meta.ui.resourceUri + ui/initialize handshake |
| stdio transport | ✅ | Claude Desktop, Cursor, Copilot |
| Streamable HTTP | ✅ | MCP Inspector, curl, browser, tunnel |
| SSE transport | ❌ Removed | Deprecated in MCP spec v2025-11-25 |
make build-fast && make dev-httpmake test exercises every protocol methodmake test-inspector launches MCP Inspectormake run-tunnel creates a public trycloudflare.com URLThe dino_dashboard tool renders an HTML card grid inside Claude Desktop's iframe:
http://localhost:9010/dashboardNote: the filter is applied server-side at the time the tool is called. Once opened with a specific filter, the in-app filter buttons can only narrow further within that same result set — they can't widen back out to species the initial call excluded.
The HTML view is built with the official @modelcontextprotocol/ext-apps SDK and communicates via JSON-RPC over postMessage.
→ Claude detects the MCP App → renders an iframe → you see filterable dinosaur cards
→ Standalone HTML with all dinosaur data fetched from the built-in REST API
→ Opens http://localhost:5173 → connects to http://localhost:9010/mcp
| Tool | Type | Input | Output | Example Prompt |
|---|---|---|---|---|
dino_think | Text | {} | Random fact + species JSON | "Tell me a dinosaur fact" |
dino_ask | Text | {"question": "..."} | Answer + question JSON | "What did T-Rex eat?" |
dino_dashboard | MCP App | {"filter": "Carnivore"} | HTML iframe + JSON data | "Show me carnivore dinosaurs" |
dino_askcurrently returns the same general dinosaur-era overview regardless of the question asked — it doesn't yet branch on the question text. Tracked as a known limitation.
Example dino_think response:
Example dino_dashboard response:
Locate the binary and add to your claude_desktop_config.json:
After saving, restart Claude Desktop. You'll see hammer icons (🔨) on tools when chatting — click to invoke directly, or let Claude decide.
| Tool | Version | Purpose |
|---|---|---|
| Go | ≥ 1.25 | Server binary |
| Node.js | ≥ 18 | UI build (Vite) |
| cloudflared | any | Tunnel for remote testing |
dino-mcp uses the Diátaxis framework — four documentation modes, each serving a different need.
| For this audience | Start here | Audience |
|---|---|---|
| 👋 New to the project | Quick Start | Everyone |
| 🧑💻 Adding a tool | Your First Tool | Developers |
| 🦕 Adding a dinosaur | Add a Dinosaur | Content editors |
| 🧪 Testing with Inspector | Test with Inspector | QA / Developers |
| 🔍 Reference needed | CLI Reference | Operators |
| 🏗 Understanding design | Architecture | Architects |
| 🤖 Implementing via AI | AGENTS.md | AI coding agents |
| 📚 Deep architecture | ARCHITECTURE.md | Senior engineers |
| 📐 Technical specs | TECH_DESIGN.md | Implementation teams |
| ⏳ Development history | MEMORY.md | All contributors |
| 📋 Roadmap | PLAN.md | Stakeholders |
| ⚖️ Design trade-offs | DESIGN.md | Architects |
| 🎯 Skills reference | SKILL.md | Developers / AI agents |
| 🤝 How to contribute | CONTRIBUTOR.md | Contributors |
| 📜 Code of conduct | CODE_CONDUCT.md | Community |
| 📄 ADRs | docs/adr/ | Decision historians |
| 🤖 LLM full context | llms-full.txt | AI agents (RAG) |
| Phase | Status | Highlights |
|---|---|---|
| MVP | ✅ Complete | 3 tools, MCP Apps UI, 7 tests, docs |
| Production | 🔄 In progress | Go unit tests, CI, rate limiting, Docker |
| Enhanced UI | 📅 Planned | Real-time data, comparison, timeline |
| Ecosystem | 📅 Planned | Homebrew, GitHub releases, MCP Registry |
| Advanced | 💭 Future | Streaming tool inputs, WebSocket sync |
| Metric | Value |
|---|---|
| Binary size | ~11 MB (compressed) |
| Binary type | Mach-O 64-bit arm64 |
| Go version | 1.25 |
| MCP SDK version | v1.7.0 |
| Dependencies | 30+ Go modules (all indirect) |
| UI bundle | 354 KB embedded HTML (single-file Vite) |
| Test coverage | 7/7 integration tests passing (shell-based; no Go unit tests yet) |
| Resource | Link |
|---|---|
| MCP Specification | spec.modelcontextprotocol.io |
| MCP Go SDK | github.com/modelcontextprotocol/go-sdk |
| MCP Apps Protocol | modelcontextprotocol.io/docs/apps/overview |
| ext-apps SDK | github.com/modelcontextprotocol/ext-apps |
| Gin Web Framework | github.com/gin-gonic/gin |
| Go Programming Language | go.dev |
Built with ❤️ using Go, Gin, MCP Go SDK, and @modelcontextprotocol/ext-apps