mcpField
M
mcp-dino

mcp-dino

Local
github.com/shennawardana23Developer Tools0Updated 10w ago

About mcp-dino

mcp-dino is a Go reference implementation that demonstrates MCP tools, resources, and MCP Apps through dinosaur data and an interactive dashboard. It is for developers learning MCP or building Go servers, and also offers a standalone browser view.

Key features

  1. 01Three dinosaur-focused tools
  2. 02Interactive dashboard as an MCP App
  3. 03stdio and Streamable HTTP transports
  4. 04HTML resources embedded in the binary
  5. 05Runs without API keys

Use cases

  1. 01Study MCP server implementation in Go
  2. 02Test an interactive MCP Apps interface
  3. 03View dinosaur data in a client or browser

MCP support

This MCP server supports stdio and Streamable HTTP, with three tools, HTML resources, and a dashboard implemented using MCP Apps.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

No install method listed yet

We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.

Repository
Packages
mcpbdino-mcp-darwin-arm64.mcpb0.1.0

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project README

dino-mcp

A production-grade MCP server with interactive HTML dashboard UI — written in Go, styled for delight.

Go MCP Go SDK Gin Tests License Binary Size


📋 Table of Contents


🦕 What — and Why

dino-mcp is a reference implementation of the Model Context Protocol (MCP) in Go that demonstrates every layer of the modern MCP stack:

LayerImplementationWhy it matters
Transportstdio + Streamable HTTPWorks in Claude Desktop AND web browsers
MCP Apps@modelcontextprotocol/ext-apps App classInteractive HTML UIs in Claude Desktop iframes
Toolsdino_think, dino_ask, dino_dashboardTyped Go handlers, structured JSON results
Resources//go:embed HTML → text/html;profile=mcp-appSelf-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.


⚡ Quick Start

# Clone & enter
git clone https://github.com/shennawardana23/mcp-dino.git && cd mcp-dino

# Build & run in one shot (≈2 seconds)
make build-fast && make dev-http

# Open the standalone dashboard
open http://localhost:9010/dashboard
Expected output — click to expand
=== dino-mcp server ===
Transport: http
Listening on :9010

[GIN] 2026/06/21 - 12:30:00 | 200 | 4.2ms | ::1 | GET "/dashboard"
[GIN] 2026/06/21 - 12:30:01 | 200 | 2.1ms | ::1 | GET "/api/dinosaurs"

🏗 Architecture at a Glance

flowchart TB
  subgraph CLI["CLI Layer"]
    STDIO["stdio subcommand"]
    HTTP["http subcommand"]
  end

  subgraph SERVER["Server (internal/server/)"]
    GIN["Gin Router :9010"]
    MCPH["MCP StreamableHTTPHandler"]
    CORS["CORS Middleware"]
    TOOLS["Tools: think · ask · dashboard"]
    RES["Resources: //go:embed HTML"]
  end

  subgraph UI["View (ui/src/)"]
    APP["ext-apps App class"]
    POST["postMessage protocol"]
  end

  subgraph FALLBACK["Standalone Fallback"]
    DASH["/dashboard (HTML)"]
    API["/api/dinosaurs (JSON)"]
  end

  CLI --> GIN
  GIN --> CORS
  CORS --> MCPH
  MCPH --> TOOLS
  TOOLS --> RES
  RES --> APP
  APP --> POST
  MCPH -.->|"MCP Apps"| APP
  GIN -.->|"direct route"| DASH
  GIN -.->|"direct route"| API

  style CLI fill:#1a1a2e,color:#e0e0e0,stroke:#2d2a44
  style SERVER fill:#1a1a2e,color:#e0e0e0,stroke:#2d2a44
  style UI fill:#1a1a2e,color:#e0e0e0,stroke:#2d2a44
  style FALLBACK fill:#1a1a2e,color:#e0e0e0,stroke:#2d2a44
  style STDIO fill:#2d2a44,color:#a78bfa
  style HTTP fill:#2d2a44,color:#a78bfa
  style GIN fill:#0099e5,color:#fff
  style MCPH fill:#a78bfa,color:#fff
  style TOOLS fill:#22c55e,color:#fff
  style RES fill:#22c55e,color:#fff
  style APP fill:#facc15,color:#000
  style POST fill:#facc15,color:#000
  style DASH fill:#f87171,color:#fff
  style API fill:#f87171,color:#fff

Data flows through three pipes:

