Skip to main content
Glama

xing-mcp

An MCP server for searching jobs on XING — the leading professional network in the DACH region (Germany, Austria, Switzerland).

The MCP job-search ecosystem is heavily LinkedIn-centric, and the standard multi-board scraper (JobSpy) does not cover XING. This server fills that gap. Most XING listings include a salary estimate, which is unusual and hard to get elsewhere.

Tools

Tool

Purpose

search_jobs

Search one page of listings by keywords, location, radius, employment type

search_jobs_paginated

Search across multiple pages, rate-limited and deduplicated

get_job_details

Full posting incl. description converted to markdown

get_company_jobs

Open positions on a company's XING page

Related MCP server: trackly-cli

Install

uv venv && uv pip install -e .

Claude Code

claude mcp add xing -- /absolute/path/to/xing_mcp/.venv/bin/xing-mcp

Claude Desktop

{
  "mcpServers": {
    "xing": {
      "command": "/absolute/path/to/xing_mcp/.venv/bin/xing-mcp"
    }
  }
}

Configuration

Env var

Default

Purpose

XING_MCP_USER_AGENT

honest self-identifying UA

Override the User-Agent

XING_MCP_RATE_LIMIT

1.0

Minimum seconds between requests

XING_MCP_CACHE_TTL

300

Response cache TTL in seconds

What works, and what doesn't

XING has no public jobs API (dev.xing.com is plugins-only and closed to new registrations), so this server reads XING's public job-search HTML pages. Search parameters were mapped empirically against the live site.

Supported filters — verified working:

  • keywords, location, radius (km), page

  • employment_type: FULL_TIME, PART_TIME

Not supported — XING accepts these as URL parameters but they have no effect, so the server does not pretend to offer them:

  • remote/home-office filtering

  • sort order (results are relevance-ranked by XING)

  • career/seniority level filtering — filter by seniority in your prompt or by reading job titles instead

Login-gated results: XING hides roughly a quarter to a third of listings from logged-out visitors. Those appear as UnauthorizedJob and cannot be retrieved. Every tool reports how many were withheld in a note field rather than silently returning a short list.

How it works

Three parser tiers, tried in order, so a XING frontend change degrades rather than breaks:

  1. Apollo cache (parsers/apollo.py) — XING server-renders its full GraphQL cache into the page. Richest source: salary, apply URL, company, dates.

  2. JSON-LD (parsers/jsonld.py) — schema.org/JobPosting on detail pages, for descriptions and postal addresses.

  3. DOM fallback (parsers/dom.py) — data-testid selectors. Sparse (no salary), but durable.

If all tiers fail, the tools return an explicit error. They never return an empty list to paper over a parse failure.

Compliance

This server reads only public job pages and is intended for personal, user-directed job searching.

  • XING's robots.txt explicitly Allows /jobs/search for user-directed AI agents (Claude-User, GPTUser, PerplexityBot, …), while the catch-all User-agent: * disallows it.

  • XING's internal GraphQL API (/xing-one/api, /graphql/) is Disallowed for every agent. This server never calls it — the forbidden paths are hard-blocked in client.py.

  • The default User-Agent identifies this software honestly and does not impersonate a named crawler.

  • Requests are serialised at 1/second and cached.

Caveats you should know about: this server is not one of the named agents in XING's allowlist, so it sits in a grey area between that allowlist and the catch-all rule. XING/New Work SE's Terms of Service restrict automated data collection independently of robots.txt, and listings contain personal and company data subject to GDPR. Personal job hunting is a reasonable use; commercial redistribution of scraped listings would need legal review.

Development

uv pip install -e ".[dev]"
pytest                    # 39 offline tests, no network
pytest -m live            # 8 tests against the live site

Fixtures are synthetic on purpose. This repo does not commit scraped XING pages — that would republish XING's page content and employers' job-ad text, which is exactly what the compliance note above warns against. The committed fixtures are generated by scripts/make_synthetic_fixtures.py and reproduce the structures the parsers depend on (Apollo cache layout, JSON-LD block, DOM cards) using invented companies and salaries.

