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 one of the most capable public MCP servers in the job-search space: any MCP-compatible AI can search real jobs, browse news, explore companies, and query live platform stats for free — and, with a personal access token, build or update a full resume from nothing but a conversation, submit job applications, and check application status, all on your behalf and 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
ქვემოთ მოცემული პირველი 6 ხელსაწყო საჯაროა (API გასაღები არ სჭირდება) — AI-ს შეუძლია ავტომატურად გამოიძახოს ისინი თქვენი მოთხოვნის საფუძველზე. დარჩენილ 5-ს სჭირდება პერსონალური წვდომის ტოკენი (იხილეთ შემდეგი განყოფილება), რადგან ისინი მოქმედებენ თქვენს ანგარიშზე: განაცხადების გაგზავნა, თქვენი რეზიუმეების წაკითხვა, განაცხადების ისტორიის შემოწმება და ახალი ამბების სტატიების მომზადება ან რედაქტირება.
| 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 (including their full content), so an AI agent can show you which one will be used to apply, let you pick a different one, or read the current content before updating it. |
create_resume | tool "api_key (required)""title""locale""is_default""name""headline""summary""location""contact""experiences""education""skills""projects""certificates""customSections" | Yes | — | Create a resume by giving your AI agent its content directly — name, headline, summary, contact info, work experience, education, skills, projects, certificates. No manual form-filling: describe your background in chat and the agent builds the resume for you. Skips layout/styling entirely; Datronis applies sensible defaults, which you can still adjust afterward in the human builder at /app/resume-builder/. |
update_resume | tool "api_key (required)""resume_id (required)""title""locale""status""is_default""full_replace""name""headline""summary""location""contact""experiences""education""skills""projects""certificates""customSections" | Yes | — | მოამზადეთ და გამოაქვეყნეთ ახალი ამბების სტატია. ღიაა ნებისმიერი ანგარიშისთვის — ტოკენი განკუთვნილია სიხშირის შეზღუდვისა და აუდიტის კვალის, არა ნებართვის კარიბჭის, მიზნით. ყოველთვის მზადდება ჯერ ინგლისურად; ავტომატურმა უსაფრთხოების კლასიფიკატორმა უნდა დააბრუნოს „green“, სანამ სტატია გამოქვეყნდება (იხილეთ ქვემოთ „კონტენტის უსაფრთხოება და გამოქვეყნების პოლიტიკა“). აქვეყნებს მხოლოდ ინგლისურად, თუ არ არის მითითებული target_locales. |
get_my_applications | tool "api_key (required)""page""limit" | Yes | — | გადახედეთ და ხელახლა დაასაფრთხოვეთ სტატია, რომელიც draft_news-მა უარყო როგორც „flagged“. ყოველი მცდელობა ცალკე ფიქსირდება — არასდროს არის ჩუმი სტატუსის ცვლილება. მხოლოდ ანგარიშს, რომელმაც თავდაპირველად წარადგინა სტატია, შეუძლია მისი ხელახლა წარდგენა. |
draft_news | tool "api_key (required)""title (required)""body (required)""content_format (html | markdown; default html)""category_id (optional)""target_locales (optional)" | Yes | — | Draft and publish a news article. Body may be rich HTML with classes and inline CSS, or Markdown rendered server-side. 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)""content_format (html | markdown; default html)""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)""content_format (html | markdown; default html)" | 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)""content_format (html | markdown; default html)""locale (required)""category_id (optional)""published (optional)""target_locales (optional)""translate_to_all (optional)" | Yes | — | Admin-only: publish a news article directly into any locale and optionally queue selected or all missing translations. Translation jobs are durable and continue after the MCP call returns. |
admin_edit_news | tool "api_key (required, admin)""news_id (required)""title (optional)""body (optional)""content_format (html | markdown; used when body is supplied)""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. |
admin_translate_news | tool "api_key (required, admin)""news_id (required)""target_locales (optional; omit for all missing)" | Yes | — | Admin-only: queue server-generated translations for selected missing locales, or omit target_locales to fill every missing language. Existing translations are skipped, and retries are idempotent. |
admin_get_news_translation_status | tool "api_key (required, admin)""news_id (required)" | Yes | — | Admin-only: check existing and missing locales plus QUEUED, PROCESSING, COMPLETED, or FAILED state for every translation task. complete=true means all 24 languages exist. |
კონტენტის უსაფრთხოება და გამოქვეყნების პოლიტიკა draft_news-სთვის
MCP-ის მეშვეობით ახალი ამბების გამოქვეყნება მიჰყვება ფიქსირებულ, გვერდის ავლის გარეშე პროცესს: მომზადება ინგლისურად, კლასიფიკაცია და მხოლოდ შემდეგ გადაწყვეტილება, გამოქვეყნდეს თუ არა და რომელ სხვა ენებზე.
- ნაბიჯი 1 — ინგლისური მონახაზი — draft_news ყოველთვის ჯერ ქმნის სტატიის ინგლისურ ვერსიას, მიუხედავად იმისა, საბოლოოდ რომელ ენებზე გსურთ მისი გამოქვეყნება. კლასიფიკაცია და ნებისმიერი მიმოხილვა ორივე ეყრდნობა ამ ინგლისურ ვერსიას, როგორც ჭეშმარიტების წყაროს.
- ნაბიჯი 2 — ავტომატური კლასიფიკაცია — AI უსაფრთხოების კლასიფიკატორი კითხულობს სტატიას და აბრუნებს ან „green“-ს (არაკამათურ — მეცნიერება, ტექნოლოგია, ბიზნესი, სპორტი, გართობა, კულტურა, ჯანმრთელობა, ცხოვრების წესი) ან „flagged“-ს (პარტიული პოლიტიკა, არჩევნები, ომი ან კონფლიქტი, გრაფიკული ძალადობა, სიძულვილის ენა, დეზინფორმაცია, ან ნებისმიერი რამ, რაც სავარაუდოდ ფართო აუდიტორიისთვის საკამათო ან განმხოლიანებელი ჩანს).
- თუ green-ია — სტატია მაშინვე ქვეყნდება ინგლისურად და ასევე ითარგმნება და ქვეყნდება ნებისმიერ ლოკალზე, რომელიც თქვენ ჩამოთვალეთ target_locales-ში.
- თუ flagged-ია — სტატია იქმნება, მაგრამ რჩება გამოუქვეყნებელი. ხელსაწყოს გამოძახება აბრუნებს კლასიფიკატორის დასაბუთებას. draft_news-ისთვის გადაცემული არაფერი აიძულებს მას გამოქვეყნებას აქედან — override დროშა არ არსებობს.
- ნაბიჯი 3 — გადახედვა და ხელახლა წარდგენა (არასავალდებულო) — გამოიძახეთ resubmit_news იმავე news_id-ით და შესწორებული სათაურით/ტექსტით. ეს იწვევს სრულიად ახალ კლასიფიკაციას შესწორებაზე და ფიქსირდება როგორც ცალკე მცდელობა, ორიგინალისგან დამოუკიდებელი. თუ შესწორება ახლა green-ია, ის ქვეყნდება; თუ ჯერ კიდევ flagged-ია, ის რჩება გამოუქვეყნებელი და შეიძლება ხელახლა წარდგენა.
- საკუთრება — მხოლოდ ის ანგარიში, რომლის api_key-მაც თავდაპირველად გამოიძახა draft_news მოცემული სტატიისთვის, შეუძლია მასზე resubmit_news-ის გამოძახება. განსხვავებული (თუნდაც ვალიდური) api_key უარყოფილია.
- ენები არჩევითია — target_locales-ის გამოტოვება აქვეყნებს მხოლოდ ინგლისურად. გადაეცით სასურველი 2-ასოიანი ენის კოდები (მაგ., ["de", "ru"]), რომ იმავე გამოძახებაში ასევე ითარგმნოს და გამოქვეყნდეს ამ ენებზე.
- Flexible authoring — set content_format to markdown for headings, tables, lists, links, images and code blocks, or html for rich HTML, classes and inline CSS. Markdown is converted to stable HTML on the backend before storage, translation and indexing.
რატომ არ შეიძლება ამის გამოტოვება
კლასიფიკაციის კარიბჭე არსებობს იმისთვის, რომ ნებისმიერს შეეძლოს draft_news-ის გამოყენება ისე, რომ ადამიანს არ დასჭირდეს ყოველი სტატიის წინასწარ დამტკიცება — სწორედ ეს ხდის ღია, არაავთენტიფიცირებული კონტენტის გამოქვეყნების ხელსაწყოს საჯაროდ დატოვებას უსაფრთხოს.
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, create_resume, update_resume, get_my_applications, draft_news, resubmit_news, submit_news_translation, and all admin_* tools act on your Datronis account, so they need to know who you are. Generate a personal access token from your account settings, then send it either as an Authorization: Bearer HTTP header (preferred) or as the api_key argument on the tool call.
Prefer the Authorization header over the api_key argument
If your MCP client lets you configure a header, use Authorization: Bearer <token> on every request instead of passing api_key as a tool argument. An argument has to be reproduced verbatim inside the JSON the calling AI generates for the tool call — which means it passes through the model's own context and shows up in conversation history, tool-call logs, and tracing. A header never does. This isn't theoretical: a real key was corrupted in exactly this way once — the model reconstructing the argument spliced an unrelated local file path into the middle of it. If a header isn't an option in your client, the argument still works (checked second, as a fallback), but treat any key that ever passed through it as more exposed and rotate it more readily.
- 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 (preferred) — Configure your MCP client to send
Authorization: Bearer dtk_...as an HTTP header on every request. - Step 3 (fallback) — If your client can't set custom headers, pass it as
api_keyin your prompt or tool call instead, e.g. "apply to job X using api_key dtk_...". - Revoking — Revoke a key anytime from the same page; it stops working immediately, regardless of which method was used to send it.
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.
All admin_* tools need an admin account
The four admin 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 for non-admin tools. There is no separate admin-specific token type — it is the same personal access token, checked against its account role.
ChatGPT production authentication
The api_key argument is useful for direct/developer-mode testing, but a published authenticated ChatGPT plugin should use the MCP OAuth 2.1 authorization flow. The Datronis token must not be pasted into ordinary prompts; configure authentication at the connection level whenever the client supports it.
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). Every request, including this first one, must sendAccept: application/json, text/event-stream— the server rejects anything else with406 Not Acceptable. - Step 2 — Server creates a session and returns the
Mcp-Session-Idheader. - Step 3 — Client sends a
notifications/initializedmessage (with theMcp-Session-Idheader) to confirm the handshake — the spec-correct next step, expected by well-behaved MCP clients even though this server doesn't currently enforce it. - Step 4 — All subsequent tool calls include the
Mcp-Session-Idheader. - Step 5 — Client can open a
GET /api/mcpSSE stream for server-initiated notifications. - Step 6 — Client sends
DELETE /api/mcpto close the session when done. - Auto-expiry — Sessions auto-expire after 30 minutes of inactivity.
Accept header is required
The server rejects any request that doesn't advertise support for both response formats with 406 Not Acceptable: Client must accept both application/json and text/event-stream. Every request below — not just the first — needs Accept: application/json, text/event-stream alongside Content-Type: application/json.
# Step 1: Initialize a session
curl -X POST https://api.datronis.com/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-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: Confirm initialization (expected: 202 Accepted, empty body)
curl -X POST https://api.datronis.com/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Mcp-Session-Id: <your-session-id>" \
-d '{"jsonrpc":"2.0","method":"notifications/initialized"}'
# Step 3: List available tools
curl -X POST https://api.datronis.com/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Mcp-Session-Id: <your-session-id>" \
-d '{"jsonrpc":"2.0","method":"tools/list","id":2}'
# Step 4: Call search_jobs
curl -X POST https://api.datronis.com/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-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
locale პარამეტრი get_news-სა და get_categories-ში იღებს რიცხვს 1-დან 24-მდე. draft_news/resubmit_news ამის ნაცვლად იყენებს 2-ასოიან კოდებს (მაგ., „de“, „ru“) target_locales-ში — იმავე კოდებს, რომლებიც ნაჩვენებია ამ ცხრილში.
| 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"
- "Build me a Datronis resume from my background: 4 years as a backend engineer at Acme (2021-present), B.Sc. Computer Science from TU Berlin, strong in Go and PostgreSQL (api_key dtk_...)"
- „მოამზადე ახალი ამბების სტატია Datronis-ზე [თემის] შესახებ და გამოაქვეყნე ინგლისურად და გერმანულად (api_key dtk_...)“
- „ჩემი ბოლო draft_news გამოძახება flagged იყო — აი შესწორებული, ნეიტრალური ვერსია, ხელახლა წარადგინე news_id 123-ის ქვეშ“
- "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"