305 lines
7.3 KiB
Markdown
305 lines
7.3 KiB
Markdown
|
|
# MCP Job Search Stack - Deployment Guide
|
||
|
|
|
||
|
|
This guide walks you through setting up and deploying your two new MCPs for job searching and RFP discovery.
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
You now have two complementary MCPs:
|
||
|
|
|
||
|
|
1. **rfp-scraper-mcp-server** - Discovers RFPs and freelance opportunities for control room and broadcast studio projects
|
||
|
|
2. **linkedin-mcp-server** - Searches LinkedIn jobs and manages professional networking
|
||
|
|
|
||
|
|
## Quick Start
|
||
|
|
|
||
|
|
### 1. Build Both MCPs
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Build RFP Scraper MCP
|
||
|
|
cd /sessions/focused-busy-tesla/mnt/MCP\ Servers/rfp-scraper-mcp-server
|
||
|
|
npm install
|
||
|
|
npm run build
|
||
|
|
|
||
|
|
# Build LinkedIn MCP
|
||
|
|
cd /sessions/focused-busy-tesla/mnt/MCP\ Servers/linkedin-mcp-server
|
||
|
|
npm install
|
||
|
|
npm run build
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Verify Build Success
|
||
|
|
|
||
|
|
Both should complete without errors and create a `dist/` directory with compiled JavaScript.
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Test RFP Scraper
|
||
|
|
node rfp-scraper-mcp-server/dist/index.js --version
|
||
|
|
|
||
|
|
# Test LinkedIn
|
||
|
|
node linkedin-mcp-server/dist/index.js --version
|
||
|
|
```
|
||
|
|
|
||
|
|
## Integration with mcp-gateway
|
||
|
|
|
||
|
|
Your MCPs are designed to integrate with your existing mcp-gateway at `mcp.wilddragon.net`.
|
||
|
|
|
||
|
|
### Configuration
|
||
|
|
|
||
|
|
Add to your mcp-gateway configuration:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"mcpServers": {
|
||
|
|
"rfp-scraper": {
|
||
|
|
"command": "node",
|
||
|
|
"args": ["/path/to/rfp-scraper-mcp-server/dist/index.js"],
|
||
|
|
"env": {
|
||
|
|
"RFP_SCRAPER_API_KEY": "${RFP_SCRAPER_API_KEY}"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"linkedin": {
|
||
|
|
"command": "node",
|
||
|
|
"args": ["/path/to/linkedin-mcp-server/dist/index.js"],
|
||
|
|
"env": {
|
||
|
|
"LINKEDIN_ACCESS_TOKEN": "${LINKEDIN_ACCESS_TOKEN}"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Environment Variables
|
||
|
|
|
||
|
|
**For RFP Scraper:**
|
||
|
|
```bash
|
||
|
|
export RFP_SCRAPER_API_KEY=your_api_key # Optional, for enhanced features
|
||
|
|
```
|
||
|
|
|
||
|
|
**For LinkedIn:**
|
||
|
|
```bash
|
||
|
|
export LINKEDIN_ACCESS_TOKEN=your_access_token # Required for connection requests
|
||
|
|
```
|
||
|
|
|
||
|
|
Get your LinkedIn access token from: https://linkedin.com/developers
|
||
|
|
|
||
|
|
## Features by MCP
|
||
|
|
|
||
|
|
### RFP Scraper MCP (`rfp-scraper-mcp-server`)
|
||
|
|
|
||
|
|
Tools available:
|
||
|
|
- **rfp_search_projects** - Search for RFP opportunities
|
||
|
|
- **rfp_get_project_details** - Get detailed project information
|
||
|
|
- **rfp_filter_by_budget** - Filter projects by budget range
|
||
|
|
|
||
|
|
**Example Usage:**
|
||
|
|
```
|
||
|
|
Search for control room projects:
|
||
|
|
keywords: ["control room", "broadcast studio"]
|
||
|
|
limit: 20
|
||
|
|
|
||
|
|
Find high-budget opportunities:
|
||
|
|
minBudget: 10000
|
||
|
|
maxBudget: 50000
|
||
|
|
```
|
||
|
|
|
||
|
|
### LinkedIn MCP (`linkedin-mcp-server`)
|
||
|
|
|
||
|
|
Tools available:
|
||
|
|
- **linkedin_search_jobs** - Search for jobs
|
||
|
|
- **linkedin_get_job_details** - Get job information
|
||
|
|
- **linkedin_search_profiles** - Find professionals
|
||
|
|
- **linkedin_send_connection** - Connect with professionals
|
||
|
|
- **linkedin_get_profile** - View profiles
|
||
|
|
|
||
|
|
**Example Usage:**
|
||
|
|
```
|
||
|
|
Search for broadcast jobs:
|
||
|
|
keywords: "broadcast engineer"
|
||
|
|
jobType: "FREELANCE"
|
||
|
|
|
||
|
|
Find industry professionals:
|
||
|
|
keywords: "broadcast systems"
|
||
|
|
industry: "Broadcasting"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Development Mode
|
||
|
|
|
||
|
|
For local testing and development:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Terminal 1: RFP Scraper
|
||
|
|
cd rfp-scraper-mcp-server
|
||
|
|
npm run dev
|
||
|
|
|
||
|
|
# Terminal 2: LinkedIn
|
||
|
|
cd linkedin-mcp-server
|
||
|
|
npm run dev
|
||
|
|
```
|
||
|
|
|
||
|
|
This uses `tsx` to watch for changes and auto-reload.
|
||
|
|
|
||
|
|
## Testing the MCPs
|
||
|
|
|
||
|
|
### Using MCP Inspector
|
||
|
|
|
||
|
|
Test individual MCPs with the MCP Inspector:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Test RFP Scraper
|
||
|
|
npx @modelcontextprotocol/inspector node rfp-scraper-mcp-server/dist/index.js
|
||
|
|
|
||
|
|
# Test LinkedIn
|
||
|
|
npx @modelcontextprotocol/inspector node linkedin-mcp-server/dist/index.js
|
||
|
|
```
|
||
|
|
|
||
|
|
The inspector provides a web interface to:
|
||
|
|
- List available tools
|
||
|
|
- Test tool calls
|
||
|
|
- View responses
|
||
|
|
- Debug issues
|
||
|
|
|
||
|
|
### Manual Testing
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Build both
|
||
|
|
npm run build
|
||
|
|
|
||
|
|
# Run and test
|
||
|
|
node rfp-scraper-mcp-server/dist/index.js
|
||
|
|
|
||
|
|
# In another terminal, send test request via stdin
|
||
|
|
echo '{"jsonrpc":"2.0","id":1,"method":"resources/list"}' | node rfp-scraper-mcp-server/dist/index.js
|
||
|
|
```
|
||
|
|
|
||
|
|
## Architecture Notes
|
||
|
|
|
||
|
|
### RFP Scraper
|
||
|
|
- **Service**: `services/scraper.ts` - Core scraping and filtering logic
|
||
|
|
- **Transport**: stdio (local) - designed for mcp-gateway integration
|
||
|
|
- **Error Handling**: Graceful handling of API errors and timeouts
|
||
|
|
- **Pagination**: Supports offset-based pagination for large result sets
|
||
|
|
|
||
|
|
### LinkedIn
|
||
|
|
- **Service**: `services/linkedin-client.ts` - LinkedIn API client
|
||
|
|
- **Transport**: stdio (local) - designed for mcp-gateway integration
|
||
|
|
- **Mock Data**: Currently uses mock data for development. Replace with real API calls once authenticated.
|
||
|
|
- **Authentication**: Supports LinkedIn OAuth tokens
|
||
|
|
|
||
|
|
## Production Deployment
|
||
|
|
|
||
|
|
### Prerequisites
|
||
|
|
- Node.js 18+
|
||
|
|
- npm or yarn
|
||
|
|
- Valid API credentials (LinkedIn token, etc.)
|
||
|
|
|
||
|
|
### Deployment Steps
|
||
|
|
|
||
|
|
1. **Install dependencies on production server:**
|
||
|
|
```bash
|
||
|
|
npm install --production
|
||
|
|
npm run build
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Set environment variables:**
|
||
|
|
```bash
|
||
|
|
export LINKEDIN_ACCESS_TOKEN=prod_token
|
||
|
|
export RFP_SCRAPER_API_KEY=prod_key
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **Run MCPs via process manager (PM2):**
|
||
|
|
```bash
|
||
|
|
pm2 start rfp-scraper-mcp-server/dist/index.js --name rfp-scraper
|
||
|
|
pm2 start linkedin-mcp-server/dist/index.js --name linkedin
|
||
|
|
```
|
||
|
|
|
||
|
|
4. **Monitor:**
|
||
|
|
```bash
|
||
|
|
pm2 logs
|
||
|
|
pm2 status
|
||
|
|
```
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Build Fails
|
||
|
|
- Ensure Node.js 18+ is installed: `node --version`
|
||
|
|
- Clear npm cache: `npm cache clean --force`
|
||
|
|
- Rebuild: `rm -rf node_modules dist && npm install && npm run build`
|
||
|
|
|
||
|
|
### Tools Not Appearing
|
||
|
|
- Check server started successfully: `npm start`
|
||
|
|
- Verify no TypeScript errors: `npm run build`
|
||
|
|
- Check tool names match exactly in your calls
|
||
|
|
|
||
|
|
### API Errors
|
||
|
|
- Verify environment variables are set: `echo $LINKEDIN_ACCESS_TOKEN`
|
||
|
|
- Check API credentials are valid
|
||
|
|
- Review error messages for guidance on next steps
|
||
|
|
|
||
|
|
### Connection Issues
|
||
|
|
- Ensure mcp-gateway can reach the servers
|
||
|
|
- Check firewall rules if using remote deployment
|
||
|
|
- Verify stdio transport is properly configured
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
1. **Authenticate with APIs:**
|
||
|
|
- Get LinkedIn access token: https://linkedin.com/developers
|
||
|
|
- Set up any RFP API keys if needed
|
||
|
|
|
||
|
|
2. **Test Integration:**
|
||
|
|
- Run MCPs locally first
|
||
|
|
- Test with MCP Inspector
|
||
|
|
- Verify with mcp-gateway
|
||
|
|
|
||
|
|
3. **Customize:**
|
||
|
|
- Modify scraper keywords and sources as needed
|
||
|
|
- Adjust job search filters
|
||
|
|
- Add additional tools based on your workflow
|
||
|
|
|
||
|
|
4. **Monitor Usage:**
|
||
|
|
- Track API rate limits
|
||
|
|
- Monitor performance metrics
|
||
|
|
- Adjust pagination limits if needed
|
||
|
|
|
||
|
|
## File Structure
|
||
|
|
|
||
|
|
```
|
||
|
|
MCP Servers/
|
||
|
|
├── rfp-scraper-mcp-server/
|
||
|
|
│ ├── src/
|
||
|
|
│ │ ├── index.ts
|
||
|
|
│ │ ├── types.ts
|
||
|
|
│ │ ├── constants.ts
|
||
|
|
│ │ └── services/
|
||
|
|
│ │ └── scraper.ts
|
||
|
|
│ ├── dist/
|
||
|
|
│ │ └── index.js (generated)
|
||
|
|
│ ├── package.json
|
||
|
|
│ ├── tsconfig.json
|
||
|
|
│ └── README.md
|
||
|
|
├── linkedin-mcp-server/
|
||
|
|
│ ├── src/
|
||
|
|
│ │ ├── index.ts
|
||
|
|
│ │ ├── types.ts
|
||
|
|
│ │ ├── constants.ts
|
||
|
|
│ │ └── services/
|
||
|
|
│ │ └── linkedin-client.ts
|
||
|
|
│ ├── dist/
|
||
|
|
│ │ └── index.js (generated)
|
||
|
|
│ ├── package.json
|
||
|
|
│ ├── tsconfig.json
|
||
|
|
│ └── README.md
|
||
|
|
└── DEPLOYMENT_GUIDE.md (this file)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Support
|
||
|
|
|
||
|
|
For issues or questions:
|
||
|
|
1. Check individual README files in each MCP directory
|
||
|
|
2. Review error messages - they include suggested next steps
|
||
|
|
3. Check TypeScript compilation for type errors
|
||
|
|
4. Verify environment variables are set correctly
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Last Updated**: 2026-03-31
|
||
|
|
**Version**: 1.0.0
|