- Add @tpmjs/mcp-client package for connecting to MCP servers - Add @tpmjs/bridge CLI for bridging local MCP servers to TPMJS - Add @tpmjs/test-file-writer test MCP server - Add BridgeConnection and CollectionBridgeTool database models - Add /api/bridge endpoints for bridge communication - Add /api/collections/[id]/bridge-tools API for managing bridge tools - Update MCP handlers to include bridge tools in tools/list - Add bridge status UI at /dashboard/settings/bridge - Add interactive bridge tutorial at /docs/tutorials/bridge
11 KiB
MCP Bridge Implementation Status
Last Updated: 2026-01-12
Overview
The MCP Bridge system allows users to connect local MCP servers (like Chrome DevTools, file systems, or custom tools) to their TPMJS collections. Tools running on the user's machine can be accessed remotely through TPMJS.
Architecture
┌─────────────────────────────────────────────────────────────────┐
│ User's Machine │
│ ┌─────────────┐ ┌─────────────────────────────────────┐ │
│ │ MCP Server │────▶│ @tpmjs/bridge CLI │ │
│ │ (stdio) │ │ - Connects to local MCP servers │ │
│ └─────────────┘ │ - Polls TPMJS for tool calls │ │
│ ┌─────────────┐ │ - Executes tools locally │ │
│ │ MCP Server │────▶│ - Returns results to TPMJS │ │
│ │ (stdio) │ └──────────────┬──────────────────────┘ │
│ └─────────────┘ │ │
└─────────────────────────────────────┼────────────────────────────┘
│ HTTP Polling
▼
┌─────────────────────────────────────────────────────────────────┐
│ TPMJS Cloud │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
│ │ /api/bridge │ │ MCP Handlers │ │ Database │ │
│ │ - Registration │◀──▶│ - tools/list │◀──▶│ - Bridge │ │
│ │ - Tool calls │ │ - tools/call │ │ Connection│ │
│ │ - Results │ │ │ │ - Bridge │ │
│ └─────────────────┘ └─────────────────┘ │ Tools │ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Packages Created
1. @tpmjs/mcp-client (packages/mcp-client)
MCP client library for connecting to MCP servers.
Features:
- Connect to MCP servers via stdio transport
- Discover tools from servers
- Execute tool calls
- Manage multiple server connections
Usage:
import { MCPClientManager } from '@tpmjs/mcp-client';
const manager = new MCPClientManager();
const tools = await manager.connect({
id: 'my-server',
name: 'My MCP Server',
transport: 'stdio',
command: 'node',
args: ['./server.js']
});
const result = await manager.callTool('my-server', 'toolName', { arg: 'value' });
await manager.disconnectAll();
2. @tpmjs/bridge (packages/bridge)
CLI for users to run on their local machine.
Commands:
tpmjs-bridge init # Create config file
tpmjs-bridge login # Authenticate with TPMJS
tpmjs-bridge logout # Remove credentials
tpmjs-bridge add <name> # Add an MCP server
tpmjs-bridge remove <name> # Remove an MCP server
tpmjs-bridge list # List configured servers
tpmjs-bridge config # Show config path
tpmjs-bridge start # Start the bridge
tpmjs-bridge status # Show bridge status
Config file: ~/.tpmjs/bridge.json
{
"servers": [
{
"id": "chrome-devtools",
"name": "Chrome DevTools",
"transport": "stdio",
"command": "npx",
"args": ["-y", "@anthropic/claude-in-chrome"]
}
]
}
3. @tpmjs/test-file-writer (packages/tools/test-file-writer)
Test MCP server for development and testing.
Tools:
write_file- Write content to a fileread_file- Read content from a filelist_files- List all filesdelete_file- Delete a fileget_info- Get server info
Files stored in: ~/.tpmjs/test-files/
Database Schema
BridgeConnection
Tracks active bridge connections per user.
model BridgeConnection {
id String @id @default(cuid())
userId String @unique @map("user_id")
user User @relation(...)
status String @default("disconnected") // 'connected' | 'disconnected'
socketId String? // Internal routing identifier
tools Json @default("[]") // Cached tool definitions
lastSeen DateTime?
clientVersion String?
clientOS String?
}
CollectionBridgeTool
Links bridge tools to collections.
model CollectionBridgeTool {
id String @id @default(cuid())
collectionId String
collection Collection @relation(...)
serverId String // e.g., "chrome-devtools"
toolName String // e.g., "screenshot"
displayName String? // Custom display name
note String? // User notes
}
API Endpoints
Bridge Communication API
POST /api/bridge - Bridge registration and tool results
// Register bridge
{ type: 'register', tools: [...], clientVersion: '0.1.0', clientOS: 'darwin' }
// Submit tool result
{ type: 'result', callId: 'xxx', result: {...} }
// Submit tool error
{ type: 'result', callId: 'xxx', error: { message: '...' } }
// Heartbeat
{ type: 'heartbeat' }
GET /api/bridge - Poll for pending tool calls
// Response
{ calls: [{ callId: 'xxx', serverId: 'chrome', toolName: 'screenshot', args: {} }] }
DELETE /api/bridge - Disconnect bridge
User Bridge Status API
GET /api/user/bridge - Get bridge status for current user
{
status: 'connected' | 'disconnected' | 'stale' | 'never_connected',
lastSeen: '2026-01-12T...',
clientVersion: '0.1.0',
clientOS: 'darwin',
toolCount: 5,
servers: [{ id: 'chrome', name: 'Chrome', toolCount: 3, tools: [...] }]
}
Collection Bridge Tools API
GET /api/collections/[id]/bridge-tools - List bridge tools in collection
POST /api/collections/[id]/bridge-tools - Add bridge tool to collection
PATCH /api/collections/[id]/bridge-tools/[id] - Update bridge tool
DELETE /api/collections/[id]/bridge-tools/[id] - Remove bridge tool
MCP Handler Integration
Bridge tools are included in MCP tools/list responses when:
- The collection has bridge tools added
- The collection owner has an active bridge connection
- The bridge status is "connected"
Bridge tool names use the format: bridge--{serverId}--{toolName}
Example: bridge--chrome-devtools--screenshot
UI
Bridge Settings Page
Location: /dashboard/settings/bridge
Features:
- Shows connection status (connected/disconnected/stale/never_connected)
- Lists connected MCP servers and their tools
- Shows last seen time, client version, platform
- Quick start instructions for new users
Navigation
Bridge link added to dashboard sidebar under "Bridge" with link icon.
Testing Results
All components tested successfully:
| Component | Status | Notes |
|---|---|---|
| MCPClientManager | ✅ Pass | Connects, discovers tools, executes calls |
| Test File Writer | ✅ Pass | All 5 tools work correctly |
| Bridge CLI | ✅ Pass | All commands work |
| Bridge Class | ✅ Pass | Connects to servers, registers, polls |
| API Endpoints | ✅ Pass | Auth validation works |
| Type Check | ✅ Pass | No type errors |
| Lint | ✅ Pass | Only pre-existing warnings |
What's Working
- Local MCP Server Connection - Bridge connects to local MCP servers via stdio
- Tool Discovery - Automatically discovers tools from connected servers
- Tool Execution - Can execute tools and return results
- HTTP Polling - Vercel-compatible polling instead of WebSocket
- Bridge CLI - Full CLI with init, login, add, remove, start commands
- API Endpoints - All endpoints implemented with proper auth
- Database Schema - Bridge connections and collection tools stored
- MCP Integration - Bridge tools included in MCP tools/list
- UI - Bridge status page with connection info
What Needs Manual Testing
- End-to-End Flow - Requires logging in via web UI and getting a session token
- Real MCP Servers - Test with Chrome DevTools, filesystem, etc.
- Tool Execution via MCP - Call bridge tools through the MCP protocol
- Collection Integration - Add bridge tools to collections via UI
How to Test Locally
# 1. Build packages
pnpm --filter=@tpmjs/mcp-client build
pnpm --filter=@tpmjs/bridge build
pnpm --filter=@tpmjs/test-file-writer build
# 2. Initialize bridge config
node packages/bridge/dist/cli.js init
# 3. Add test server
node packages/bridge/dist/cli.js add test-file-writer \
--command "node" \
--args "$(pwd)/packages/tools/test-file-writer/dist/server.js"
# 4. Start dev server
pnpm --filter=@tpmjs/web dev
# 5. Log in via browser, get session token
# 6. Start bridge (with real token)
node packages/bridge/dist/cli.js start --token <session-token>
# 7. Visit /dashboard/settings/bridge to see status
Future Improvements
- Proper API key authentication (not session tokens)
- Redis for tool call queuing (production)
- WebSocket support for lower latency
- Bridge tool UI in collection editor
- Tool call logging and debugging
- Rate limiting for bridge connections
- Multiple bridge instances per user
- Bridge health monitoring alerts
Files Changed/Created
New Packages
packages/mcp-client/- MCP client librarypackages/bridge/- Bridge CLIpackages/tools/test-file-writer/- Test MCP server
Database
packages/db/prisma/schema.prisma- Added BridgeConnection, CollectionBridgeTool
API Routes
apps/web/src/app/api/bridge/route.ts- Bridge APIapps/web/src/app/api/user/bridge/route.ts- User bridge statusapps/web/src/app/api/collections/[id]/bridge-tools/route.ts- Collection bridge toolsapps/web/src/app/api/collections/[id]/bridge-tools/[bridgeToolId]/route.ts- Single bridge tool
MCP Integration
apps/web/src/lib/mcp/handlers.ts- Updated to include bridge toolsapps/web/src/lib/mcp/tool-converter.ts- Added bridge tool conversionapps/web/src/lib/mcp/index.ts- Updated exports
UI
apps/web/src/app/dashboard/settings/bridge/page.tsx- Bridge status pageapps/web/src/components/dashboard/DashboardLayout.tsx- Added Bridge nav link
Types
packages/types/src/collection.ts- Added bridge tool schemas