PipeProtocolClientUse case
MCP ToolsJSON-RPC over stdioClaude DesktopText tools (dino_think, dino_ask)
MCP AppsJSON-RPC over stdio + postMessageClaude Desktop iframeInteractive UI (dino_dashboard)
StandaloneHTTP GETBrowserDirect access (/dashboard, /api/dinosaurs)

✨ Features

MCP Standards Compliance
FeatureStatusNotes
Tools (tools/list, tools/call)✅ Complete3 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❌ RemovedDeprecated in MCP spec v2025-11-25
Developer Experience
  • 3-second build cycle — make build-fast && make dev-http
  • 7 integration tests — make test exercises every protocol method
  • Interactive debugging — make test-inspector launches MCP Inspector
  • Remote testing — make run-tunnel creates a public trycloudflare.com URL
  • No API keys — all dinosaur data is built into the binary
  • Zero runtime deps — single static binary with embedded HTML
Interactive Dashboard

The dino_dashboard tool renders an HTML card grid inside Claude Desktop's iframe:

  • Filter by diet — Carnivore, Herbivore, or show All
  • Filter by period — Triassic, Jurassic, Cretaceous
  • 12 dinosaur species — from T-Rex to Velociraptor
  • Fallback mode — open directly at http://localhost:9010/dashboard

Note: 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.


🎮 Try It

In Claude Desktop
Show me the dinosaur dashboard with carnivores

→ Claude detects the MCP App → renders an iframe → you see filterable dinosaur cards

In your browser
open http://localhost:9010/dashboard

→ Standalone HTML with all dinosaur data fetched from the built-in REST API

With MCP Inspector
make test-inspector

→ Opens http://localhost:5173 → connects to http://localhost:9010/mcp

Via curl
# Initialize
curl -s -X POST http://localhost:9010/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}' \
  | python3 -m json.tool

# List tools
SID="<session-id-from-above>"
curl -s -X POST http://localhost:9010/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Mcp-Session-Id: $SID" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
  | python3 -m json.tool

# Call dino_think
curl -s -X POST http://localhost:9010/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Mcp-Session-Id: $SID" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"dino_think","arguments":{}}}' \
  | python3 -m json.tool

🔧 Tool Reference

ToolTypeInputOutputExample Prompt
dino_thinkText{}Random fact + species JSON"Tell me a dinosaur fact"
dino_askText{"question": "..."}Answer + question JSON"What did T-Rex eat?"
dino_dashboardMCP App{"filter": "Carnivore"}HTML iframe + JSON data"Show me carnivore dinosaurs"

dino_ask currently 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:

{
  "content": [
    { "type": "text", "text": "🦕 Did you know? The Velociraptor was only about the size of a turkey!" }
  ],
  "structuredContent": {
    "fact": "The Velociraptor was only about the size of a turkey",
    "species": "Velociraptor"
  }
}

Example dino_dashboard response:

{
  "content": [
    { "type": "text", "text": "Displaying dinosaur dashboard with 4 dinosaurs (filter: Carnivore)" }
  ],
  "structuredContent": {
    "filter": "Carnivore",
    "dinosaurs": [
      {
        "name": "Tyrannosaurus Rex",
        "period": "Cretaceous",
        "diet": "Carnivore",
        "length": "40 ft (12 m)",
        "weight": "9 tons (8,000 kg)",
        "funFact": "T-Rex had the strongest bite of any land animal ever",
        "imageStyle": "bg-red-900"
      }
    ],
    "timestamp": "2026-06-21T12:00:00Z"
  }
}

💬 Claude Desktop Integration

CLI Mode (stdin/stdout)

Locate the binary and add to your claude_desktop_config.json:

{
  "mcpServers": {
    "dino-mcp": {
      "command": "/absolute/path/to/mcp-dino/bin/dino-mcp",
      "args": ["stdio"]
    }
  }
}

After saving, restart Claude Desktop. You'll see hammer icons (🔨) on tools when chatting — click to invoke directly, or let Claude decide.

HTTP Mode (for debugging)
make dev-http
# Server starts on :9010

🛠 Development

Prerequisites
ToolVersionPurpose
Go≥ 1.25Server binary
Node.js≥ 18UI build (Vite)
cloudflaredanyTunnel for remote testing
Commands
# Build — three options
make build            # Full: Vite UI + Go binary
make build-fast       # Quick: Go binary only (reuses existing UI)
make build-ui         # Vite UI only

