Skip to main content
Glama

MCP Private GitHub Search

MIGRATION_GUIDE.md6.4 kB
# Migration Guide: Docker to HTTP Streaming Interface This guide details how to migrate an MCP server from Docker-based deployment to HTTP streaming interface using Smithery. ## Prerequisites - Existing MCP server with TypeScript/Node.js - Package.json and npm/pnpm setup - Current Docker-based deployment ## Step 1: Update Dependencies Update your `package.json` to include Smithery SDK, latest MCP SDK, and tsx for TypeScript execution: ```json { "dependencies": { "@modelcontextprotocol/sdk": "1.17.4", "@smithery/sdk": "1.5.6", "tsx": "^4.20.5", "zod": "^3.24.2", // ... existing dependencies } } ``` ## Step 2: Create Smithery Configuration Create `smithery.yaml` in your project root: ```yaml # Smithery configuration file: https://smithery.ai/docs/config#smitheryyaml name: "@your-org/your-mcp-server" description: "Your MCP server description" version: "0.4.0" # Update to your new version runtime: "typescript" ``` ## Step 3: Refactor Server Code Structure **CRITICAL**: The HTTP streaming interface requires a different code structure. You need to refactor your main server file (typically `src/index.ts`) to export a factory function instead of directly running the server. ### Before (stdio-only structure): ```typescript // Old structure - direct execution const server = new McpServer({...}); const transport = new StdioServerTransport(); server.connect(transport); ``` ### After (HTTP streaming compatible structure): ```typescript import { z } from "zod"; export const configSchema = z.object({ githubToken: z.string().describe("GitHub API token"), owner: z.string().describe("GitHub repository owner"), repo: z.string().describe("GitHub repository name"), }); export default function createServer({ config, }: { config: z.infer<typeof configSchema>; }) { const server = new McpServer({ name: "your-mcp-server", version: "0.4.0", capabilities: { tools: {}, resources: {}, prompts: {}, streaming: true, // Enable streaming }, }); // Initialize your client/tools here const client = new YourClient(config); client.registerTools(server); return server; } // Keep main function for stdio compatibility async function main() { // Environment variable validation moved inside main() const githubToken = process.env.GITHUB_TOKEN; const owner = process.env.GITHUB_OWNER; const repo = process.env.GITHUB_REPO; if (!githubToken || !owner || !repo) { console.error("Environment variables GITHUB_TOKEN, GITHUB_OWNER, and GITHUB_REPO are required"); process.exit(1); } const server = createServer({ config: { githubToken, owner, repo, }, }); const transport = new StdioServerTransport(); await server.connect(transport); } // Only run main if this file is executed directly if (import.meta.url === `file://${process.argv[1]}`) { main().catch(console.error); } ``` ## Step 4: Update Package.json Scripts and Module Field Add the module field and update your `package.json` scripts section: ```json { "module": "src/index.ts", "scripts": { "prebuild": "npm run lint && npm run format", "prepublishOnly": "npm run build:stdio", // Update build commands "build": "npm run build:http", "build:stdio": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"", "build:http": "npx @smithery/cli build", // Update dev commands "dev": "npx @smithery/cli dev", "dev:stdio": "concurrently \"npm run watch\" \"npm run inspector\"", // Update start commands "start": "npm run start:http", "start:http": "node .smithery/index.cjs", "start:stdio": "node build/index.js", // Keep existing scripts for backwards compatibility "watch": "tsc --watch", "inspector": "npx @modelcontextprotocol/inspector node build/index.js" // Remove any Docker-related scripts like: // "smithery:build": "docker build..." // "smithery:run": "docker run..." } } ``` ## Step 5: Remove Docker Files Delete these Docker-related files: - `Dockerfile` - `Dockerfile.smithery` - `docker-compose.yml` (if exists) - `.dockerignore` (if exists) ## Step 6: Update .gitignore Add Smithery build output to `.gitignore`: ```gitignore # Smithery build output .smithery/index.cjs ``` **Note**: The `.smithery/index.cjs` file should be committed for HTTP deployment, so don't ignore the entire `.smithery/` directory. ## Step 7: Build and Test 1. Install/update dependencies: ```bash npm install # or pnpm install ``` 2. Build the HTTP version: ```bash npm run build:http ``` This generates `.smithery/index.cjs` - a bundled version for HTTP streaming. 3. Test locally: ```bash npm run dev ``` ## Step 8: Update Documentation Update your README.md to reflect the new deployment options: ```markdown ## Deployment ### HTTP Streaming (Recommended) ```bash npm run build:http npm run start:http ``` ### Traditional stdio (Legacy) ```bash npm run build:stdio npm run start:stdio ``` ``` ## Step 9: Version and Release 1. Update version in both files: - `package.json` version field - `smithery.yaml` version field 2. Commit changes: ```bash git add . git commit -m "release(0.4.0) - migrate to HTTP streaming interface" ``` 3. Create release: ```bash gh release create v0.4.0 --title "Release v0.4.0: HTTP Streaming Interface" --notes "Migration to HTTP streaming interface using Smithery" ``` ## Key Benefits of This Migration - **Better Performance**: HTTP streaming is more efficient than Docker for MCP operations - **Simplified Deployment**: No Docker runtime required - **Backwards Compatibility**: stdio mode still available via `npm run start:stdio` - **Development Experience**: `npm run dev` provides hot reloading ## Troubleshooting ### Common Issues 1. **Build fails**: Ensure all dependencies are installed and TypeScript compiles successfully 2. **Missing .smithery/index.cjs**: Run `npm run build:http` to generate the bundled output 3. **HTTP server not starting**: Check that port 3000 (or configured port) is available ### Verification Steps 1. Verify stdio mode still works: `npm run start:stdio` 2. Verify HTTP mode works: `npm run start:http` 3. Test MCP tools using the inspector: `npm run inspector` The migration maintains all existing MCP functionality while enabling more flexible deployment options.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Hint-Services/mcp-private-github-search'

If you have feedback or need assistance with the MCP directory API, please join our Discord server