Serveur MCP

remoet-mcp

io.github.remoet-labs/remoet-mcp

Ce que fait ce MCP

Searches and tracks technology jobs and companies, manages saved jobs and profiles, supports applications, and creates link-tree pages.

apply_to_job
Apply to Job
Apply to a job on behalf of the user, or get its application link. Two outcomes by job type: internal jobs (posted directly through Remoet's partner system) are applied to end-to-end and return the created application; scraped jobs (most of the platform) return applicationType "external" with the applicationUrl where the user applies on the company's site. Share that link with the user; Remoet cannot submit external applications for them. Applying to an internal job submits a real application in the user's name, so it needs the user's explicit consent. Internal jobs must be published and not expired, and the user can only apply once per job: duplicate applications are rejected.
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['jobId'], 'properties': {'jobId': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'The ID of the job to apply to'}}}
create_linktree
Create Link Tree
Create a link tree page: a shareable page with the user's links (social media, portfolio, GitHub, etc.). Each account can create up to 10. The slug becomes the public URL. Slug rules: 5-20 characters, lowercase letters, numbers, and hyphens only, cannot start/end with a hyphen. Must be unique. Use the user's name or handle as a base for the slug. The usual links are the ones on the user's profile (githubUrl, linkedinUrl, twitterUrl, url), which get_profile returns. Remoet tracks views and link clicks on each link tree, so a link tree URL on a CV or application shows whether a recruiter opened it.
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['slug', 'title', 'description', 'links'], 'properties': {'slug': {'type': 'string', 'maxLength': 20, 'description': 'URL slug (5-20 chars, lowercase, hyphens allowed, must be unique)'}, 'links': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'url'], 'properties': {'url': {'type': 'string', 'maxLength': 500, 'description': 'The URL'}, 'label': {'type': 'string', 'maxLength': 100, 'description': 'Display label (e.g. "GitHub", "LinkedIn", "Portfolio")'}}}, 'maxItems': 50, 'description': 'Array of links to display on the page (max 50)'}, 'title': {'type': 'string', 'maxLength': 200, 'description': 'Page title (e.g. "Carl Igelström: Links")'}, 'description': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Short description for the page'}}}
delete_linktree
Delete Link Tree
Delete a link tree page. Link tree ids come from get_linktrees. Confirm with the user before deleting.
Destructif Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'The ID of the link tree to delete'}}}
delete_profile_item
Delete Profile Item
Delete a profile item: a work experience entry, a project, or an education entry (set type accordingly). Use this to clean up duplicates, placeholder/test entries, or clearly wrong data. Ids come from get_profile. Always confirm with the user before deleting anything that could be real.
Destructif Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['type', 'id'], 'properties': {'id': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'The ID of the item to delete (get its id from get_profile)'}, 'type': {'enum': ['work_experience', 'project', 'education'], 'type': 'string', 'description': 'Which kind of profile item to delete'}}}
get_account
View Account
The user's account status in one call: every budget the platform enforces (active stars vs cap, unstars used vs the 30-day unstar budget, MCP requests today vs daily cap, REST API requests today vs daily cap, each with a resetsAt), the remaining limits (link-tree cap), and any over-cap/grace state. Calling it is free and never counts against a cap. Every limit is a plain number. Remoet is free. There is nothing to upgrade to and nothing to sell: if the user is at a limit, help them work within it.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
get_apps
Browse Apps
List approved apps built on the Remoet platform. These are community and official apps that extend Remoet's functionality. Each app has a repo URL for deployment and a demo URL to try it out. Use this to help users discover tools that complement their Remoet workflow, e.g. portfolio sites, CV generators, job trackers, etc. You can filter by category or tag.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'tag': {'type': 'string', 'description': 'Filter by tag'}, 'page': {'type': 'integer', 'maximum': 10000, 'minimum': 1, 'description': 'Page number, starting from 1 (default: 1)'}, 'category': {'type': 'string', 'description': 'Filter by category'}, 'pageSize': {'type': 'number', 'maximum': 50, 'minimum': 1, 'description': 'Results per page, max 50 (default: 20)'}}}
get_digests
View Digests
HISTORICAL ONLY: the user's archived job digests, the email summaries Remoet used to send about new jobs from their starred companies. No new digest has been generated since 2026-07-06, when the feed roundup replaced that pipeline, so this returns nothing at all for an account created since then. What carries new roles now is get_feed (the composed dashboard stream, and what the roundup emails are built from); for searching, use get_starred_jobs or search_jobs. Reach for this tool only when the user asks about their old email summaries by name. Without an id: the 20 most recent as lightweight summaries (id, title, frequency, jobCount, createdAt). With an id: that digest's full markdown body (each job's title, application URL, salary, remote policy, experience level, tech stack).
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'id': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'Fetch one digest in full by id. Omit to list recent digests.'}}}
get_feed
View Feed
The user's dashboard feed as ONE composed stream, chronological newest first. Each entry has a kind: 'item' (per-company job items from their starred companies - the company, when it landed, role snapshots with job id/title/application URL/salary/remote policy/experience level/tech stack, and per-role flags isActive, savedJobId, matchesFilters, plus per-item isStarred: false means the user unstarred that company since), 'job_of_the_day' (one daily editorial pick from anywhere on the platform - a discovery candidate worth surfacing), 'blog' and 'broadcast' (platform content; usually skim). Pass nextCursor back to page deeper; omit it for the newest page.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'cursor': {'type': 'string', 'maxLength': 64, 'description': 'nextCursor from the previous page. Omit for the newest page.'}, 'pageSize': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'Items per page (default 20, max 50).'}}}
get_linktrees
View Link Trees
The user's link tree pages: shareable single-page URLs for a CV, email signature, or job application, with per-link view/click tracking so recruiter engagement is measurable. Without a slug: all of the user's link trees (each with its id and slug). With a slug: that page's content plus its engagement data (views, clicks per link), which answers "has anyone looked at my link tree?".
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'slug': {'type': 'string', 'description': "Fetch one link tree in full by its public slug (with engagement data). Omit to list all of the user's link trees."}}}
get_listing
View Company Details
Works without a Remoet account. Get detailed information about a specific company listing by its slug. Use this to review a company before deciding whether to star it. Returns the company's full description, perks, job count, and URLs. NOTE: the tech stack is a small preview unless the company is starred. Starring unlocks the full stack (techStackCount shows the true total, e.g. a 3-tag preview of 147). Pass checkTechStack with the user's technologies to verify overlap against the FULL stack. Matched ones come back in matchedTechStack and lead the preview, same contract as search_listings. The star budget is reported by get_account.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'maxLength': 500, 'description': 'The URL slug of the listing (e.g. "digital-ocean", "stripe")'}, 'checkTechStack': {'type': 'array', 'items': {'type': 'string', 'maxLength': 100}, 'maxItems': 50, 'description': "Technologies to verify against the company's full stack (auto-normalized, max 50); matches are returned in matchedTechStack"}}}
get_profile
View Profile
The user's complete Remoet profile in one call: profile core (summary, links, location, avatar), workExperience, projects, and education (each section entry carries an id for update/delete) plus the current visibility setting. The ids it returns are the ones the save_* and delete_profile_item tools take. What the fields affect: the summary is the first thing companies read; the technologies arrays on work entries and projects feed job matching, so an empty array drops that entry out of matching; visibility NONE hides the user from every company's candidate list, STARRED shows them to the companies they have starred, ALL to every company.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
get_saved_jobs
View Saved Jobs
Get the user's saved jobs list. This is the user's job search memory: shows all jobs they've bookmarked across sessions, with notes and job details. Includes both AI-extracted jobs and internal partner jobs (see jobType field). It shows the user's existing pipeline, so jobs they have already saved can be told apart from new ones. Paginated, newest saves first. Each saved job includes isActive and deactivatedAt fields. If isActive is false, the job is no longer appearing on the company's careers page. This usually means it was filled or expired, but could also be a temporary scraper issue (there is a grace period before deactivation). A saved job the user can no longer see (its company is no longer starred, or a partner role was unpublished) keeps its entry but comes back with job: null, locked: true and a lockedReason to pass on. If job is null without locked, the listing was deleted entirely. A deactivated job may still be open on the company's careers page.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'page': {'type': 'integer', 'maximum': 10000, 'minimum': 1, 'description': 'Page number, starting from 1 (default: 1)'}, 'pageSize': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'Results per page, max 50 (default: 20)'}}}
get_starred_jobs
View Job Feed
Get job postings from the user's starred companies. This is the user's own curated feed. If the user has no stars, this returns nothing. In that case, use search_jobs instead: it reads the public catalogue. Supports filtering by search query, location, tech stack, remote policy, experience level, and minimum salary. Results are paginated. Same-title postings from one company are grouped into a single row: postingCount and postingLocations show how many raw postings it represents and where (boards often post one role per location). Results can be bookmarked with save_job. A single filtered query can miss good roles; an unfiltered call returns the whole feed, paginated. The techStack filter uses OR logic: specifying ["React", "TypeScript", "Node.js"] returns jobs matching AT LEAST ONE of them (technologies are auto-normalized and matched across spelling variants), so filter by the technologies that genuinely matter and judge each job's fit from its own techStack field. Use searchQuery for role-based searches ("senior engineer", "frontend", "platform") and techStack for technology-based filtering. OVER-CAP WARNING: if the response includes a "starsOverCap" field, the user has more starred companies than the limit allows and the surplus is scheduled for PERMANENT deletion on the given date. Proactively tell the user (count + date) and let them choose which companies to unstar down to the limit. NEVER unstar companies on the user's behalf just to get under the limit unless they explicitly ask you to.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'page': {'type': 'integer', 'maximum': 10000, 'minimum': 1, 'description': 'Page number, starting from 1'}, 'sortBy': {'enum': ['createdAt', 'remotePolicy', 'salaryEnriched.from', 'experienceLevel'], 'type': 'string', 'description': 'Sort field (default: createdAt)'}, 'pageSize': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'Results per page (max 50, default 20)'}, 'salaryMin': {'type': 'number', 'description': 'Minimum salary filter'}, 'sortOrder': {'enum': ['asc', 'desc'], 'type': 'string', 'description': 'Sort direction (default: desc)'}, 'techStack': {'type': 'array', 'items': {'type': 'string', 'maxLength': 100}, 'description': 'Filter by technologies (e.g. ["React", "Node.js"])'}, 'searchQuery': {'type': 'string', 'maxLength': 500, 'description': 'Search keywords for job title, summary, or tech stack'}, 'remotePolicy': {'type': 'array', 'items': {'enum': ['onsite', 'hybrid', 'remote', 'remote-restricted'], 'type': 'string'}, 'description': 'Filter by remote policy: "remote", "hybrid", "onsite", or "remote-restricted"'}, 'locationQuery': {'type': 'string', 'maxLength': 500, 'description': 'Filter by location or remote restrictions'}, 'techStackMatch': {'enum': ['any', 'all'], 'type': 'string', 'description': 'How techStack combines: "any" (default, at least one technology) or "all" (every technology required)'}, 'experienceLevel': {'type': 'array', 'items': {'enum': ['junior', 'mid', 'senior'], 'type': 'string'}, 'description': 'Filter by experience level: "junior", "mid", or "senior"'}}}
save_education
Save Education
Add or update an education entry (upsert). Omit id to create (institution is required); pass an id (from get_profile) to update, changing only the fields you send. Ask about degrees, bootcamps, and notable certifications. Confirm approximate dates with the user rather than guessing; don't fabricate. Saving without an id always creates a new entry.
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'id': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'Present: update this education entry (only the fields you pass change). Omit: create a new one (institution is required to create).'}, 'endDate': {'anyOf': [{'type': 'string', 'maxLength': 64}, {'type': 'null'}], 'description': 'End date: a date, e.g. "2024-01-15"'}, 'isCurrent': {'type': 'boolean', 'description': 'Whether you are currently studying here (default false on create)'}, 'startDate': {'anyOf': [{'type': 'string', 'maxLength': 64}, {'type': 'null'}], 'description': 'Start date: a date, e.g. "2024-01-15"'}, 'studyLevel': {'anyOf': [{'enum': ['HIGH_SCHOOL', 'ASSOCIATE', 'BACHELOR', 'MASTER', 'DOCTORATE', 'BOOTCAMP', 'OTHER'], 'type': 'string'}, {'type': 'null'}], 'description': 'Level of study: HIGH_SCHOOL, ASSOCIATE, BACHELOR, MASTER, DOCTORATE, BOOTCAMP, or OTHER'}, 'description': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'description': 'Description of studies, achievements, etc.'}, 'institution': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Institution name (e.g. "MIT", "Lund University")'}, 'fieldOfStudy': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'description': 'Field of study (e.g. "Computer Science")'}, 'institutionUrl': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Institution website URL'}}}
save_job
Save Job
Save a job to the user's list for later. Supports both AI-extracted jobs (from search_jobs or get_starred_jobs) and internal partner jobs. This gives the agent memory across sessions. Saved jobs persist so the user doesn't lose track of interesting roles. Optionally attach a note (e.g. "Great fit for React skills", "Follow up next week"). Each job can only be saved once.
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['jobId'], 'properties': {'note': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Optional note about why this job is interesting'}, 'jobId': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'The ID of the job to save'}, 'jobType': {'enum': ['ai_job', 'listing_job'], 'type': 'string', 'description': 'Type of job: "ai_job" (from search_jobs or get_starred_jobs, default) or "listing_job" (internal partner job)'}}}
save_project
Save Project
Add or update a portfolio project (upsert). Omit id to create (title and shortDescription are required); pass an id (from get_profile) to update, changing only the fields you send. Projects are the #1 differentiator for junior/mid developers. Help the user recognize work they might not think of: side projects, open-source contributions, hackathon entries, internal tools, time-saving scripts, blogs, personal apps. Saving without an id always creates a new entry. Saved entries appear on the user's public profile, so they should describe real work.
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'id': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'Present: update this project (only the fields you pass change). Omit: create a new one (title and shortDescription are required to create).'}, 'role': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'description': 'Your role in the project'}, 'title': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Project title'}, 'demoUrl': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Live demo URL'}, 'endDate': {'anyOf': [{'type': 'string', 'maxLength': 64}, {'type': 'null'}], 'description': 'End date: a date, e.g. "2024-01-15"'}, 'repoUrl': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Repository URL'}, 'isRemote': {'type': 'boolean', 'description': 'Whether this was remote work (default false on create)'}, 'isCurrent': {'type': 'boolean', 'description': 'Whether this is an ongoing project (default false on create)'}, 'startDate': {'anyOf': [{'type': 'string', 'maxLength': 64}, {'type': 'null'}], 'description': 'Start date: a date, e.g. "2024-01-15"'}, 'description': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'description': 'Full project description'}, 'isOpenSource': {'type': 'boolean', 'description': 'Whether this is open source (default false on create)'}, 'technologies': {'type': 'array', 'items': {'type': 'string', 'maxLength': 100}, 'maxItems': 50, 'description': 'Technologies used'}, 'shortDescription': {'type': 'string', 'maxLength': 500, 'minLength': 1, 'description': 'A one-line summary of the project'}}}
save_work_experience
Save Work Experience
Add or update a work experience entry (upsert). Omit id to create a new entry (title and startDate are required); pass an id (from get_profile) to update an existing one, changing only the fields you send. Every description should cover WHAT was built, HOW (technologies), IMPACT (users served, performance gains, revenue, uptime), and SCOPE (team size, scale). Push for measurable outcomes ("Built React frontend" -> "...serving 50K users, 40% faster"). The technologies array feeds job matching. Saving without an id always creates a new entry. Saved entries appear on the user's public profile, so they should describe real experience. Ask the user to confirm vague dates or fill real gaps.
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'id': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'Present: update this work-experience entry (only the fields you pass change). Omit: create a new one (title and startDate are required to create).'}, 'title': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Job title'}, 'endDate': {'anyOf': [{'type': 'string', 'maxLength': 64}, {'type': 'null'}], 'description': 'End date: a date, e.g. "2024-01-15". Omit it for a current role'}, 'isRemote': {'type': 'boolean', 'description': 'Whether this job is remote (default false on create)'}, 'isCurrent': {'type': 'boolean', 'description': 'Whether this is your current job (default false on create)'}, 'startDate': {'type': 'string', 'maxLength': 64, 'description': 'Start date: a date, e.g. "2024-01-15"'}, 'companyUrl': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Company website URL'}, 'companyName': {'anyOf': [{'type': 'string', 'maxLength': 200}, {'type': 'null'}], 'description': 'Company name'}, 'description': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'description': 'Job description'}, 'technologies': {'type': 'array', 'items': {'type': 'string', 'maxLength': 100}, 'maxItems': 50, 'description': 'Technologies used (e.g. ["React", "Node.js"]). They feed job matching'}}}
search_jobs
Search Public Jobs
Works without a Remoet account. Search Remoet's PUBLIC job catalogue: every role on the open board at remoet.dev/jobs, across all companies, not just the ones the user has starred. No star is needed and none is consumed. Use this to answer "what is out there" for any technology, title or company; use get_starred_jobs instead for the user's own curated feed. Each result carries the role's public Remoet URL, which is a real page anyone can open, plus applyUrl (the employer's own posting, where an application actually happens) and companySlug (the same slug get_listing takes, for company detail). Roles that Remoet is not permitted to publish never appear here. Duplicate postings of one role at a company are collapsed into a single result, so totalCount is the number of distinct roles, not raw postings. duplicateCount is how many postings collapsed into it; boards usually duplicate a role per location, but nothing guarantees that, so do NOT report it as a number of locations. firstSeenAt is when Remoet first saw the role, not when the employer posted it, and lastVerifiedAt is the last time Remoet confirmed it was still open. Filters are searchQuery (title, Remoet summary and tech stack), techStack (ANY of the given technologies, or EVERY one under techStackMatch: "all", which is how you express a must-have stack), companySlug, location, remotePolicy, experienceLevel and salaryMin. A salaryMin floor drops every role Remoet holds no numeric salary for, which is roughly 45% of the board, so use it when salary is a hard requirement and leave it off otherwise. location matches the canonical places Remoet stores per role rather than the free-text location string, so a country also finds roles that name only one of its cities; searchQuery does NOT read location, so filter by place with location and not by typing the place into searchQuery. When a search returns nothing, the hint says which filter emptied it and how many roles dropping that one filter would return, so act on the hint rather than guessing at which filter to relax. Results are newest-first unless you ask otherwise: sortBy takes "newest" or "salary", with sortOrder asc or desc. Start broad and narrow: a single heavily filtered query misses good roles. Results can be bookmarked with save_job. Example: search_jobs({ searchQuery: "platform engineer", techStack: ["Go", "Kubernetes"], location: ["Berlin"], remotePolicy: ["remote"] }).
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'page': {'type': 'integer', 'maximum': 10, 'minimum': 1, 'description': 'Page number, starting from 1 (default: 1). Without a Remoet account the first 10 pages are available; connect an account to page deeper.'}, 'sortBy': {'enum': ['newest', 'salary'], 'type': 'string', 'description': 'Sort field: "newest" (default) or "salary". Under "salary", roles with no known salary sort LAST whichever direction is asked for, so they never head the list.'}, 'location': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Match roles in ANY of these places (max 5), e.g. ["Berlin"] or ["Germany", "Netherlands"]. Matched against the canonical place names Remoet stores per role, not the free-text location string, so a country ALSO matches roles that only name one of its cities. City or country name, url slug ("san-francisco") and common alias ("NYC", "UK") all resolve. A place Remoet does not know returns no roles and says so, rather than quietly returning everything. Note that under a location filter a role\'s duplicateCount, firstSeenAt and the particular posting shown (its id, applyUrl and location) describe only that role\'s postings IN THOSE PLACES, so they can differ from the same role returned without one.'}, 'pageSize': {'type': 'integer', 'maximum': 20, 'minimum': 1, 'description': 'Results per page, max 20 without a Remoet account (default: 20)'}, 'salaryMin': {'type': 'number', 'description': "Minimum salary, against the role's normalized salaryEnriched.from. Roles Remoet holds no numeric salary for are EXCLUDED by this filter, so a floor narrows the board to the ~55% of roles that publish one."}, 'sortOrder': {'enum': ['asc', 'desc'], 'type': 'string', 'description': 'Sort direction (default: desc)'}, 'techStack': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Match roles carrying ANY of these technologies (e.g. ["React", "Go"]), or EVERY one of them under techStackMatch: "all". Matched case-insensitively against the exact stored technology, so use whole names rather than fragments. Known spelling variants are expanded, so "Go" also finds roles tagged "Golang".'}, 'companySlug': {'type': 'string', 'maxLength': 500, 'description': 'Restrict to one company by its Remoet slug (the same slug get_listing takes, e.g. "stripe"). An unknown or delisted company returns an empty page, not an error.'}, 'searchQuery': {'type': 'string', 'description': 'Free text, matched against the job title, Remoet\'s own summary of the role and its tech stack. Comma-separate keywords to require ALL of them (e.g. "react, typescript").'}, 'remotePolicy': {'type': 'array', 'items': {'enum': ['onsite', 'hybrid', 'remote', 'remote-restricted'], 'type': 'string'}, 'description': 'Match roles with ANY of these remote policies: "remote", "hybrid", "onsite" or "remote-restricted" (max 5).'}, 'techStackMatch': {'enum': ['any', 'all'], 'type': 'string', 'description': 'How techStack combines: "any" (default, at least one technology) or "all" (every technology required ON THE SAME ROLE; use for a must-have stack). Spelling variants stay grouped per technology, so "all" with ["Go", "React"] means a Go-or-Golang role that is ALSO a React role, never a Golang-or-React one. Under "all" at most 20 distinct technologies may be required in one search: more than that returns NO roles rather than a search quietly trimmed to 20, so send the ones that genuinely matter.'}, 'experienceLevel': {'type': 'array', 'items': {'enum': ['junior', 'mid', 'senior'], 'type': 'string'}, 'description': 'Match roles at ANY of these experience levels: "junior", "mid" or "senior" (max 5).'}}}
search_listings
Search Companies
Works without a Remoet account, except starred: true. Search companies on Remoet, or list the user's starred companies (starred: true). Returns a summary per result. Full detail (description, perks, URLs) is on get_listing, by slug. Job boards and aggregators are excluded; talent networks that post direct roles (e.g. Toptal) appear as companies. CRITICAL, star quality: only star companies whose tech stack OVERLAPS the user's skills (a JavaScript dev should not star a Go/Rust-only shop). Stars are the user's job-feed noise filter, so an irrelevant star pollutes their feed with jobs they can't use. Judge overlap by each result's matchedTechStack: the technologies from your techStack filter that the company actually uses, checked against its FULL stack (not the capped preview), so do NOT skip a company just because the visible preview omits the user's skills. An empty matchedTechStack means the result matched on text, not tags. techStackCount is the company's true tag total; the full stack unlocks on starring. techStack matches AT LEAST ONE filtered technology by default; set techStackMatch:"all" to require every one. starred: true limits results to the user's starred companies; combined with techStack it returns matchedTechStack per starred company, which shows any star with zero overlap. Example: search_listings({ searchQuery: "payments", techStack: ["TypeScript", "React"], experienceLevel: ["mid"] }).
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'page': {'type': 'integer', 'maximum': 10, 'minimum': 1, 'description': 'Page number, starting from 1 (default: 1). Without a Remoet account the first 10 pages are available.'}, 'sortBy': {'enum': ['stars', 'jobCount', 'name'], 'type': 'string', 'description': 'Sort results by: stars (most popular), jobCount (most active hiring), or name (alphabetical). Default: relevance when searching/filtering, stars when browsing'}, 'starred': {'type': 'boolean', 'description': "Set true to list the user's STARRED companies instead of searching the full catalog. In this mode searchQuery/experienceLevel/sort/pagination are ignored; pass techStack to get a matchedTechStack per starred company for auditing stack fit."}, 'pageSize': {'type': 'integer', 'maximum': 20, 'minimum': 1, 'description': 'Results per page, max 20 without a Remoet account (default: 20)'}, 'techStack': {'type': 'array', 'items': {'type': 'string', 'maxLength': 100}, 'description': 'Filter by technologies (e.g. ["React", "Node.js", "TypeScript"]). Each result\'s matchedTechStack shows which matched. Technologies are auto-normalized.'}, 'searchQuery': {'type': 'string', 'maxLength': 500, 'description': 'Search keyword: matches company name, description, and about text'}, 'techStackMatch': {'enum': ['any', 'all'], 'type': 'string', 'description': 'How techStack combines: "any" (default, at least one technology) or "all" (every technology required; use for must-have stacks)'}, 'experienceLevel': {'type': 'array', 'items': {'enum': ['junior', 'mid', 'senior'], 'type': 'string'}, 'description': 'Only companies with at least one open role at any of these seniorities (e.g. ["junior"] for entry-level-friendly companies). Each result\'s experienceLevels field shows its per-seniority role counts; a 0 can also mean seniority was not detected for those roles.'}}}
star_listing
Star Company
Star/save a company listing. Starring subscribes you to their job postings. Starred company jobs appear in get_starred_jobs. Starring also unlocks the company's FULL tech stack (unstarred listings only show a small preview). Starring is FREE. It does not consume budget. However, there is a limit on how many active stars you can have at once. Remaining star slots are reported by get_account. CRITICAL: Only star companies where the user's tech stack genuinely overlaps with the company's tech stack. A React/Node developer should NOT star a company that only uses Go or Java. Irrelevant stars pollute the job feed with noise. Every star must be a deliberate, high-quality match. A company returned by a techStack-filtered search_listings call confirms the technologies in its matchedTechStack field (the filter checks the full stack, including the part hidden from the preview), so judge overlap by matchedTechStack, not the visible preview.
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['listingId'], 'properties': {'listingId': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'The ID of the listing to star'}}}
unsave_job
Remove Saved Job
Remove a job from the user's saved list. Saved job ids come from get_saved_jobs. Confirm with the user before removing.
Destructif Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['savedJobId'], 'properties': {'savedJobId': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'The ID of the saved job entry to remove'}}}
unstar_listing
Unstar Company
Remove a star from a company listing. WARNING: Unstarring consumes from your unstar budget (per 30-day period), EXCEPT when the user is over their star cap (then trimming back to the limit is free). This prevents unlimited cycling of stars. The remaining unstar budget is reported by get_account. Only unstar if the company is truly not relevant. Do NOT mass-unstar to get a user under their cap unless they explicitly ask. If they are over cap, surface the choice and let them decide which to keep.
Destructif Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['listingId'], 'properties': {'listingId': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'The ID of the listing to unstar'}}}
update_profile
Update Profile
Update the user's Remoet profile core and/or their visibility. Only provide the fields you want to change. Omitted fields are left as-is; pass null to clear a field. If the source data (CV, website, etc.) is missing a field, ask the user rather than guessing. Never copy placeholder text like "lorem ipsum". VISIBILITY: pass visibility to control who can see the profile in company candidate lists: NONE (hidden), STARRED (only companies the user has starred, the recommended two-way match), or ALL (every company). Explain the trade-off before changing it. SUMMARY WRITING GUIDE: the summary is the most important field, the first thing companies read. Pattern: [Role] with [X years] experience in [core tech stack]. [One differentiator or achievement]. Example: "Senior Full-Stack Developer with 8 years of experience in React, Node.js, and AWS. Built and scaled a SaaS platform serving 200K users." Under 500 characters. Avoid generic fluff like "passionate developer". Be specific and quantifiable.
Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'url': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Your personal website URL'}, 'name': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Your full name'}, 'slug': {'type': ['string', 'null'], 'description': 'Your public profile URL slug (must be unique)'}, 'email': {'type': ['string', 'null'], 'description': 'Update your email address'}, 'phone': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Your phone number'}, 'summary': {'anyOf': [{'type': 'string', 'maxLength': 5000}, {'type': 'null'}], 'description': 'A brief professional summary or bio'}, 'location': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Your location'}, 'avatarUrl': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Your avatar/photo URL'}, 'githubUrl': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Your GitHub profile URL'}, 'twitterUrl': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Your Twitter/X profile URL'}, 'visibility': {'enum': ['ALL', 'STARRED', 'NONE'], 'type': 'string', 'description': 'Who can see the profile in company candidate lists: NONE (hidden), STARRED (only companies the user has starred, recommended), ALL (every company). Explain the trade-off before changing.'}, 'youtubeUrl': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Your YouTube channel URL'}, 'facebookUrl': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Your Facebook profile URL'}, 'linkedinUrl': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Your LinkedIn profile URL'}}}
update_saved_job_note
Update Saved Job Note
Update the note on a saved job. Use this to add context, track application status, or record follow-up reminders. Pass null to clear the note.
Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['savedJobId', 'note'], 'properties': {'note': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}], 'description': 'Updated note, or null to clear'}, 'savedJobId': {'type': 'string', 'pattern': '^[0-9a-fA-F]{24}$', 'description': 'The ID of the saved job entry (not the job ID)'}}}
Modifié
get_account
3 October 2026 02:55
Modifié
apply_to_job
3 October 2026 02:55
Modifié
delete_linktree
3 October 2026 02:55
Modifié
create_linktree
3 October 2026 02:55
Modifié
get_linktrees
3 October 2026 02:55
Modifié
get_apps
3 October 2026 02:55
Modifié
get_digests
3 October 2026 02:55
Modifié
get_feed
3 October 2026 02:55
Modifié
unsave_job
3 October 2026 02:55
Modifié
update_saved_job_note
3 October 2026 02:55
Modifié
get_saved_jobs
3 October 2026 02:55
Modifié
save_job
3 October 2026 02:55
Modifié
get_starred_jobs
3 October 2026 02:55
Modifié
search_jobs
3 October 2026 02:55
Modifié
unstar_listing
3 October 2026 02:55
Modifié
star_listing
3 October 2026 02:55
Modifié
get_listing
3 October 2026 02:55
Modifié
search_listings
3 October 2026 02:55
Modifié
delete_profile_item
3 October 2026 02:55
Modifié
save_education
3 October 2026 02:55
Modifié
save_project
3 October 2026 02:55
Modifié
save_work_experience
3 October 2026 02:55
Modifié
update_profile
3 October 2026 02:55
Modifié
get_profile
3 October 2026 02:55
Modifié
get_feed
27 September 2026 02:47
Modifié
save_education
27 September 2026 02:47
Modifié
save_project
27 September 2026 02:47
Modifié
save_work_experience
27 September 2026 02:47
Modifié
get_apps
25 September 2026 02:55
Modifié
get_saved_jobs
25 September 2026 02:55