The trade-off is that offline tests cannot notice XING changing its site. That is what the live suite is for — it checks that the Apollo tier still parses, that salary estimates are still present, that pagination still returns distinct results, that the employmentType hash ID still works, and that XING's robots.txt still allowlists /jobs/search for AI agents. Run it periodically.

For local debugging against real pages:

python scripts/fetch_live_fixtures.py   # writes tests/fixtures_live/ (gitignored)

License

MIT

Available Tools

4 tools
get_company_jobsA

List the open positions published on a company's XING page.

Args: company: The company's XING page slug or full page URL — the part after /pages/, e.g. "exxetaag" for xing.com/pages/exxetaag.

ParametersJSON Schema
NameRequiredDescriptionDefault
companyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full burden. It only states the action 'List' without disclosing additional behavior such as pagination, error handling, or response format. Since there is no readOnlyHint annotation, the agent must infer safety from the word 'List'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, with the purpose first and a clearly formatted Args section. Every word adds value; the example is concise and directly relevant to the parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a single required parameter and an output schema, the description covers the essential input semantics well. However, it lacks any context about when to choose this tool over its siblings, making it slightly incomplete for an agent deciding between tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only specifies `company` as a string with no description. The description adds critical details: 'The company's XING page slug or full page URL — the part after /pages/, e.g. "exxetaag" for xing.com/pages/exxetaag.' This gives the exact format and an example, far exceeding the schema's empty description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'List the open positions published on a company's XING page.' This uses a specific verb ('List') and a specific resource (jobs on a company's page), distinguishing it from siblings like `get_job_details` (specific job) and `search_jobs` (global search).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for retrieving jobs from a specific company page via the `company` parameter, but it does not explicitly mention when to prefer alternatives like `search_jobs` for cross-company searches. This leaves usage context partially implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_detailsA

Fetch the full details of one XING job posting, including the complete description converted to markdown.

Args: identifier: A XING job URL, or the slug from one (e.g. "berlin-python-developer-financial-services-156675213"). description_max_chars: Truncate the description beyond this length.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYes
description_max_charsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It does disclose that the description is converted to markdown and supports truncation. However, it doesn't mention error handling, rate limits, authentication, or what happens with invalid identifiers. For a read-only getter this is acceptable but not exceptional.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized and front-loaded with the core purpose. The Args section is clear and directly addresses parameters, though it could be slightly more compact. Every sentence contributes to understanding the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description needn't explain return values. The tool has only two parameters (one optional) and no nested objects, so the description covers the essential input semantics and behavior. Minor gaps like edge cases (e.g., what happens with very short descriptions) exist but are not critical for a simple getter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no description coverage (0%), but the description thoroughly explains both parameters: identifier accepts a URL or slug with a concrete example, and description_max_chars controls truncation length. This adds meaning beyond the bare schema and compensates for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it fetches the full details of a single XING job posting, which distinguishes it from the sibling search tools. It uses a specific verb 'Fetch' and identifies the resource as 'one XING job posting' with details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context is clear: this tool is for retrieving a specific job given a URL or slug. While it doesn't explicitly say 'use search_jobs first to find jobs', the singular focus and presence of sibling search tools imply the appropriate use case. No exclusions are mentioned, but the purpose itself is a strong signal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_jobsA

Search job postings on XING, the main professional network in the DACH region (Germany, Austria, Switzerland).

Most listings include a salary estimate, which is unusual for job boards.

Args: keywords: Job title or skills, e.g. "python developer". German terms often match better for DACH roles ("Softwareentwickler"). location: City or region, e.g. "Berlin", "München", "Wien". radius: Search radius around location in kilometres. employment_type: FULL_TIME or PART_TIME. Other values are not supported by XING's URL filter. page: 1-based page number. Each page holds up to ~14 visible jobs.

