MCP Integration
Let AI assistants use Datronis via Model Context Protocol
What is MCP?
The Model Context Protocol (MCP) is an open standard by Anthropic that lets AI assistants (Claude, Cursor, Windsurf, etc.) connect to external services and call real tools. Datronis exposes an MCP server so any MCP-compatible AI can search jobs, browse news, explore companies, query platform stats — and, with a personal access token, actually submit job applications, list your resumes, and check your application status on your behalf — all without writing a single line of integration code.
Quickest way to test
Paste the server URL into Claude Desktop (or any MCP client) and immediately ask: "Find remote senior React jobs" or "Show me the latest tech news."
New to MCP?
See the Datronis for AI Agents overview page first for a plain-language pitch, the full tool list, and more example prompts — come back here when you're ready to wire up a client.
Server URL
The MCP server is a single HTTP endpoint. All three HTTP methods are used by the protocol:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
POST /api/mcp | HTTP | Yes | — | Initialize a new session or send messages to an existing one |
GET /api/mcp | HTTP | No | — | Open a Server-Sent Events stream for server-initiated messages (requires Mcp-Session-Id header) |
DELETE /api/mcp | HTTP | No | — | Close and clean up a session (requires Mcp-Session-Id header) |
https://api.datronis.com/api/mcpClaude Desktop Setup
Add the following to your Claude Desktop configuration file. On macOS this is at ~/Library/Application Support/Claude/claude_desktop_config.json.
{
"mcpServers": {
"datronis": {
"command": "npx",
"args": [
"mcp-remote",
"https://api.datronis.com/api/mcp"
]
}
}
}mcp-remote
The mcp-remote package bridges Claude Desktop (which uses stdio) to any HTTP MCP server. Install it once with: npm install -g mcp-remote
Cursor / Windsurf / Cline Setup
These editors support HTTP MCP servers natively. Add the server URL in your editor's MCP settings panel:
{
"mcpServers": {
"datronis": {
"url": "https://api.datronis.com/api/mcp",
"type": "http"
}
}
}Available Tools
The first 7 tools below are public (no API key required) — the AI can call them automatically based on your request. The remaining 6 require a personal access token (see the next section) since they act on your account: submitting applications, reading your resumes, checking your application history, drafting or revising news articles, and publishing translations of existing articles.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
search_jobs | tool "q""country""city""remote_type""job_type""job_level""skills""salary_min""page""limit""api_key (optional)" | No | — | Search job listings by keyword, location, remote policy, job type, experience level, and skills. Pass api_key to personalize results (e.g. whether you saved a job). Returns paginated results. |
get_job | tool "slug (required)""api_key (optional)" | No | — | Get the full details of a job by its slug or ID — including description, requirements, salary, and application URL. Pass api_key to personalize results. |
get_news | tool "title""category_id""locale""limit""offset" | No | — | Fetch the latest news articles. Filter by title keyword, category ID, or locale (language). Returns title, summary, date, and URL. |
get_categories | tool "locale" | No | — | List all content categories on the platform. Used to discover category IDs for filtering news. |
search_companies | tool "query""country""industry""is_hiring""limit""page" | No | — | Search companies by name, industry, or country. Optionally filter to actively-hiring companies. |
get_platform_stats | tool | No | — | Get platform-wide statistics: total jobs, companies, news articles, and users. |
apply_to_job | tool "api_key (required)""job_id (required)""resume_id (optional)""cover_letter (optional)" | Yes | — | Submit a job application on your behalf. If resume_id is omitted, your default (or most recently updated) resume is used automatically. |
list_my_resumes | tool "api_key (required)""query""status""locale""page""limit" | Yes | — | List your saved resumes, so an AI agent can show you which one will be used to apply, or let you pick a different one. |
get_my_applications | tool "api_key (required)""page""limit" | Yes | — | Check the status of your submitted job applications (pending, reviewed, hired, rejected, etc.). |
draft_news | tool "api_key (required)""title (required)""body (required)""category_id (optional)""target_locales (optional)" | Yes | — | Draft and publish a news article. Open to any account — the token is for rate-limiting and an audit trail, not a permission gate. Always drafted in English first; an automated safety classifier must return "green" before the article goes live (see Content Safety & Publishing below). Publishes English-only unless target_locales is given. |
resubmit_news | tool "api_key (required)""news_id (required)""title (required)""body (required)""target_locales (optional)" | Yes | — | Revise and reclassify an article that draft_news rejected as "flagged". Every attempt is separately logged — never a silent status flip. Only the account that originally submitted the article may resubmit it. |
get_missing_news_translations | tool "locale (optional)""page (optional)""limit (optional)" | No | — | List published English articles and which locale codes each one is still missing. Pass locale to focus on a single language. Read-only — never translates anything itself. |
submit_news_translation | tool "api_key (required)""news_id (required)""locale (required)""title (required)""body (required)" | Yes | — | Publish your own translation of an already-published article into a new locale. Unlike target_locales on draft_news (which asks Datronis's own server to translate), the title/body you pass here is published as-is — you do the translation. Rejected if that locale is already covered. |
admin_create_news | tool "api_key (required, admin)""title (required)""body (required)""locale (required)""category_id (optional)""published (optional)" | Yes | — | Admin-only: publish a news article directly into any locale and any status — no safety classifier, no English-first requirement. The api_key must belong to an admin account; a valid but non-admin key is rejected. |
admin_edit_news | tool "api_key (required, admin)""news_id (required)""title (optional)""body (optional)""category_id (optional)""published (optional)" | Yes | — | Admin-only: edit any existing article's title, body, category, or published status, regardless of who created it. No ownership restriction and no classifier. Omit a field to leave it unchanged. |
Content Safety & Publishing Policy for draft_news
Publishing news through MCP follows a fixed, non-bypassable workflow: draft in English, classify, and only then decide whether it goes live or which other languages to publish it into.
- Step 1 — English draft — draft_news always creates the English version of the article first, regardless of which languages you eventually want it published in. Classification and any review both work from this English version as the source of truth.
- Step 2 — Automatic classification — an AI safety classifier reads the article and returns either "green" (uncontroversial — science, technology, business, sports, entertainment, culture, health, lifestyle) or "flagged" (partisan politics, elections, war or conflict, graphic violence, hate speech, misinformation, or anything likely to read as controversial or divisive to a general audience).
- If green — the article goes live in English immediately, and is also translated and published into any locales you listed in target_locales.
- If flagged — the article is created but stays unpublished. The tool call returns the classifier's reasoning. Nothing you can pass to draft_news forces it live from here — there is no override flag.
- Step 3 — Revise and resubmit (optional) — call resubmit_news with the same news_id and a revised title/body. This runs a brand-new classification against the revision and is logged as its own attempt, separate from the original. If the revision is now green, it publishes; if still flagged, it stays unpublished and can be resubmitted again.
- Ownership — only the account whose api_key originally called draft_news for a given article may call resubmit_news on it. A different (even valid) api_key is rejected.
- Languages are opt-in — omitting target_locales publishes English only. Pass the 2-letter locale codes you want (e.g. ["de", "ru"]) to also translate and publish into those languages in the same call.
Why this can't be skipped
The classification gate exists so anyone can use draft_news without a human needing to pre-approve every article — it's what makes an open, unauthenticated-content publishing tool safe to leave public.
target_locales vs. submit_news_translation
target_locales on draft_news/resubmit_news asks Datronis's own server to translate the article for you. submit_news_translation is the opposite: you (the calling AI) write the translated title/body yourself and publish it directly — no server-side translation call happens at all. Use get_missing_news_translations first to find articles that genuinely need a given locale.
Authenticated Tools — Personal Access Tokens
apply_to_job, list_my_resumes, and get_my_applications act on your Datronis account, so they need to know who you are. Generate a personal access token from your account settings, then pass it as the api_key argument on any of these tool calls.
- Step 1 — Go to
/app/api-keys/while logged in and click "New Key". - Step 2 — Copy the generated key (starts with
dtk_) — it's shown only once. - Step 3 — Pass it as
api_keyin your prompt or tool call, e.g. "apply to job X using api_key dtk_...". - Revoking — Revoke a key anytime from the same page; it stops working immediately.
One key, every capability
The same personal access token also works with the Datronis Converter API (/api/v1/convert) — you don't need a separate key for MCP tool calls.
admin_create_news / admin_edit_news need an admin account
These two tools check the token owner's account role, not just whether the token is valid. A regular account's token is rejected with "Admin access required" even though it works fine for every other tool. There is no separate admin-specific token type — it's the same personal access token, just checked against the account it belongs to.
Resources
The MCP server also exposes a readable resource — the platform overview documentation — which AI assistants can read to understand the platform before calling tools:
platform://docs/overviewHow Sessions Work
The server uses the Streamable HTTP transport (MCP spec 2025-03-26):
- Step 1 — Client sends
POST /api/mcpwith aninitializemessage (no session ID header). - Step 2 — Server creates a session and returns the
Mcp-Session-Idheader. - Step 3 — All subsequent tool calls include the
Mcp-Session-Idheader. - Step 4 — Client can open a
GET /api/mcpSSE stream for server-initiated notifications. - Step 5 — Client sends
DELETE /api/mcpto close the session when done. - Auto-expiry — Sessions auto-expire after 30 minutes of inactivity.
# Step 1: Initialize a session
curl -X POST https://api.datronis.com/api/mcp \
-H "Content-Type: application/json" \
-D - \
-d '{"jsonrpc":"2.0","method":"initialize","id":1,"params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}'
# Note the Mcp-Session-Id in the response headers, then:
# Step 2: List available tools
curl -X POST https://api.datronis.com/api/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: <your-session-id>" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":2}'
# Step 3: Call search_jobs
curl -X POST https://api.datronis.com/api/mcp \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: <your-session-id>" \
-d '{"jsonrpc":"2.0","method":"tools/call","id":3,"params":{"name":"search_jobs","arguments":{"q":"React","remote_type":"REMOTE","limit":5}}}'Locale Reference
The locale parameter in get_news and get_categories accepts a number from 1–24. draft_news/resubmit_news use 2-letter codes instead (e.g. "de", "ru") in target_locales — the same codes shown in this table.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
1 | English (en) | No | — | Default |
2 | Persian / Farsi (fa) | No | — | RTL |
3 | Spanish (es) | No | — | |
4 | German (de) | No | — | |
5 | Chinese (zh) | No | — | |
6 | Russian (ru) | No | — | |
7 | French (fr) | No | — | |
8 | Arabic (ar) | No | — | RTL |
9 | Hebrew (he) | No | — | RTL |
10 | Japanese (ja) | No | — | |
11 | Turkish (tr) | No | — | |
12 | Italian (it) | No | — | |
13 | Korean (ko) | No | — | |
14 | Portuguese (pt) | No | — | |
15 | Georgian (ka) | No | — | |
16 | Armenian (hy) | No | — | |
17 | Indonesian (id) | No | — | |
18 | Kazakh (kk) | No | — | |
19 | Finnish (fi) | No | — | |
20 | Norwegian Bokmål (nb) | No | — | |
21 | Dutch (nl) | No | — | |
22 | Polish (pl) | No | — | |
23 | Swedish (sv) | No | — | |
24 | Danish (da) | No | — |
Example AI Prompts
Once connected, try these natural language prompts in any MCP-aware AI:
- "Find remote senior React developer jobs in Europe"
- "What are the latest tech news articles in English?"
- "Search for fintech companies actively hiring in London"
- "How many jobs and companies are on the platform?"
- "Get the job details for slug 'senior-frontend-engineer-acme-corp'"
- "List all available news categories"
- "Apply to the senior-frontend-engineer-acme-corp job using my Datronis account (api_key dtk_...)"
- "List my resumes on Datronis and tell me which one is my default"
- "Check the status of my job applications on Datronis"
- "Draft a news article on Datronis about [topic] and publish it in English and German (api_key dtk_...)"
- "My last draft_news call was flagged — here's a revised, neutral version, resubmit it under news_id 123"
- "Which published articles on Datronis are still missing a Finnish translation?"
- "Translate news_id 101 into Finnish and publish it using my api_key"