# Run
make dev-http         # HTTP mode with verbose logging
make run-stdio        # stdio mode for Claude Desktop
make run-tunnel       # HTTP + Cloudflare Tunnel

# Test & verify
make test             # 7 integration tests — all must pass
make test-inspector   # Launch MCP Inspector in browser
make lint             # go vet + go fmt

# Utility
make help             # All targets with descriptions
make clean            # Remove all build artifacts
Project Structure
mcp-dino/
├── bin/                          # Go build output (~11MB static binary)
├── cmd/dino-mcp/main.go          # CLI entry point (stdio | http | help)
├── internal/
│   ├── server/
│   │   └── server.go             # Composition root: mcp.Server + Gin + CORS
│   ├── tools/
│   │   ├── tools.go              # Shared types, constants, helpers
│   │   ├── think.go              # RegisterThink (dino_think tool)
│   │   ├── ask.go                # RegisterAsk (dino_ask tool)
│   │   └── dashboard.go          # RegisterDashboardTool + 12 dino species + REST API
│   └── resources/
│       ├── dashboard.go          # RegisterDashboardResource + //go:embed HTML
│       └── dashboard_ui.html     # Vite-built HTML (354KB)
├── ui/
│   └── src/
│       └── mcp-app.ts            # ext-apps App class + postMessage
├── docs/                         # Diátaxis documentation (see below)
├── test_mcp.sh                   # 7 integration tests
├── AGENTS.md                     # AI agent instructions (canonical)
├── ARCHITECTURE.md               # C4 diagrams + sequence flows
├── TECH_DESIGN.md                # Interface contracts + data model
├── Makefile                      # All targets
├── go.mod + go.sum               # Go dependencies
└── README.md                     # ← you are here

🗺 Documentation Map

dino-mcp uses the Diátaxis framework — four documentation modes, each serving a different need.

For this audienceStart hereAudience
👋 New to the projectQuick StartEveryone
🧑‍💻 Adding a toolYour First ToolDevelopers
🦕 Adding a dinosaurAdd a DinosaurContent editors
🧪 Testing with InspectorTest with InspectorQA / Developers
🔍 Reference neededCLI ReferenceOperators
🏗 Understanding designArchitectureArchitects
🤖 Implementing via AIAGENTS.mdAI coding agents
📚 Deep architectureARCHITECTURE.mdSenior engineers
📐 Technical specsTECH_DESIGN.mdImplementation teams
⏳ Development historyMEMORY.mdAll contributors
📋 RoadmapPLAN.mdStakeholders
⚖️ Design trade-offsDESIGN.mdArchitects
🎯 Skills referenceSKILL.mdDevelopers / AI agents
🤝 How to contributeCONTRIBUTOR.mdContributors
📜 Code of conductCODE_CONDUCT.mdCommunity
📄 ADRsdocs/adr/Decision historians
🤖 LLM full contextllms-full.txtAI agents (RAG)

📊 Project Status

MVP ── Production ── Enhanced UI ── Ecosystem ── Advanced
  ●                    ○               ○             ○
PhaseStatusHighlights
MVP✅ Complete3 tools, MCP Apps UI, 7 tests, docs
Production🔄 In progressGo unit tests, CI, rate limiting, Docker
Enhanced UI📅 PlannedReal-time data, comparison, timeline
Ecosystem📅 PlannedHomebrew, GitHub releases, MCP Registry
Advanced💭 FutureStreaming tool inputs, WebSocket sync
Build Metrics
MetricValue
Binary size~11 MB (compressed)
Binary typeMach-O 64-bit arm64
Go version1.25
MCP SDK versionv1.7.0
Dependencies30+ Go modules (all indirect)
UI bundle354 KB embedded HTML (single-file Vite)
Test coverage7/7 integration tests passing (shell-based; no Go unit tests yet)

📖 Further Reading

ResourceLink
MCP Specificationspec.modelcontextprotocol.io
MCP Go SDKgithub.com/modelcontextprotocol/go-sdk
MCP Apps Protocolmodelcontextprotocol.io/docs/apps/overview
ext-apps SDKgithub.com/modelcontextprotocol/ext-apps
Gin Web Frameworkgithub.com/gin-gonic/gin
Go Programming Languagego.dev

Built with ❤️ using Go, Gin, MCP Go SDK, and @modelcontextprotocol/ext-apps

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.