Returns a dict with jobs, total (XING's match count) and page.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
radiusNo
keywordsNo
locationNo
employment_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses salary estimate presence, page size limits, employment_type URL filter constraints, and return structure. It does not mention authentication or error behavior, but for a search tool these are not glaring omissions. Overall, strong behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with an intro, a notable behavior note, a clearly formatted Args section, and a Returns line. Every sentence adds relevant information—nothing is filler. It is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and all parameters are optional, the description is complete enough: it explains all params, return keys, and behavioral quirks. It does not need to duplicate the output schema. The only minor gap is not addressing sibling tool selection, but that is a usage guideline concern rather than contextual completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no descriptions, but the description adds meaningful semantics for all five parameters: keywords with examples, location with cities, radius in kilometers, employment_type restricted to FULL_TIME/PART_TIME, and page with 1-based numbering and page size. This fully compensates for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Search job postings on XING' with a specific verb and resource, plus DACH region context. However, it does not explicitly differentiate from the sibling tool 'search_jobs_paginated', even though it describes page-based search behavior. This is clear but lacks direct sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides useful parameter usage guidance such as German terms matching better and employment_type restrictions. However, it does not state when to use this tool versus alternatives like search_jobs_paginated or get_company_jobs. Usage context is implied by the purpose but not made explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_jobs_paginatedA

Search XING jobs across multiple pages, deduplicated.

Use this instead of calling search_jobs repeatedly — it paginates behind a rate limiter and removes duplicates. Requests are ~1 second apart, so fetching 50 results takes a few seconds.

Args: keywords: Job title or skills. location: City or region. radius: Search radius in kilometres. employment_type: FULL_TIME or PART_TIME. max_results: Maximum jobs to return (capped at 200).

ParametersJSON Schema
NameRequiredDescriptionDefault
radiusNo
keywordsNo
locationNo
max_resultsNo
employment_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses key behaviors: pagination behind a rate limiter, deduplication, ~1 second request spacing, and time estimates, giving the agent realistic expectations about performance and side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: two sentences of purpose/usage followed by a clean argument list. Every sentence adds value, and the argument definitions are direct without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema (not shown) covers return format, the description covers all other essentials: parameters, pagination behavior, rate limiting, and deduplication. The sibling comparison and explicit cap complete the picture for a complex paginated tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description hand-documents all five parameters with meaningful details: radius is in kilometres, employment_type accepts FULL_TIME or PART_TIME, and max_results is capped at 200. This adds crucial semantics beyond the bare schema properties.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Search XING jobs across multiple pages, deduplicated,' which clearly states the action, resource, and scope. It also distinguishes itself from the sibling tool `search_jobs` by noting it is the paginated alternative, avoiding repeated calls.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to use this tool 'instead of calling `search_jobs` repeatedly,' providing clear when-to-use guidance. It also explains the rate limiting and deduplication benefits, helping the agent choose correctly among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.1.0
    • First observedget_company_jobs
    • First observedget_job_details
    • First observedsearch_jobs
    • First observedsearch_jobs_paginated

TDQS

A4.3/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: search for jobs, get job details, search across pages, and get company jobs. The two search tools are differentiated by pagination and deduplication, with clear guidance to prefer the paginated one for multi-page queries.

Naming Consistency5/5

All tools follow the verb_noun pattern with consistent snake_case: search_jobs, search_jobs_paginated, get_job_details, get_company_jobs. This makes the tool set easy to predict and navigate.

Tool Count5/5

Four tools is well-scoped for a job search server, covering search, detail retrieval, pagination, and a company filter without redundancy or bloat.

Completeness4/5

The domain of job searching is well covered: searching with filters, pagination, job details, and company-specific listings. Minor gaps like browsing by category or filtering by salary range exist, but the core workflow is complete.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that exposes job search data from multiple boards, enabling clients to query and manage job listings via natural language.
    7
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for job search and application tracking, enabling AI agents to search jobs, get details, manage applications, and find contacts across 128K+ jobs and 1,900+ companies.
    638 npm
    3
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for accessing Jsearch API to search jobs, get job details, and retrieve salary estimates.
    4
    MIT