Hashdo
Transforming the world's APIs into contextual cards. Let's #Do. (eg: http:// hashdo.com / pack / card / args)
Ask AI about Hashdo
Powered by Claude Β· Grounded in docs
I know everything about Hashdo. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
HashDo β Live Data Cards for AI
HashDo turns live data into rich, interactive cards that work inside AI conversations. Build a card once and it becomes an MCP tool that works in ChatGPT, Claude, VS Code, and any MCP-compatible client.
Live at hashdo.com
Available Cards
| Tag | Card | Description |
|---|---|---|
#do/weather | do-weather | Current weather for any location with auto-detection via IP geolocation |
#do/stock | do-stock | Stock price lookup with daily change and key stats |
#do/crypto | do-crypto | Cryptocurrency price, 24h change, and market cap |
#do/qr | do-qr | Generate a QR code from text or a URL |
#do/city | do-city | City explorer β weather, local time, population, currency, and languages |
#do/poll | do-poll | Interactive poll with live voting, percentages, and results |
#do/movie | do-movie | Movie lookup with poster, ratings, cast, plot, and watchlist |
Quick Start
cd v2
npm install
npm run build
# Start MCP server (stdio) with all demo cards
npx tsx serve-demo.ts
# Start HTTP server with web UI, API, and MCP endpoint
node packages/cli/dist/cli.js start demo-cards
The HTTP server runs on port 3000 and exposes:
- Web UI β card browser with search, developer docs (
/docs), card editor (/editor) - REST API β
GET /api/cards,POST /api/cards/:name,GET /api/cards/:name/image - MCP endpoint β
POST /mcp(Streamable HTTP) - OpenAPI spec β
GET /api/openapi.json
MCP Client Setup
Claude Desktop β add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"hashdo": {
"command": "npx",
"args": ["tsx", "/absolute/path/to/hashdo/v2/serve-demo.ts"]
}
}
}
Claude Code β add to .mcp.json:
{
"mcpServers": {
"hashdo": {
"command": "npx",
"args": ["tsx", "/absolute/path/to/hashdo/v2/serve-demo.ts"]
}
}
}
Architecture
v2/
βββ packages/
β βββ core/ # Card types, defineCard(), renderCard()
β βββ mcp-adapter/ # MCP server with Apps widget support
β βββ screenshot/ # HTML β PNG via Puppeteer
β βββ cli/ # HTTP server, card discovery, dev tools
βββ demo-cards/
β βββ weather/ # do-weather
β βββ stock-quote/ # do-stock
β βββ crypto-quote/ # do-crypto
β βββ qr-code/ # do-qr
β βββ city-explorer/ # do-city
β βββ poll/ # do-poll
βββ serve-demo.ts # Standalone MCP stdio server
βββ Dockerfile # Production image (Node 20 + Chromium)
Packages
@hashdo/core β Card definition types, defineCard() for type-safe authoring, renderCard() for HTML generation, Handlebars template support.
@hashdo/mcp-adapter β Exposes cards as MCP tools with automatic Zod schema generation. Implements MCP Apps protocol with a shared widget for interactive card rendering in supported clients.
@hashdo/screenshot β Renders card HTML to PNG images using Puppeteer. Used for image responses in clients that don't support HTML.
@hashdo/cli β HTTP server with card discovery, hot reload, REST API, MCP endpoint, usage tracking, developer docs, and an online card editor.
Defining a Card
import { defineCard } from '@hashdo/core';
export default defineCard({
name: 'do-example',
description: 'Used by LLMs to decide when to invoke this tool',
inputs: {
query: { type: 'string', required: true, description: 'Search query' },
},
async getData({ inputs }) {
const data = await fetchSomething(inputs.query);
return {
viewModel: { data },
textOutput: `Result: ${data.summary}`,
};
},
template: (vm) => `<div>${vm.data}</div>`,
});
Each card automatically becomes an MCP tool β inputs map to tool parameters, getData() runs server-side, and the template renders HTML returned to the client.
Deployment
The included Dockerfile builds a production image with Node 20 and Chromium (for screenshot rendering):
docker build -t hashdo v2/
docker run -p 3000:3000 hashdo
Deploys to Railway, Fly.io, or any container platform.
License
Apache License 2.0 β see LICENSE for details.
