search_jobs
Search for jobs in the STON job database. Returns structured JSON.
Call this tool ONCE per user request, then present the returned jobs list
to the user in whatever format fits (markdown list, table, plain text).
Always include the apply link from the url field for each job.
If has_more is true, mention total_found and ask whether to fetch more.
NEVER call this tool multiple times in a row to collect all pages automatically.
To count results without fetching full job data, prefer count_jobs. If a
filter you need isn't on count_jobs, call this tool with rows=1 and read
total_found (the count is server-side and independent of rows).
Args: q: Search keywords (German job market — examples: "Softwareentwickler Python", "Krankenpfleger") location: City, region or area, e.g. "München", "Ravensburg", "Bodensee", "Baden-Württemberg" radius: Search radius in km around the location, e.g. 25, 50 (default: server setting) working_plan: One of: "Vollzeit", "Teilzeit", "Minijob", "Homeoffice" (comma-separated for multiple) job_offer_type: One of: "Arbeitsplatz", "Ausbildung", "Praktikum", "Freiberuflich", "Werkstudent", "Trainee", "Duales-Studium" (comma-separated for multiple) min_salary: Minimum ANNUAL gross salary in EUR (optional), e.g. 60000. Filtered server-side. Jobs advertised per month/hour are normalised to a yearly figure first, so e.g. 5000/month matches min_salary=60000. Salary ranges match on OVERLAP, not containment: a job advertised as 30.000–45.000 € IS returned at min_salary=40000 (the ranges overlap), and is NOT returned at max_salary=25000. max_salary: Maximum annual gross salary in EUR (optional, same overlap semantics) has_salary: If True, return only jobs that advertise a salary at all (any amount); if False, only jobs without one. Leave unset to ignore. sort: "relevance" (default) or "date" (newest first) page: Page number starting at 1 rows: Results per page, 1-50 (default: 25)
Returns: On success: { "total_found": int, "page": int, "rows": int, "total_pages": int, "has_more": bool, "salary_filter": null | {"min_salary": float|null, "max_salary": float|null}, "jobs": [ { "id": str, "title": str, "company_name": str, "location": str, "date": str (ISO-8601), "url": str, "salary": null | {"annual_eur": float, "monthly_eur": float, "currency": str, "min_annual_eur"?: float, "max_annual_eur"?: float, "data_quality"?: "suspect"} # implausibly high → likely a data error }, ... ] } On error: {"error": str}
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| page | No | ||
| rows | No | ||
| sort | No | ||
| radius | No | ||
| location | No | ||
| has_salary | No | ||
| max_salary | No | ||
| min_salary | No | ||
| working_plan | No | ||
| job_offer_type | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||