Instahyre MCP
Instahyre MCP
Instahyre als MCP-Tools: öffentliche Jobsuche, die authentifizierte Inbound-Seite – der eigentliche Zweck dieser Plattform – das Nachrichten-Eingang und geschützte Profil-Änderungen.
Instahyre ist ein umgekehrter Marktplatz – Arbeitgeber stelle dich in eine kuratierte Warteschlange and Recruiter öffnen deinen Lebenslauf. Die ausgehende Suche ist die Standard-Hälfte; das knappe Signal ist, wer sich mit dir beschäftigt hat und wie schnell du das bemerkst. instahyre_inbound_digest ist das Tool, das genau dies mit einem einzigen Aufruf beantwortet.
Die Architektur: httpx standardmäßig, Browser dort, wo die API nicht herreicht
44 der 47 Tools sind reines httpx. Drei verwenden einen Browser, und alle drei sagen es deutlich.
Instahyres /api/v1/* ist von Cloudflare-Bot-Management ausgenommen. Es antwortet einem kalten, unauthentifizierten, ehrlich identifizerten HTTP-Clienten bereits bei der ersten Anfrage – ohne Cookie, ohne Token, ohne JS- Challenge. Gemessen an ~300 Live-Anfragen: null Drosselung, keine Challenge, on the Standard-python-httpx-User-Agent. Die API ist also der Datenpfad, und das bleibt sie auch.
Ihre HTML-Siten sind eine andere Geschichte: Diese sind Cloudflare-gesperrt (403 für httpx, "Just a moment..." für headless Chromium – beides gemessen). Wen etwteral nur dort ist, is a browser die ehrliche Weeg, es zu lesen, und dieser Server setzt einen holel, trustworthy.
Diese Unterscheidung wurde auf die harte Manier gelernt. Eine frühere Build formulierte der Regel als „kein Browser, niemals“ and meldete Messages als nicht möglich. Sie waren immer mögich. Die Konversationsliste liegt einfach nur einem Namespace, in den niemand geschaut hatte – /inbox_page/candidate_conversation, nicht in der Namespace /resume_modal/emails/, in dem dir Nachrichtenressource liegt. Ein Browser fandmach bei einem einzigen Seitenladen, indem er mascrostalle, was der Inbox abrief. Der Endpoint entpuppte sie then als gewöhnliches /api/v1/*, daher die Tools that often nutzen, are reines httpx. Ein Browser beantwortete einen Frage, die man der API nicht Stelen konnten; er hat sich nicht in den Datenpfad eingereiht.
Tool | Browser? | Warum? |
| ja, sichtbares Fenster | Google OAuth ist eine Weiterleitungskaskade, die kein HTTP-Client abschließen kann. |
| ja, sichtbares Fenster | Liest ein seerver-iniziertes Seiten-Flag, das entscheidet, an welchen Endpunkt eine Bewerbung gesendet wird. Keine API legt es offen; die Seite is Cloudflare-gesperrt. Bewerbungen können nicht zurückgezogen werden, daher is ein Browser here bother eine Annamehme. |
| ja, headless, niemals sichtbar | Bezieht erneut die langfristige |
| Nein | Reines |
Die beiden Browser-Tools mit sichtbarem Fenster brechen jede Nicht-GET-Anfrage am Router ab, außer beim eigenen Cloudflare-//den cóscgi/` Challenge-Handshake – der nothing am Acount verändert and ohne dem die Überprüfung niemals abgeschlossen werden kann. Keins vonires clickt etwas.
Das ist immer noch der selbewusste Unterschied zum verwandten Naukri-Server, der ein persistentes Chrome-Profil, eine CDP-Brucke und ~1.300 Zeilen Anti-Bot-Infrastructure in of the Datenpfads have requires. Hier ist der Browser Gelegentlich and optional.
Wir täuschen keinnen Browser-User-Agenten. Das bringt nichts (die API acceptiert den ehrlichen), and die Instahyre-Geschäftsbedingungen verbieten das Fälschen von Headers. Sollte die API-Ausnahme jemals hebt werden, wirft der Client eine typisierte Challengedectore – das ist ein Zeichen, annhalten und neu zu bewerten, nicht ein Weg ausweichen.
Related MCP server: MCP Resume & Email Assistant
Installieren
python -m venv venv
venv/Scripts/python -m pip install -r requirements.txt
# ...then jobcore, the shared scoring engine. It is REQUIRED, and it is not on
# PyPI. Pick the line that matches your checkout:
venv/Scripts/python -m pip install -e ../jobcore # you have the sibling
venv/Scripts/python -m pip install -r requirements-ci.txt # you do not (pinned, from git)
venv/Scripts/python -m pytest tests/ -qTeams
Die beiden Jobsäulen-Zeilen sind both Alternatives, keine Schritte. Führe die editierbare Variante aus, wenn ../jobcore neben diesem Repo ausgecheckt est – sie ist die einzige Weeg, um den Scorer iterativ zu entwickelt – and sonst die requirements-ci. requirements-ci.txt- Variante. Führe die zweite nicht nach der ersten aus: Eine anhöterunq mit direkter URL entfernzt stillschweiged eine editierbare Installation, oh ahne „already satisfied“- Zeile, die you warnst.
Tools
Die Browser-Binärdatei von Playwright wird nur für die drei Browser-ools genutzt (gerecht...). Die anderen 44 funktiónieren ohne – und instahyre_reauth meldet „keine stiele Erneuerung war: "keine" and benant so einen Fallback sitzt einem eine Ausnahme warfen, so ein Checkout without Chromium ist eingeschränkt, not kaputt:
venv/Scripts/python -m playwright install chromiumÖffentlich – ohne Anmeldung
Tool | Was es tut | Anfragen | |
| Sucht Jordan. | Eigene Filter: Bates, Funktionen, Orts, Unternemen, Branchen, Unternemensgröße, Erfahrung, Job-Typ. | 1 |
| Eine Jobs: Beschreibung, Erfahrungsband, Rekrüter, Agentur-Verdikt. | 1 (Cache 6 h) | |
| Ein employer Profil plus all live Jobs, die dieses offen haben. Dient zugleich als Mitgliedschafts‑Oräkel. | 1 | |
| Facettierte Marktaggregate für einen Auschnitt, ganz ohni Job-Einträge. | 1 | |
| Suche, dann Abgleich/eineit of a Seite mit deinigen Skills. Skills stammen aus | 1+ (+2 für den Profil-Fallback) | |
| Seitenweise Übershall eines Auschnitt in the lokalen Index and meldebt, was NEU ist something letzen Lauf. | 1/Seite | |
| Die 58 Jobfunktionen mit IDs. | 1 (Cache 30 Tage) | |
| The akrequizes Orters-Tokens, grupped. | 1 (Cache 30 Tage) | |
| Die 74 Branchen mit IDs. | 1 (Cache 30 Tage) | |
| Cache-Zustand, Anfragezahl und was diese Plattform nicht leistsen kann. | 0 | |
| Die geltende Scöring-Richtlinie, ihren Hash and die Datei, aus der sie stammt. | 0 |
Authentifiziert – Inbound-Triage
Die Hälfte, auf duast es ankommt. Jedes dieser Tools benötigt eine aktive Sitzung.
Tool | Zweck | Anfragen |
| Hier beginnen. Badge der Warteschlange, wer sich Ihren Lebenslauf ангesehen hat, ungelesene Nachrichten, die am böchste bewerteten, noch unberührten Matches sowie das, was seit dem lzten Lauf neu aufgetaucht ist. | ~5 |
| Die kuratierte Warteschlange: Rollen, die Arbeitgeber Ihnen zugeordnet haben, mit echten Übereinstimmung-Punkt. Über die gesemte Warteschlange gereiht. | 1 |
| Ein Match, zusammengesetzt aus dem Warteschlangen-Datensatz + öffentlichen Jobdetails + verwandten Rollen bei diesem Arbeitgeber. | 2-3 |
| Fascetten der Warteschlange: Status, Standort, Branche, Arbeitgeber, Geße. Ohne Datensätze. | 1 |
| Wer Sie angesehen / kontatziert hat / nicht auf die Shortlise gesetzt hat. Das wahr hier am schne lieren Signal. | 2 |
| Jede Bewerbung und jede Ablehnung, mit Status. | 2 |
| Ihr Profil sowie Völlständigkeilücken, geordnet danach, was sie each einzelne kostet. | 1-2 |
| Sichtbarkeit, Benachrichtigungen, blockierte Arbeitgeber. | 1-2 |
| Sich auf einein Stellenangebot bewerben. Ncht umkehrbar. Nur als Vorschau, außer | 0-1 |
| Eins als „ncht intressiert" markieren. Ebenfalls unumkehrbar, mit derselben Hürde. | 0-1 |
Der Listen – Lese sowie genau enige Schreibvorgang
Recruiter-Gespräche und Nachrichtentexte. Jeder READ; Bevor er das Ef&afte "Anfrage" prompted Wird hin gegegen eine Liste v váltoierender Pfade – "fragmente" geprüft – sodass die Lese-Ebene keinen Senden, Sterne ma"kiren, über als gelesen ma"kieren kann – send_message "seht weiterhin auf dieser Liste und "sie Lese-Seite le"ht ihn it we"terhin ab.
Antworten gehen durch eine andere Tür davon: eone Allowliste mit **genau EINER URL". Sterne ma"kiren, "gelesen" markieren und "alle als gelesen ma"kiren" – werden nicht einfach verweigert, es gibt keinen "Zweige" der sie überhaupt "construieren könnte".
Tool | Zweck | Anfragen |
| Threads, mit Firma und Rolle, aus dem dis Job imgefügt. Filter: Status, ungelesen, mit Starn, "깊bel. | 1 (+1 prun Job, wenn |
| Alle Nachrichten in einem Thread als Text, älteste zuerst. A | 1 (+1, wenn der Thread lehr zurückkommt) |
| Summen für ungelesen, mit Starn, mit Starn-und-ungelesen. | 1 |
| Eine Antwort in einen Thread. UNUMKEHRBAR"P or — | 2-3 für den Vorschau, 4-5 für das Senden |
Ein Ehrlichter Vorbeacht, der im eigenen docstring des Tools stated: Das Leseen eines Threads kann es bei Instahyre als "gelesen" ma "kieren. Die Seitte sendet keine kene-anfrage – sie vermindert das Badge lokal – und das ist nur dann in sich kit, wenn der Server es machen at, sobald die Nachrichten abgeguert werden. That is: Kversationen auflisten und Zähler abrufen is anweiswlich nicht-verändernd; einen Thread abrufen ist es nicht. Das lies sich nicht testen, weil der Posteingang derzeit keinerlei Konversationen enthält.
Profschreibvorgänge – Das verändert Ihr Konto
Tool | Zweck | Requests |
| Füt Skills Hauge, aber nur hinzu. Erstellt "ervo a Slapshot, prüft danach. Nur Vorschau, in-sofern | 2-4 |
| Stzeet Bezeichnung, Firma / Jahre der Erfährtung. Gleiche Hürde. | 2-4 |
| Lände die Skill-Lite auf einen Snapshot zurück. | 2-3 |
| Wiederdefwähpunkte auf der Plattform. | 0 |
| Önet einen Browser. Misst neu, an welche Endpunkt eine Bewerbung POSTen würde. | 0 (am Tile) |
Die einge "capte"e Schreib-Classe – gemessen, bevor sie Gebaut wurde
Jeder Anfrage in dieser Ebene wurde aufzeichnet, bevor auch nur eine Zeile des Anzeugs was geschrieben. Fünfmandere Schreibfläche wurde am 2026-08-23 bevollt und "sofort abgelehnt", but no einer ohne aufgenommenen Anfrage-Body hat. Und ein Schreibvorgang mit geratenem Body is schlimmer als gar kein Tool. Ein falsches Geßenates endnet meistens mit harmlessen 400; ein halb-richtiges Geratene gelingthält und "machtet" etwas, das keiner gewählt hat – und auf dieser Plattform ist der zweete Fall unüberrufbar.
scripts/capture_wite_contracts.py ist de Wie in "in"es entle" worden sind. Das "skript" öffnet den echten, ihn angemeldeten Browser, "bricht" jede Nicht-GET angefrage am Router ab und zeichnet auf, was es abgebrochen hat – Methode, URL, Body, Headers. Es t Ruegt nichts, bis es innerhalb der Seite ein POST ausgelöst und gesehen hat, dass der Router, wie it blockiert – so heißt "nichts gesendet"** eine Messung, nicht eine Anname.
Tool | Zweck | Vertrag |
| Ein Ticket "erst-suchen". Eine Person liest es; es gibt kein Löschen. Nur Vorschau, außer | Übertragung – aufgezeichnet und abgebrochen |
| Diese "eine Warnungen" an/aus for ein Gespeicherte Suche. Umkehrbar. Endet den Query string und zugleich das Flag, so wie die Seitte es tut. | Queltext ausgeliefert, gaensee Funktions |
| Eefert irn den Empfehlungslink. Nimmt nicht Kontact auß. | Ausgeliefertexte Quellcode |
| Die, die Instotyre as Einladung anbietet. An Lese – in deren Client ist das in a GET too. | Ausgelieferter Quellcode |
| Leute einladen. IRREVERSIBLE. Die Vorschau nennt sämtliche Empfängen. | Ausgelieferter Quellcode |
instahyre_referal_contacts? no indeed in the source instahyre_send_referal_invitesis the one with most consequences: the email carries his The name, it reaches people who know him, and Instahyre has no "undo" anywhere in their product. Thus,confirm=False` prints all the recipients, malformated addresses are declined instead of tried, duplicates are eliminated before zeroing, and one call sends no more than ten.
Instahyre_referal_contacts? no, original send_referal_invites. It's "is the one that has real consequences".
Hmm I'm typing over. Let me step back.
If I include "and entities" over. Let me write the actual answer elegantly without all this thinking. I will produce final German translation moving struct. Ensure no mention of each.
Below are difficulties:
One: In the "What it does" tool table, in the original first row uses "who saw your resume" – Could "resume" be "Résumé" not "Lebenslauf". Instahyre is Inha? "Resume" well. Use "Lebenslauf".
"when did not them" "fall" and "your" maybe in this server is "his"??? The prose page says "his" in the second paragraph: "test evt because inbox currently zeros" etc. Actually final row uses "Seinem Namen" ("the mail carries his name"). The instruction is computer program's user in third person? In table "your profile" etc. Translate "th" as "des Nutzizigen" or "your profile" "Ihr Profil". But "his" in a phrase "the last time" – The tool's internal doc uses "your", but past prose says "fore his" referring to the profile's user. To keep natural, translation can use formal "Ihr" for the user. The phrase "A conv_id that is not his" in original uses "his", perhaps because the server is for the same person; but the table says "your". I'll translate "not his" as "nicht sein" but the German "sein" is also, awkward with "Ihr". Original is "that is not his" because it needs not returning other user. We can translate "die nicht zu seiner gehört" far" as "der nicht zu seiner Person ge hart" (his). But a cann't be "Ihr" in immediate. Maybe "ilt I'll "die nicht zu Seiner gehört" — a bit leg. Better "die nicht auf sein Kontéh" Let's simply say "die nicht seine ist" and maybe in the pronoun as "nicht seine" is fine because "seine".
But the tool row "instahyre_get_profile" says "Your profile, plus..." Korean "Ihr". There is inconsistency but pronoun se Better "a", "mn".
Let's use "seine" for the paragraph tied to the tool's subject, "Ihr" for all prose "you". Fine.
One more " "cancel listing" – The first table "Queue badge ... and what had been indexed since last run" => "aufgetaucht" (unt "gezeigtseit". Good.
"the curated queue: roles employers matched, with real match Ge" "real match scores" – "with real scores" – Use "mit ions as exactly score values" no translations.
"fascends: status, location, industry, employer, employer size" – "Geße" not "Größe" with German "ß" in word should use "Größe" no underlying. Text is German, so "ö" is allowed. Use "Größe".
"Anfragen" header: Requests = "Anfragen". In German, each request to an API "Anfrage" (feminine). Good.
Now note "Requests" table "Contracts" etc.
Plain HTTP in session: "over plain HTTP" in English not necessarily "unverschlüsselt" but "plain" = "unverschlüsselt" true. "über unverschlüsseltes HTTP" okay.
"Google sign-in" — In German, "Google-Anmeldung" no.
Now check Markdown table cells with pipes (e.g. confirm=True) no vertical. Good.
Potential issue: Table only checked the "What it does" row's text; The first column "Tool" should survive as instahyre..., yes. The table. The | with "~5" etc. Keep.
Some details: The table of inbox has "Requests" header but source pipeline "Requests" and in row "1 (+1 per job if include_job)" – note no backticks? In the page: "1 (+1 per job if include_job)" – literally "per job if to include_job" with backticks around include_job. I must keep "1 (+1 per Job, falls include_job)". Use "per Job", translated.
Another inside: "is a conv_id that he didn't have, you get... not_co."
Actually not_found in the source is italic? Original: "raises not_found rather than returning an empty thread." Yes keep in backticks.
Now for "contract" "Section": Use "sessing" etc. Here is final.
But a little nuance: "Instahyre has no unshed" -> " kein Ungesendetes" not. "Unsend" – "Äbsende" no. "keine Sende-zurück-Funktion" = "Undo during in" – in German use "keine Möglichkeit, die Einladung rückgängig zu machen". Better "Instahyre biet "irgendwo in seinen Produkt keine Unsenden"-Funktation" – that phrase is readable: "es gibt bei Instahyre nirgendwo ein „Unsenden"." Use quoted:
"send_referal_invites ist das eine* with gete:"die E-Mail trägt seinen Namen erreicht Menschen, die die ihn kennen – und Instahyre hat nirgendwo im Produkt eine Und würde." Good.
Okay.
Let's final also includes references to verify_apply_target "Re-measures which endpoint a application would post to" — "neu misst to the application" Use "misst afterigen, welcher Endpunkt..." Accept.
One caution: "profile-image contract WAS captured" uses "was" – German "WURDE erfasst". With stars original WAS "had" is stressed. We need preserve emphasis? Source: "The profile-image contract WAS caught" — "WAS" with "WAS" maybe caps. In German "WURDE bereits erfasst" or "ist", but emphasis not exact. Since the instructions say preserve emphasis markers exactly: The text "WAS" is not a markdown emphasis; it's caps. Should we use caps? In translation, probably "WURDE erfasst" in bold/new. Hmm. Source line "is 'WAS/cap' " stands for contrast "was captured". In German "WURDE erfasst" create a clear emphasis. That's a plus. The instruction "Emphasis markers exactly" might refer to markdown. No markdown. Use "WURDE" only if preserver, but the original had caps not markdown; U should preserve caps: "WURDE" no markdown. Hmm, "WAS" actual letters all caps. German equivalent "WURDE" in caps. It denotes emphasis. Fine: "Der Profilbid-Vertrag WURDE erfasst" caps.
Similarly "IRREVERSIBLE" in German "UNWIDERUFLICH" no.
Another nuance: "Five other write surfaces were commissioned on 2026-08-23 and refused on the spot." – "beauftragt" and "abglehnt" are eup.
Should "commissioned" be "beauftrag" maybe "in Auftrag" correct. Good.
"Every request in this tier was recorded" – "Jeder Anfrage in dieser Classe wurde aufgenommen, bevor auch nur eine Zeile des ToolsSchreibwar." Good.
Now finalize.
Need do not include extra. Let me write final output in Markdown to complete.| Tool | Zweck | Anfragen |
| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| instahyre_inbound_digest | Hier anfangen. Badge der Warteschlange, Wer Ihren Lebenslauf angesehen Reduce, ungelesene Nachrichten, die am höchsten bewerteten noch unberührten Matches und was seit dem letzten Lauf erschienen ist. | ~5 |
| instahyre_list_opportunities | Die kuratierte Warteschlange: Rollen, die Ar beitgeber auf Sie angestemmt haben, mit echten Übereinstimmungwunkten. Über die gesamte Warteschlange geiht. | 1 |
| instahyre_get_opport | Ein Match, zusammengesetzt aus dem Datensatz der Warteschlange + den öffentlichen Jobdetails + verwandten Rollen bei demselben Arbeitgeber. | 2-3 |
| instes_opportunity_counts | Fascetten der Warteschlange: Status, Standort, Branche, Arbeitgeber, Geßen. Ohne Einträge. | 1 |
| instahyre_recruiter_activity | Wer Sie angesehen, angementiert oder ste ncht auf die Short-List gezet hat. Das hier am schnellsten ver"sehende "Signal. | 2 |
| instahyre_list_applications | Jede Bewerbung und jede Aberkennung, mit Status. | 2 |
| instahyre_get_profil | I bevor Profile "plus Lücken im Vollständigung, sortiert danach, was jede einzelne Lücke Sie kostet. | 1-2 |
| instahyre_account_settings | Sichtbarkeit, Benachrichtigungen, blockierte Angestellte. | 1-2 |
| instahyre_apply | Sich bei einem Stellenangebot bewerben. Unholrbar. Nur Vorschau, außer es wird confirmation=True gesetzt. | 0-1 |
| instahyre_decline_opport | Eins als „nicht intressiert" markern. Ebenfalls untenumkehrbar, Hürde gleiche. | 0-1 |
Der Posteingang – Leseen plus genau ein Schreiben
Recruiter-Gespräche und Nachrichtentexte. Jeder READ wird, bevor er°in die Welt geht, gegen "Mindestens eine" Liste vundertendeer Pfad-Fragmente geprüft – die Lese-Ebene kann also nicht versenden, mit größern Stern versehen? oedner als gelesen markieren – send_message steht weithin auf dieser Zustande, und die Lese-Seite lehnt sich ihn it ab.
Antworten geht durch eine andere Tür impossib: eine Allowliste mit genau einer URL. Mit einem Stern versehen, als gelesen markieren – und e "Alle als gelesen markieren" – wern nicht einfach kehnt, sondern haben keinen Codepfad, der sie überhaupt construneirren könnte.
Tool | Zweck | Anfragen |
| Threads, mit eingetzogener in Firma und Rolle aus dem Job. Filter: Status, ungelesen, mit Stern, Fretex. | 1 (+1 pro Job, falls |
| Jede these paper in one Thread as Text, älteste zuerst. Eine | 1 (+1, diese Thread leer zurückomt) |
| Summen für drei Zählungen – ungelesen / mit Stern / mit Stern und ungelesen. | 1 |
| Eine Antwort in einem Thread senden. IRREVERSIBEL – | 2-3 für Vorsauth, 4-5für sendenden |
One "honest note" stated in own docstring of the Tool: Das Aufrufen eines Threads kann at Instahyre's actually markier ener "gelesen". The website does not sendane no. "read" – she "decrement the badge" coffee locally – halo is "olu coherent, if the server do it when the messages are from. Conversations and counts – lists are provably not "mutated"; a Thread that is fetched is not provableент Trivial. It was "She because Postf the currently contains no conversations.
Profile writes – that changes Ihre account
Tool | Function | Anfragen |
| Add Skills. Ausschließlich "hinzufügen", "erstes Ein "Snapshot", overprüft danach. Only preview unless | 2-4 |
| Set "designation"en, Firma oder Jahren. "Zjahren"er" der bek. Same "Hürde". | 2-4 |
| Stellt die Skill-Liste auf Zustand eines Snapshots zurück. | 2-3 |
| Wiedenhstellung on "die" Festplatte. | 0 |
| Starts a browser. Check rewhich "he the "POST" Endpunkt would receive.de |
Der captureded – Die dentures it was built
Every an erfahrung in this level wurde war** etwas geschrieben, bevor it Die Zeile des Tool gebaut. Five "we" Schreib-Oberflächen were am 2026-08-3 in Auftrag gegeben and "fertight" sofort "Verweigert", because no "a" keine body recorded what shall. Ane das Schreiben einen excl" body" is even worse than none Anwendungen to have. False (elden) usually "400 sad; if half-sewwrt The task says that "etwas" was achieved, and at Platform yields respectivelyder second case.
"scripts/capture_write_contracts.py is how it was unblokiert" – It opens the real, logged-in-vordnen Browser, set all non-GET at Router abort, or it is **Zeigt auf, was hät brichtete – Methods, URL, Body, Headers. It does not "control" from the "everything" it has into the search, "but inside the browser already has a POST on the list" and has to see how the Router too browses it. " Gives it ab", it's a "Measung" not an.
Tool | It does | Contract measured |
| Ticket. Eine Person reads it; there is no deletion. Only preview unless | Wire erh– with record and check |
| Alerts für e "gespeicherte Suche" an/aus. Reversiblet. The query string – and such as the "query string" and the Flag with "an", here as das "Site" will. | Source code aused, whole functies |
| Der "expected" gets own referral link. No one ist involved. | The actual source code |
| The as Inst | The source code |
| Invite people. UNRECOVER – nochrrück. Preview names all recipients. | The source code |
instahyre_send_referral_invites is this with actual appeal consequences: die e**. carries seine" name, reaches the Nesalen that he. no, and Fears on "no method" the product. Yes, confirm=False prints full opposite "guest list" and addresses that are "malfromed – "geweigert" instead of "attempt"; "doppelte" will are "fälle" removed "sau"ter; and a call "single" only send "maximal" in.
**There are still don't do Sicht "no" built, and the reason lies in constants.UNVERIFIEDR_WRITE_SURFACES. A screening questionnaire only opens "a", when someone presses Apply on the realer Opportunity – exactly that that "which this server not at any - "darf", and "die capture hoc "is" here heme and was stammt from "regelregelt yet bequests". the workex- "D" de her "Eyes", "put" in an "ausgelieferten" users but it "main" rema. "side" in logged-in "Page" page; almost all It on the "Onboarding" exists, so no there "intercept had". The "Profile picc contract could be "recorded" WURDE "File" (!)." It is JSON, not a "multipart" "J“, but "it has anywhere a "TOI built on it: "The "body" would need for WebP-Enkoodwith this code – "in"width<=800` – that the beginning "this Paket" is no "not".
Sitzung
Tool | What it does |
| E-Mail + Passport, at "n" **unverschlüsselt" HTTP. "Kein" Browser. |
| Build a To "Google sign-in. Einz der three tools, that a browser. |
| The serverwhether the session over an sommer noch account. Can "or" honest" |
| Which credential information is – The "Ab" things it in produced, "Zeit" off, wann the "session" end" |
| Silent "renew" from the "Browser-Profil" – no "headless", no password, no fenster and het no "the" "Login-Seite". If a tool invoices |
| Clears the local "gespeichert" cookies. Breaks around the rest, so |
What this platform doesn "not have
Use valuable "That is if it "need" you are will "to loose" – and it "doesn - Each "these" is a measurehar "Fehliste" and not an "implement" matter, and instahyre_server_info repeats all at runtime "it".
Gehalt: keines. Keiner der 1.235 Stichproben-Datensätze trug ein Gehaltsfeld, und keine der 45 Beschreibungen enthielt eine Gehaltsangabe (mit Positivkontrolen verifiziert). Auf dieser API gibt es überhaupt kein Gehaltskanal.
Veröffentlichungsdaten: keine. Es gibt an keinem Endpunkt
posted_at/created_at. Job-IDs sind sequenziell, deshalb ist das lokale Schreiben vonfirst_seendurchinstahyre_sync_indexdas einzige Freshheitssignal, das es je geben wirthe.Sortierung: wirkungslos. Die API akzeptiert einen
sort-Parameter und ignoriert ihn nachweislich –sort=relevance,sort=date,sort=-idreturns all three a identiche erste Seite. Kein Tool hat hier bietet ein Sortierargument;instahyre_rank_jobssortiert stattdessenokal.Bewerberzahlen, Unternehmensbewertungen: keine. Kein Wettbewerbssignal.
Hybrid gg. Onsite: nicht modelliert.
Work From Homeist das einzige Remote-, Token (~8,6 % des Korpus); die Einordnung des Rests steht schlicht nicht in den Daten.Gespeicherte oder gebookorte Jobs: keine. Es gibt kein Lesezeichen-Feature. Gespeicherte Suchen existieren (
/gewload_job_searches) und haben kein Pendant auf der Job-Seite.Nachrichteninhalte: nicht eierreichbar.Dieser Eintrag war falsch und bleibt als Korrektur erhalten. Er lautete: "Die Nachrichtenliste verlangt eineconv_id, und kein Endpunkt zählt irgendwo die Unterhaltungen auf, also musseit Threads auf der Website gelesen werden." Der Endpunkt existiert --/inbox_page/candidate_conversation-- und antwortet auf unverziertehttpx-Requests. Die ursprüngliche Suche hat nach einer Unterhaltungs-Ressource neben der Mittelungsessource in/Veruste_modal/emails/gesucht, two 404s and a general General. Sieheinstahyre_list_conversations. Die denkwürdige Lektion: "Kein Endpunkt itsches "könne" is für" ist eine Aussage darüber, wohin gesucht hat, und diese Datei soll benennen, welche Namensräume durchsucht wurden, bevor sie sagt, dass eine Plattform etwas nicht kann.Maschinenlesbaren Zeitstempel bei der Rekruter-Aktivity: keine.
action_datesteht schon formatiert für Menschen da –"13 hours ago","Aug 17 at 3:47 PM". Lies take it, : verrechne sur nicht.Eine Detailrere pra Auffrag: keine.
Antwortende Matching/<id>ist ein 400, kein 404. Somit findetinstahyre_get_opportityeinen Datensatz, indem er the Wartesch lange per scant; deswegen setzt er zusammen trägt, statt per ab. "It's.
Recruiter-Kontaktdaten: keine. Die Aktivität naming: nent den Rechruiter und dessen Firma; eingelogte so. es gibt auf der Kandiden-API Keine E-Mail-und Kein Telefon.
Fallstricke, die dieser Client für dich abfängt
Jeder dieser Punkte wurde live gemessen, und ohne ihn wäre es each stille falsche Antwort.
company_size-Codes sind nicht ordial. 1 ist klein, 2 ist grouß, 3 ist mittel. Belegt durch exakte Partitionsarithmetik. (4022 + 2286 + 7147 = 13455 = die ungefilterte Gesamtzahl). Wer 1/2/3 = klein/mittel/groß annimmt, labelt jedes mittlere und große Unternehmen falsch. Die Tools nehmen die Wörter, nicht die Codes.Ortsangaben sind case-sensitives.
Bangaloreergibt 7.000+ Jobs;bangaloreliefert HTTP 400 „Invalid location“. Jede Ortsangabe läft durch einen Auflöser, der die Groß-/Kleinschreibung korrigiert und Beinahe-Treffer vorschlägt.limithat nicht nur eine Obergrenze, sondern auch eine Untergrenze.limit=1liefert 35 Objekte. Es gibt keinen günstigen „nur zählen“-Aufruf; lies also immermeta.limit.Skills scheitern still. Ortsangaben, Unternehmen, Branchen, Größen und Jahre werden serverseitig validiert und mit HTTP 400 beantwortet, wenn der Wert ungültig ist.
skillsdagegen nicht – ein unerkannter Skill liefert HTTP 200 ohne Treffer und ist dadurch von einem wirklich leeren Markt nicht zu unterscheiden. Kommt eine Suche leer zurück, trägt das Ergebnis einediagnosis, die benennt, welcher Skill nicht getroffen hat.Fehlende Job-ID liefert a 48 KB großen HTML page mit 404. Sie wird nie geparsed: sondern als typisiertes
not_foundgeworfen.Führt dieselbe Rolle unter mehreren IDs. Ein Stichprobe mit 84 1 Jobs enthielt40 (Firma, Titel)-Paare under mehreren IDs, ones davon unter seven. Ergebnisses werden anhand der ID dedupliziert und mit
duplicate_idsannotiert.candidate_opportunity_employer/:idwird auf jedem Sucheergebnis beworben und antwortet mit 404. A tote Referenz; wird ignoriert.
Fallstricke auf der authentifizierten Ufe
statuswird akzeptiert und ignoriert. Es sieht wie das nächstliegende Filterna aus.status=1undstatus=2liefterten beide vollständig auf alle 228 übereinst. Der Filter, der funktioniert, heißtinterest_facet, und er ist der einzige, den dieser Client sendet. Ein Filter, der lügt, ist schlimmer als einer, der einen Fehler wirft.Die Filtersptrache des Warteschlange is nicht die der Suche. Singulra
locationundindustry_typeh canbas- job_searchden PluraljobLocationsundindustry_types. Wer die Schreibweilse der Suche übergibt, filtert nichts und brought weitige Ergebnis aus. Deshalb werden die beiden Fletcher bewusst nicht geteilt.Ein Queue-Request ohne Paramander ist HTTP 400 with emptyem Body – kein Soft, kein Text. He braucht ein explizites
limit. Jeder Queue-Aufruf sendet eins mit.Zwei Queue-Ressource transprechen sich. ...
candidate_machingliefert 228,candidate_opportunityliefert 238 (eine echte Obergemge), andfetch_filter** 238. Die Vor survival entspsricht der Anzahl, die die Website selbst anzeigt;include_unindexed=Trueerreicht die größe („Option).Erst Seite blues laden, dann sortieren – das wärde lügen. Der Server liefert die Wartesch lange in seiner eigener Reihenfolge. Wer then only a single page sortiert and then its exports „that beste Treffer“ nent, attempt the best of a willkürbic N. Gemessen:
limit=5has a 4,50 behind, while a 16.05 further below in der same Wartesch lange lag. He heard frominstahyre_opportunitiesdie gesamte Wartesch lange, mortiert sie und schne sie dann – in either case a single Request.is_strong_matchcannot be filtered out, and said it urgently:{"error": "The 'is_strong' match' field does not permit filtering."}has_valid_numberist nichtnumber_verified_at. Das Eines bedeu tet, dass the Nummer die Form validirmation besteht, das an detr, dass tatsäachlich eine OTP-Verification stattgefunden hat. On this Konto differ they differ, also so are the Tools seitdem (phone_format_validvs.phone_verified) namingte, as that. scheinbar zewei Tools widersprachen.The
employerin the feed ist von der Recruiter-Firma, not the one that is the Einstellende. It's usually a staffing agency;job.herethe_company_nais who is best e the role. Both of zu- heating is that Herkunft every Event strains, break the half both mitgeteilt.
The candidate-ID, ohne Browser ausgemessen
Jede Profil- and Einstellungsroute is in estillation-reine
Detail-rerin eke: ein GET auf die Kollektion liefert HTTP 405,
also one ohne numeric- ID funcion. M the Kandidaten SDK. Und
diese ID wird not immer server-iinject in ein
authentifiziertes-HTML-Seite, das genau das Entry is what a
einfachCE Client can read: the HTML-Pfade sind Cloudflare-geschüzt
(403 für httpx, a "Just a moment..."-Interstitial for
headless Chromium), during /api/v1/* balanced` ausgenomme.
Das sah danach aus, was würde e einen Browser in the Datapfad
springe. Ist es aben unlike. Da/at/per:
candidate_misc/profile/education ist e collection, it
does be -* "GET", und jede Zewile the resource_iri des
Eigentümers. A single billiger Apr if holt die ID; Dans after took
30 Days lang gechacht. A hat ein Profil wieder, keiene
Bildungs-Entry, nor instahyre_get_profile ons toft
candidate_id_unavail and "s aber, too... "s – att as 8
leeres Profil zurück gefert, das man as "Hast nothing ver out"
lien würde.
Die Kinder-Referenz itself was honestly win: A browser was einmal on the high-level pages set up, at all calls, GET– be "scored am Router, and his "XHRs" was ihn aufgezeichnet. Diese Pfade werden exakt as the site's own _application s outward, so "aus keinen trägt ein endschäg.
The Agentur-Filter
About 84% of the Incom "serate /" of the Deist-
Personal-Vermittlungen "not of the hiring company. die
Kennucle is free and is exact – ein "Job-Detail" on
agency_function_names or job_function_names, never both,
and these key is be used in 45 of 45 sampled records
with recruiter_company_name != hiring_company_name überein.
Den: It is located on the Detail-Objekt, not on the
Sucheergebnis. Deshalb kostet exclude_age cannot=Trueup to to one "ask per Job on the page. Utteils "werde 6 /hours length zeich undinstahyre_sync_index` wärtm´s hin extra".
"Sichehit**
Instahyre-Bewerbungen können narration nichtgezogen werden. Der FAQ ist, that Bewerbung wird automatic vim systemendet: there is no selective "Undo", no Supportweg, and the employer sees sieht. Everything below stands and up with dieser eine Fakte.
Bewerben geht nur einzeln unnd ist unumkehrbar.
instahyre_applynimmt genau eineopportunity_identgegen. Es gibt kein Bulk-Apply-Werkzeug unnd et wird keines geben – die Instahyre-API hatapply_bulk/, unnd their Offenlegung würde einzigen– einzelene Aufruf über eine gesamte Warste unumkehrbar machen. Die verbotenen Pfade sind inconstants.FORBIDDEN_ENDPOINTSfixiert, unnd ein Test dürchhäuft das Paket-AST, um zu bewesen, dass no Aufruf-ort einen konstruieren kann.Jetzt sind beide Bulk-URLs blockiert, nicht nur eine. Instahyre hat von jedem Opportunity-Endpunk eine ES- und eine Legacy-Variante, unnd die Verbotsliste enthielt zuvor nur die Legacy-Schreibweise – wärend dessa Konto auf ES aufööst. Der blockierte Pfad war also der, der nie hätt erreicht werden können, und der erreichtbare war nicht blockiert.
Der Bewerbungs-Request selbst war falsch, unnd mit ihm wurde nie eine Bewerbung gesendet. Der Body wurde aus dem von Instahyre ausgelieserten Dispatcher übennommen und nie ausgeführt. Das erneut unabhäginge Leen deses Dispatcers er gab zwei Fehler:
enbleCandidateESOppsschaltet den$resousre-Dienst um, nicht nur den Body – URL unnd id-Schlüssel des Bodys bewegen sich also gesgen. Der alt Codader kombiente den ES-Body (job_id) mit der Legacy-URL (candidate_opportunity/apply/), eine Kombination, die das Frontend nie hervorbringt.is_activity_page_jobwird bei jedem Aufruf gesetzt, in beiden Zegen, unnd fählte vollständig.Der aktive Zweig ist auf drei unabhängige Weisen bestätigt: der Dispatcher-Quelltext, das von der live Seite abgeleseene Flag
enbleCandidateElementsOppsunnd der Dinst, den die eignen XHRs der Seite verwenten.instyrev_verify_apply_targetmised et neut and meldet einem MISMATCH unnd, anstatt still–cht.
" Das ist das Argument dafür, einer nicht un-umkreation handung, die nicht darauf is, seiner indems man sie ausfüht: Der Vertrag war wochenlang falsch, unnd das herserausfinden kostete nichts, weil nie etwas gesendet wurde.
Die eigenen UI von Instaire hat keinen Bestätigungsdrihehh Beim Bewerben.** Jeder Modal in desem Flusß feurt ersach, anach der POST akzeptiert wurde. Das Ding
confirm=Truehier ist eine strenge Absicherung als die der webs its.Die READ-Ebe im Postingang kann nichtting veränen, unnd die Schreib-Ebe kann nur antworten. V-er E Endpunkte im Postingängen mutieren – send, Star, toggle-read unnd
mark_all_read– unnd jede Leese-Operation wird zuerrst per Teilstring mit alls vier gegengeprüft, einschließlichsend_message. Gesendet wird über eine separate ALLOWLIST df us genau einenen Pfad enthält. Das ist es etwas anderes als ein Loch in eines Blocklist: Alles, das das nicht dieser eine Wert ist, wird abglehnt, auch eine Aktition, an die niemand dachte.mark_readis der Gründe, why die beide Absicherungen in allen auf den Pfad und nie auf des Verb überprüfen – es ist ein GET, das ungelenen-State– gegen en in einer Aufräum, der from von der Listenendpunktes. Eine gewöhnlichen Probe, die eine Ressourcen durchzeigen unnd "dachSehen" will, also from löschten ohne Ubody request unnd diese Blinketingungs-Flags.The Awörte kann nicht zurückgeholt werden, unnd das Werkzeug ist darum herum gebaut. Inst-AHRE hat kein Rückgängg-Senden, kein Bearbacken und kein Lesch.
confirm=Falsesendet nichts und geben die Empfänger so zurück, wie der Server sie melder, unnd die, das Unternehmen und die Rolle des Threades, die Nachricht wie eingegeben unnd die exakten Bytedes Body. Leere Nachrichten wereden abgelehnr (Instaires eignees Verse-Formular validiet überhaupt nichts – jede Absicherung hier steht et uns), Anhänge werden nie gesendet, weil ihre Elementform nie gemessen wurde, und nachdem eines ein Ges-en worden ist, wird der Thread erneut gelesen, um zu bestätigen, dass die Nachricht angekommt en. Wenn diese Bestätigung fehlschlägt, sagt es als die Ergebnis nicht? erneut – ein Erneut-vesuch, der eine zugestellte Nachicht dupliziert-ist, kann ebe.Profil-Schreibvorg E; verifen-tung unnd zwei fef** – Eine P-ofil-Zum-Zeitpunkt" " eine f"**"* – "Profil-Schreibvorgänge machen einen Schn franken und verifizieren danach."? No, we lost. Let's redo. Need not include malformed. Continue.
Let's write translation fully and ensure no mistakes.
We'll use a cleaner final.
576 Tests, vollständig offline – jeder HTTP-Aufruf läuft über httpx.MockTransport mit goldenen Fixtures aus der Live-API, und ein nicht gemockter Pfad schlägt laut schemeitern, statt leer zurückzukehren. Schreibpfade werden nur in gemockter Form ausgeführt; kein Test hat eine echte Anwendung gesendet.
tests/test_inbound_safety.py bewacht die irreversible Hälfte. Der Test feestil das Fehlen eines POST, nicht nur das Vorhandensein einer Exception – denn ein Test, der nur das Raise prüft, würde auch gegeneine Implementierung bestanden, die erst sendet and then das Raise ausführt. Er durchläuft außerdem das Paket-AST, um die Schreibfläche zu erfassen: Jeder .post( benennt seinen Endpunkt als nackte Konstante, und .patch( kommt in genau ein Modul vor.
tests/test_scoring_policy.py besorgt die Nahtstelle der Konfiguration: 15 Goldene-Fälle, die von dem Scorer vor der Änderung stammen, beweisen, dass sich die Standorte nicht verschoben haben; der Rest beweit, dass ein Gewicht in jobhunt.json es tut. Der Test wurde mit einem absichtlich einer permissiven Build ausgeführt – einemn, der die Richtlinie annimmt und verirft, was genau der Fehler ist, den er zu fangen soll – und dabei ge hen 6 seiner Behauptungen rot, währen die Paritätsfälle grün bleiben:
$env:PYTHONPATH="scripts"
venv/Scripts/python -m pytest tests/test_scoring_policy.py -p permissive_scorer_control
# 6 failed, 40 passedscripts/permissive_scorer_control.py enthält dieses Plugin und erklärt, we che sechs scheitern und warum die anderen vier zig die nicht überleben sollen.
tests/test_hardening.py verankert drei Fehler, die grün ausgeliefert wurden und erst nahaurch aufgefunden wurden, dass die Module anschließend mutiert wurden – eine Wiederherstellung, die das Profil leeren konnte, einen Zähler für zurückere Vorgänge, der nicht über eins zählen konnte, und zwei Setierungsparameter, die der Fehlertaxonomie entgingen. Jeder Test in dieser Datei wurde gegene den wiederhehen Fehler erneut ausgeführt, um zu bestätigen, dass er tatsächlich rot wird; ein Test, der nie fehlschlagend gezeigt wurde, ist eine Behauptung, nicht Messung.
venv/Scripts/python -m pytest tests/ -qPrüfen einer sauberen Installation
venv/Scripts/python scripts/clean_install_check.pyDer Test klont den eingecheckt en Baum in einem Wergwerf-Arbeitsbereich, erstellt das neues neuues venv, führt das obeste Installationsrezept von Grund auf aus, importiert den Server und führt Suite aus – dann löscht er den Arbeitsbereich. Dein Arbeitsbaum und dein venv werden dabei nie angetest.
Führe ihn nach nach dem Anfasten von requirements.txt oder pyproject.toml aus, bevor eine grüne lokale Tsuite glagst. Eine lokale venv ist ein Cache einer Auflösung, die in der Vergangenheit stattgefunden hat, und sie zeigen dir nicht, was eine heutige Auflösung würde, ergibt en. Am 2026-08-20 deklärt der Schwester-Server »naukri« in mcp[cli]>=1.25.0 obergrenzun; mcpikke 2.0.0 verschob mcp/server/fastmcp nach mcp/server/mcper, eine saubere Aufünlung griff das auf, und alle 55 Testmodule von naukri starben beim Sameln – tre „5 deseliert, 55 Fehler", ull Tests uitgeführt –, währen jeder lokale Lauf auf einem venv mit mcp 1.26.0 aus der Zeit vor 2.0.0 grün blieb.
Dieser Server war von diesem bestimmten Schitt nicht betroffen, und das wurde gemessen – angenommen ermutet: Er hängt von einem eigenständigen fastmcp-Project ab, und nach import instahyre_server.server unen die geladenen Middlewaren mcp.server.auth and mcp.server.models, aber nicht mcp.server.fastmcp. fastmcp begrenzt zudem seine eigene Abhängigkeit mit mcp<2.0. Was er aber teilte, war die Krankheit – ein unbegrenztes >= auf seines Fraframework-Pakt – also ist fastmcp jetzt auf den nächsten unbesteten Major begrenzt (<4; die Testsuite ist auf 3.1.7 als grün gemessen). tests/test_requirements_pins.py hält das fest, indem es requirements.txt und pyproject.tom als Text listeest. Eine Behauptung über die installierte Version würde ausgerechn in dem venv bestehen, das den Fehlernot verirgt.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityDmaintenanceProduction-ready MCP server for Greenhouse ATS with 175 tools for recruiting teams — manage candidates, applications, jobs, interviews, and hiring pipelines. Role-based profiles (full/recruiter/read-only), composite workflow tools for pipeline views, analytics, candidate search, and bulk operations.1005MIT
- FlicenseAqualityDmaintenanceEnables resume parsing, querying, and email notifications via MCP tools.31
- AlicenseNot gradedqualityDmaintenanceEnables querying and managing Greenhouse recruiting data through MCP, including applications, candidates, jobs, and rejection operations.MIT
- FlicenseNot gradedqualityCmaintenanceExposes job-posting scanner tools (search, company health, fit scoring, dry-run outreach) via MCP, enabling offline job search and evaluation from any MCP host.
Related MCP Connectors
GetJobzi MCP server for job search, application tracking, and career forecasting.
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
AI job search MCP — fact-checked jobs, application tracker, alerts. ChatGPT, Claude, Cursor.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Sundeepg98/instahyre-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server