Stepstone Job Search MCP Server
Enables searching for job listings on the German job portal Stepstone.de with multi-term queries, location targeting by postal code and radius, and detailed job information retrieval through session-aware follow-ups.
README
Stepstone Job Search MCP Server
An Model Context Protocol (MCP) server that lets MCP-compatible clients search the German job portal Stepstone.de. The service exposes a pair of tools for running multi-term job searches and fetching rich job details so assistants such as Claude Desktop or Smithery can surface up-to-date vacancies.
Table of Contents
- Key Features
- Quick Start
- Configuration
- Usage
- Architecture Overview
- Local Development
- Testing
- Troubleshooting
- Contributing
- Support
- Version History
- License
Key Features
- π Multi-term Search β Concurrently queries Stepstone for every search phrase you supply and deduplicates duplicate postings.
- π Location Targeting β Supports German postal codes with a configurable radius (1β100 km) for regional searches.
- π§ Session-aware Follow-ups β Saves results for one hour so you can request full job details later via
get_job_details. - π‘οΈ Robust Validation β Defensive parameter validation, logging, and graceful error messages for malformed requests.
- π³ Container & CLI Friendly β Works as a plain Python process or inside Docker; integrates cleanly with Smithery and Claude Desktop.
βΉοΈ Note: A Redis cache and other scaling features are mentioned as future enhancements. They are not enabled in the current release.
Quick Start
Prerequisites
- Python 3.8+
pip- Internet access to reach Stepstone.de when running real searches
Installation Options
<details> <summary><strong>Option 1 Β· Install with Smithery (Recommended)</strong></summary>
npx -y @smithery/cli install @kdkiss/mcp-stepstone --client claude
</details>
<details> <summary><strong>Option 2 Β· Manual Setup</strong></summary>
# Clone the repository
git clone https://github.com/kdkiss/mcp-stepstone.git
cd mcp-stepstone
# Install runtime dependencies
pip install -r requirements.txt
# (Optional) make the server script executable on Unix-like systems
chmod +x stepstone_server.py
</details>
<details> <summary><strong>Option 3 Β· Docker</strong></summary>
# Build the image
docker build -t mcp-stepstone .
# Run the container
docker run -it --rm mcp-stepstone
</details>
Configuration
MCP Client Configuration
Smithery mcp.json
{
"mcpServers": {
"stepstone-job-search": {
"command": "python",
"args": ["/path/to/stepstone_server.py"],
"description": "Search for job listings on Stepstone.de",
"env": {
"LOG_LEVEL": "INFO",
"REQUEST_TIMEOUT": "10"
}
}
}
}
Claude Desktop
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"stepstone-job-search": {
"command": "python",
"args": ["/absolute/path/to/stepstone_server.py"],
"env": {
"LOG_LEVEL": "DEBUG",
"USER_AGENT": "MCP-Stepstone-Bot/1.0"
}
}
}
}
Environment Variables
| Variable | Default | Description |
|---|---|---|
LOG_LEVEL |
INFO |
Logging verbosity (DEBUG, INFO, WARNING, ERROR). |
REQUEST_TIMEOUT |
10 |
Timeout (seconds) for outbound Stepstone HTTP requests and the upper bound for long-running tool calls (the server stops waiting shortly before this limit to avoid client timeouts). |
USER_AGENT |
Browser-like UA string | Custom User-Agent presented to Stepstone.de. |
MAX_RETRIES |
3 |
Retry attempts for failed HTTP calls. |
CACHE_TTL |
300 |
Placeholder for future in-memory caching feature. |
Usage
Available Tools
search_jobs
Runs one or more keyword searches against Stepstone.
Parameters
search_terms(array of strings, optional) β Search phrases to query. Defaults to["fraud", "betrug", "compliance"].zip_code(string, optional) β German 5-digit postal code. Defaults to"40210"(DΓΌsseldorf).radius(integer, optional) β Radius in kilometres around the postal code. Defaults to5; must be between 1 and 100.
get_job_details
Fetches one stored job and enriches it with full description and metadata.
Parameters
job_index(integer, optional) β 1-based index into the most recent sessionβs results.job_query(string, optional) β Fuzzy match against stored jobs. Aliasqueryis also accepted.session_id(string, optional) β Explicit session identifier (auto-selects the most recent active session when omitted).
β οΈ Provide either
job_indexorjob_query. Supplying both prioritisesjob_index.
Example Invocations
// Basic search
{
"tool": "search_jobs",
"parameters": {
"search_terms": ["software engineer", "developer"]
}
}
// Location constrained search
{
"tool": "search_jobs",
"parameters": {
"search_terms": ["marketing manager", "digital marketing"],
"zip_code": "10115",
"radius": 15
}
}
// Fetch job details by index
{
"tool": "get_job_details",
"parameters": {
"job_index": 1
}
}
// Fetch job details by query string
{
"tool": "get_job_details",
"parameters": {
"job_query": "AML Specialist",
"session_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
Sample Output
Job Search Summary:
Search Terms: fraud analyst, compliance officer
Location: 60329 (Β±25km)
Total Jobs Found: 23
Session ID: 550e8400-e29b-41d4-a716-446655440000
--- Results for 'fraud analyst' ---
1. Senior Fraud Analyst - Digital Banking
Company: Deutsche Bank AG
Description: Join our fraud prevention team to analyze transaction patterns...
Link: https://www.stepstone.de/stellenangebote--Senior-Fraud-Analyst-Frankfurt-Deutsche-Bank-AG--1234567
π Job Details: Senior Fraud Analyst - Digital Banking
π’ Company: Deutsche Bank AG
π Location: Frankfurt am Main
π° Salary: β¬65,000 - β¬85,000 per year
β° Employment Type: Full-time, Permanent
π Description:
Join our fraud prevention team to analyze transaction patterns and develop detection algorithms...
β
Requirements:
β’ Bachelor's degree in Computer Science, Finance, or related field
β’ 3+ years experience in fraud detection or financial crime prevention
β’ Strong analytical skills with SQL, Python, or R
β’ Knowledge of AML regulations and compliance frameworks
Architecture Overview
ββββββββββββββββββββββ βββββββββββββββββββββββ βββββββββββββββββββββ
β MCP Client β βββΆ β MCP Stepstone β βββΆ β Stepstone.de β
β (Claude/Smithery) β β Server β β Job Portal β
ββββββββββββββββββββββ βββββββββββββββββββββββ βββββββββββββββββββββ
β
βββββββββββββββββββββββ
β Job Scraper β
β - URL Builder β
β - HTML Parser β
β - Data Cleaner β
βββββββββββββββββββββββ
- Request β MCP client sends tool invocation.
- Validation β Inputs validated (terms, postal code, radius).
- Search β URLs constructed and fetched concurrently.
- Processing β HTML parsed and normalised job entries produced.
- Sessioning β Results stored in memory for one hour for follow-up queries.
- Response β Textual summary returned to the MCP client.
- Details β
get_job_detailsfetches the original job page and extracts specifics.
Key modules:
StepstoneJobScraperβ Builds search URLs, fetches and parses job listings.JobDetailParserβ Scrapes detailed job pages for salary, requirements, etc.SessionManagerβ Stores search sessions, supports lookup by index or fuzzy match.stepstone_server.pyβ Registers MCP tools/resources and handles tool invocations.
Local Development
# Clone repository
git clone https://github.com/kdkiss/mcp-stepstone.git
cd mcp-stepstone
# Create & activate a virtual environment
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Install dev tooling
pip install pytest pytest-asyncio black flake8
# Run formatter and linter
black stepstone_server.py
flake8 stepstone_server.py
Debug Fixtures
A lightweight HTTP server is included to serve bundled HTML fixtures. Start it when adjusting selectors or parsers:
python debug_server.py
Visit http://127.0.0.1:5000 to inspect the mocked Stepstone pages used in tests.
HTTP Transport Adapter
Some hosted MCP environments (such as Smithery) require an HTTP endpoint with liberal CORS headers instead of the default STDIO transport. The project ships a small Starlette-based adapter that exposes the existing server over the streamable HTTP protocol:
python stepstone_http_server.py
The server listens on 0.0.0.0:8000 by default and responds to preflight
requests with Access-Control-Allow-Origin: *. Adjust the HOST and PORT
environment variables when deploying to platforms that mandate specific
interfaces or ports.
Testing
The test suite uses mocked network responses to avoid contacting Stepstone.de.
pip install -r requirements.txt pytest
pytest
To validate specific tool flows interactively, you can run stepstone_server.py directly or call handle_call_tool from a Python shell.
Troubleshooting
Server Wonβt Start
python --version # Expect 3.8+
pip list | grep -E "(requests|beautifulsoup4|mcp)"
ls -la stepstone_server.py # Confirm execute permissions when running directly
No Jobs Returned
- Verify the postal code is a valid five-digit German PLZ.
- Increase
radiusor broadensearch_terms. - Confirm internet connectivity.
- Stepstone layout changes may require updating selectorsβuse the debug server to compare fixtures.
Import Errors
pip install -r requirements.txt
pip install --upgrade pip
Enable Verbose Logging
export LOG_LEVEL=DEBUG
python stepstone_server.py
Logs are emitted to stdout; integrate with your own logging infrastructure if desired.
Smithery Scanner Cannot Initialize Connection
If the Smithery CLI reports repeated HTTP error: This operation was aborted or
McpError: MCP error -32001: Request timed out messages while scanning the
server, the MCP process started successfully but the JSON-RPC handshake failed.
Typical causes and remedies:
- CORS headers missing β Ensure your HTTP transport returns permissive CORS
headers:
res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS"); res.setHeader("Access-Control-Allow-Headers", "Content-Type"); - Slow initialization β Increase client timeouts (example Smithery
mcp.jsonsnippet):{ "mcpServers": { "stepstone-job-search": { "type": "streamable-http", "url": "http://localhost:3000/mcp", "initTimeout": 30000, "timeout": 60000 } } } - Endpoint mismatch β Confirm the server is reachable where the client
expects it (for example,
curl -v http://localhost:3000/mcp). If Smithery logs showHTTP POST β undefined, double-check the configured URL or transport binding.
When debugging, start the server manually via npx -y @smithery/cli serve to
observe whether it exits early or logs binding issues.
Contributing
- Fork the repository and create a feature branch:
git checkout -b feature/my-change. - Implement your changes and add tests.
- Run
pytestand lint/format the code (black,flake8). - Open a pull request describing the change.
Coding guidelines:
- Follow PEP 8 and include type hints where practical.
- Document public functions with docstrings.
- Handle network and parsing errors defensively.
Support
- π Consult this README for configuration and usage tips.
- π§ͺ Use the debug server to inspect fixture HTML when selectors break.
- π File bugs or feature requests via GitHub Issues.
- π¬ Join the projectβs Discord community (link forthcoming).
Version History
v1.2.0 (Current)
- Added
get_job_detailstool for follow-up queries. - Introduced session management with one-hour TTL.
- Enhanced detail parsing for salary, requirements, and benefits.
- Summaries now include session IDs for easy follow-up.
v1.1.0
- Expanded documentation and usage examples.
- Added Docker support and environment variable configuration.
- Improved error handling and validation.
v1.0.0
- Initial release with multi-term job search and MCP compliance.
License
Distributed under the MIT License.
Made with β€οΈ for the German job market.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.