- Move endpoint from /api/collections/[id]/mcp to /api/collections/[id]/mcp/[transport]
- Support both 'http' and 'sse' transports
- HTTP: standard JSON-RPC over HTTP
- SSE: Server-Sent Events for streaming responses
- Add test script for validating MCP endpoints
Add Model Context Protocol (MCP) server endpoint for collections,
allowing users to connect Claude Desktop, Cursor, and other MCP
clients to use tools from their collections.
- POST /api/collections/[id]/mcp - JSON-RPC endpoint for MCP
- GET /api/collections/[id]/mcp - Server info for discovery
- Tool name conversion (e.g., @tpmjs/hello → tpmjs-hello--helloWorldTool)
- Handlers for initialize, tools/list, tools/call methods
- Executes tools via existing sandbox executor
Only public collections are accessible (no auth required).
- Add AppHeader component to dashboard main page
- Add AppHeader to collections list page (loading, error, and main states)
- Add AppHeader to collection detail page (loading, error, and main states)
Ensures top navigation menu is visible on all dashboard pages for
both authenticated and unauthenticated users.
- Add Collection and CollectionTool models to Prisma schema
- Create Zod validation schemas for collections
- Implement full CRUD API routes for collections
- Add tool management endpoints (add/remove tools)
- Create UI components: CollectionCard, CollectionForm, CollectionList,
AddToolSearch, CollectionToolList
- Add /dashboard/collections pages for list and detail views
- Add new icons to @tpmjs/ui: folder, plus, trash, edit, box, search,
loader, arrowLeft, alertCircle, globe
- Add xs size variant to Icon component
- Add Collections link to dashboard page
Features:
- Full CRUD for named collections
- Public/private visibility toggle
- Tool search to add tools to collections
- Ownership-based access control
- Collection limit: 50 per user
- Tool limit: 100 per collection
- Add ToolSearchResult interface with biome-ignore for dynamic tool types
- Add biome-ignore comments for UIMessage.parts type casting
- Add biome config overrides for complexity warnings in MessageBubble.tsx
- Add biome config override for MobileMenu.tsx a11y rule
- Add biome config override for railway-executor complexity
- Fix unused template literal in railway-executor
- All lint tasks now pass with 0 errors
🤖 Generated with [Claude Code](https://claude.ai/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Create AuthHeader component with logo and contextual auth link
- Show "Sign Up" on sign-in page and vice versa
- Keep centered form layout with header at top
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
better-auth uses __Secure- prefix for session cookies on HTTPS,
but middleware was only checking for the unprefixed cookie name
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add onSuccess/onError callbacks to signIn.email() for better response handling
- Add trustedOrigins configuration for production domain
- Configure explicit cookie attributes (sameSite, secure, httpOnly)
- Enable session cookie caching for better performance
- Handle edge case where signIn returns neither data nor error
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
VERCEL_URL returns deployment URL (tpmjs-xxx.vercel.app) not custom domain.
This was causing session cookies to be set for wrong domain.
Now prioritizes BETTER_AUTH_URL, then checks VERCEL_ENV=production to use tpmjs.com.
- Add Sign In button to desktop header (shows Dashboard when logged in)
- Add Sign In/Sign Up links to mobile menu
- Fix auth config to use BETTER_AUTH_SECRET and BETTER_AUTH_URL env vars
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add virtualized list using react-virtuoso for smooth scrolling
- Filter by category, verb, quality score, and search
- Expandable cards with parameters, returns, AI guidance
- Add redirect from /tools-ideas to /tool-ideas
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Split camelCase/PascalCase into words (sitemapReadTool → sitemap read tool)
- Add +100 score boost for exact tool name matches
- Fixes issue where searching exact tool name returned 0 results
- List HLLM as primary integration with tpmjs.com
- Add BlocksAI case study showing how 106 tools were built
- Display 9 philosophy principles and 11 tool categories
- Simplify ecosystem diagram to show flow: BlocksAI → Tools → HLLM
- Fix lint issues with variable declarations
- Frames HLLM, TPMJS, BlocksAI as three layers of an AI infrastructure stack
- HLLM = Orchestration layer (Kubernetes of AI)
- TPMJS = Distribution layer (npm of AI)
- BlocksAI = Semantic layer (TypeScript of AI)
- Articulates the paradigm shift from monolithic agents to composable systems
- Adds web stack analogy to explain separation of concerns
- Focuses on the 5 novel ideas that make this different
- Removes implementation details in favor of big picture vision
- Convert to client component with useState for view toggling
- Add "Specification" view with clean schema reference and sidebar
- Add "Full Example" view with complete package.json and tool code examples
- Remove explanatory content (moved elsewhere)
- Create layout.tsx for metadata since page is client component
- Reduce page complexity from 839 to 406 lines
- Reduce cron frequency: changes 2min→4hr, keyword 15min→6hr, metrics hourly→daily
- Add Prisma directUrl for connection pooling support
- Add Vercel KV caching to /api/tools endpoint (graceful degradation if not configured)
- Add X-Cache header to indicate cache hit/miss
- Add NEON_COMPUTE_OPTIMIZATION.md with full strategy guide
These changes should reduce Neon CU usage from 100+ to ~20-30 CU-hrs/month.
- Build Your First Tool: Step-by-step guide from npm init to published
- Real-World Agent: Complete working example with meta-tools
- Interactive Playground: How to test tools in browser
Each tutorial has 5-6 slides with code examples and animations.
Updated main page to show all 6 tutorials in grid.
- Add 6-slide overview tutorial covering TPMJS concepts
- Slides: Welcome, What is TPMJS, Ecosystem, Architecture, Use Cases, Explore
- Add OverviewSlideshow component and page route at /overview
- Update main tutorial page with overview as first card
Import zod@4 directly and use z.toJSONSchema method with fallback
to z.default.toJSONSchema for compatibility.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Static import from 'zod@4/json-schema' was failing and crashing executor.
Use dynamic import inside the schema extraction logic instead.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Import Zod v4's toJSONSchema from zod@4/json-schema
- Add Strategy 3: Detect Zod v4 schemas via ._zod property
- Convert Zod v4 schemas using native toJSONSchema function
- Update error message to mention both Zod v4 and v3 support
Fixes schema extraction for @tpmjs/emoji-magic and other Zod v4 tools
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The @ in scoped package names was being URL-encoded to %40, causing
parseSlug to treat them as unscoped packages. Now we decode the slug
components first.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The relation filter `package: { npmPackageName }` was not working correctly.
Now first find the package, then find the tool by packageId.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add download trend sparkline chart showing 30-day download history
- Add bundle size component with minified/gzipped sizes via bundlephobia proxy
- Add more install commands: yarn, bun, deno (in addition to npm, pnpm)
- Change discovery keyword from "tpmjs-tool" to "tpmjs" across entire codebase
- Update sync endpoints to use new keyword
- Update all documentation and package.json files
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Complete rewrite of all 9 slides to create a coherent story for engineers:
1. Welcome - TPMJS: A Tool Registry for the AI SDK
2. Problem - AI SDK Tools Are Static (compiled in, bundle grows)
3. Solution - Two imports enable dynamic tools at runtime
4. HowItWorks - The two meta-tools (search + execute)
5. Discovery - searchTpmjsToolsTool schema and response
6. Integration - registryExecuteTool execution flow
7. Quality - What gets indexed (schemas, scores, health)
8. ToolDetail - Full agent conversation flow example
9. GetStarted - How to publish tools to the registry
Also adds eslint.config.mjs to ignore .next build directory.
- WelcomeSlide: "The missing layer between npm and AI agents"
- ProblemSlide: "npm has 2 million packages. Which ones work?"
- SolutionSlide: Registry that extracts schemas, scores quality, checks health
- HowItWorksSlide: Automated pipeline flow
- DiscoverySlide: Schema extraction from sandbox
- IntegrationSlide: Quality scoring algorithm
- QualitySlide: Health checks (import + execution)
- ToolDetailSlide: What we store (inputSchema, returnSchema, envKeys, tier)
- GetStartedSlide: CTAs with accurate descriptions
All content now grounded in actual codebase functionality.
Includes TPMJS_TALK.md as source of truth document.