handshake-mcp
This MCP server gives AI assistants access to the Handshake student job platform through an authenticated browser session, enabling the following:
Search jobs — Find postings by keywords, location, or job type (full-time, part-time, internship, co-op, fellowship, volunteer)
View job details — Retrieve full descriptions, requirements, salary, application deadlines, and application method
Apply to jobs — Submit applications with optional resume/cover letter attachments (excludes external-apply jobs)
Track applications — View submitted applications and their statuses (pending, accepted, declined, withdrawn, interview), with optional filtering; withdraw applications as needed
Manage saved jobs — Bookmark jobs, remove bookmarks, and list all saved postings
Research employers — Search companies by name or industry, and view profiles including description, industry, employee count, and open positions
Access your profile — View your Handshake student profile (name, school, major, graduation year, account status)
Manage documents — List uploaded resumes, cover letters, and other files, and retrieve their IDs for use when applying
Provides tools to search jobs, apply, track applications, and research employers on Handshake.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@handshake-mcpsearch for software engineering internships in San Francisco"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
handshake-mcp
An MCP server that gives AI assistants like Claude access to Handshake — search jobs, apply, track applications, and research employers through your own browser session.
Disclaimer: This project is independent and unaffiliated with Handshake. Automated access may violate Handshake's Terms of Service. Use for personal productivity only.
Tools
Tool | Description |
| Search by keyword, location, or job type |
| Full description, requirements, salary, deadline |
| Submit an application, attach resume/cover letter |
| Save / unsave jobs (follow) |
| Application tracking |
| Company research (keyword search) |
| Your Handshake student profile |
| Manage resumes and cover letters |
Related MCP server: Chrome MCP Server
Quick start
With uvx (recommended)
# First-time login
uvx handshake-mcp --login
# Add to Claude Code (~/.claude/.mcp.json){
"mcpServers": {
"handshake": {
"command": "uvx",
"args": ["handshake-mcp"]
}
}
}From source
git clone https://github.com/shahparam11/handshake-mcp-server.git
cd handshake-mcp
uv sync
# First-time login
uv run handshake-mcp --loginAdd to ~/.claude/.mcp.json:
{
"mcpServers": {
"handshake": {
"command": "uv",
"args": ["run", "--project", "/path/to/handshake-mcp", "handshake-mcp"]
}
}
}Restart Claude Code. The hs_* tools are now available.
With Docker
docker build -t handshake-mcp .
# Login (mounts session storage)
docker run -it -v ~/.handshake-mcp:/root/.handshake-mcp handshake-mcp --login
# Run as MCP server
docker run -i -v ~/.handshake-mcp:/root/.handshake-mcp handshake-mcpCLI
handshake-mcp --login # authenticate via browser
handshake-mcp --status # check session validity
handshake-mcp --logout # clear saved session
handshake-mcp --version # print versionHow it works
On --login, a Patchright Chromium browser opens. After you log in, the full browser profile (cookies, localStorage, IndexedDB) is saved to ~/.handshake-mcp/. Subsequent tool calls use these cookies via an httpx client against Handshake's internal REST API at app.joinhandshake.com/stu/.
CSRF protection uses the double-submit cookie pattern — the CSRF-TOKEN cookie value is reflected back as the X-CSRF-Token request header.
Note: Handshake's internal API is undocumented. If a tool returns 404, open browser DevTools on Handshake → Network tab, find the matching request path, and update the relevant
handshake_mcp/tools/*.pyfile.
Session refresh
handshake-mcp --loginProject layout
handshake_mcp/
├── cli_main.py # Entry point — --login/--logout/--status/server
├── server.py # FastMCP server factory
├── auth.py # Patchright login + profile/cookie storage
├── client.py # Authenticated httpx client
├── exceptions.py # CredentialsNotFoundError, SessionExpiredError
└── tools/
├── jobs.py # hs_search_jobs, hs_get_job, hs_apply, hs_save/unsave_job
├── employers.py # hs_search_employers, hs_get_employer
├── applications.py # hs_get_applications, hs_withdraw_application
└── profile.py # hs_get_profile, hs_upload/get/delete_documentDevelopment
uv sync --group dev
uv run pytest --cov
uv run ruff check .License
MIT — see LICENSE.
Available Tools
12 toolshs_applyA
Submit a Handshake application for a job.
Call hs_get_job first to confirm the application_method field — external-apply jobs redirect to the employer's own site and cannot be submitted here.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Handshake posting ID. | |
| document_ids | No | IDs of documents to attach (resume, cover letter). Retrieve IDs with hs_get_documents. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that external-apply jobs redirect and cannot be submitted, but does not detail post-submission behavior (e.g., success/failure response). Still, the key behavioral constraint is well communicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences plus a clear note. No filler; every sentence earns its place. Front-loaded with the main action and immediately follows with crucial usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (not shown), the description need not detail return values. It covers prerequisites and limitations well for a 2-parameter tool. Minor gap: no mention of what happens on successful submission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value by explaining that document_ids are for attachments (resume/cover letter) and how to retrieve them. It reinforces job_id as mandatory and the prerequisite check.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Submit a Handshake application for a job,' specifying the verb and resource. It also distinguishes from sibling tools like hs_get_applications and hs_withdraw_application by focusing on submission.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call hs_get_job first to check application_method, and warns that external-apply jobs cannot be submitted here. Also suggests using hs_get_documents to retrieve document_ids, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_get_applicationsA
List all your Handshake job applications with their current status.
Statuses: pending, accepted, declined, withdrawn, interview.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (starts at 1). | |
| per_page | No | Results per page. | |
| status | No | Filter by status — omit to return all applications. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description only mentions statuses and filtering, but does not disclose pagination behavior, rate limits, or whether it is read-only. Minimal disclosure beyond the obvious.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main purpose, then a clear list of statuses. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Parameters are well-described, and an output schema exists. However, could mention pagination details (e.g., ordering) for full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds specific enum values for status ('pending, accepted, declined, withdrawn, interview'), which goes beyond the schema's generic description. This adds meaningful context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all your Handshake job applications', using a specific verb and resource. It also lists possible statuses, distinguishing this tool from siblings like hs_apply (create) and hs_get_saved_jobs (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for viewing applications with optional status filtering, but no explicit guidance on when to use vs alternatives (e.g., hs_get_saved_jobs) or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_get_documentsA
List your uploaded resumes, cover letters, and other documents.
Use the returned document IDs when calling hs_apply to attach files.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; the description carries full burden. It is simple and labels the operation as a list, but does not disclose any constraints like rate limits or authentication. However, for a read-only list with no parameters, the minimal disclosure is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no unnecessary words. Every sentence provides essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no parameters and an output schema, the description tells what it does and how to use the output. No additional context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is 100%. Baseline is 4. The description adds value by explaining the document types and linking the output to hs_apply, going beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists uploaded resumes, cover letters, and other documents, and explains how to use the returned IDs. This distinguishes it from sibling tools like hs_get_job or hs_get_applications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use: to get document IDs for attaching to applications via hs_apply. It does not provide explicit exclusions, but the context is clear given the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_get_employerA
Get a company's Handshake profile.
Includes description, industry, employee count, open job count, and active postings.
| Name | Required | Description | Default |
|---|---|---|---|
| employer_id | Yes | Employer ID from hs_search_employers results. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries burden. It lists included fields but does not discuss read-only nature, auth, or any side effects. Adequate but not detailed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with a clear bullet list of included data. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given single parameter and existence of output schema, description adequately covers purpose and key return fields. No missing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter description. Tool description adds no extra meaning beyond the schema, so baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Get a company's Handshake profile' and lists included fields. It distinguishes from siblings like hs_search_employers (search) and hs_get_job (specific job).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicitly suggests using employer ID from hs_search_employers, but no explicit when-to-use or alternatives compared to similar read tools like hs_get_job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_get_jobA
Get full details of a Handshake job posting.
Includes description, requirements, salary, application deadline, and application_method (handshake | external).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Handshake posting ID (from hs_search_jobs results). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavioral traits. It indicates a read operation (get details) without side effects, but does not explicitly state if there are any restrictions, rate limits, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, no wasted words, and front-loads the main purpose. It is efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has a single required parameter and an output schema (though not shown), the description covers key returned fields and expected input format. It is fully complete for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters and describes job_id adequately. The description adds extra context by specifying that the ID comes from hs_search_jobs results, aiding correct usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get full details of a Handshake job posting' and enumerates included fields (description, requirements, salary, deadline, application_method). It differentiates itself from sibling tools like hs_search_jobs which lists jobs rather than retrieving details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving details after searching (by mentioning job_id from hs_search_jobs), but does not explicitly state when to use or not use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_get_profileA
Get your Handshake student profile.
Returns name, school, major, graduation year, and account status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses return fields but lacks details like authentication requirements or side effects. Adequate for a simple read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no wasted words. Highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no parameters and output schema is present. Description fully explains what the tool returns, making it complete for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; baseline 4. Description adds value by listing return fields, though output schema already covers this. Acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'Get' and resource 'your Handshake student profile', listing specific return fields. It distinguishes from sibling tools that handle applications, jobs, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage for retrieving student profile, but no explicit guidance on when to use or alternatives. Given simplicity and no parameters, minimally adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_get_saved_jobsB
List all jobs you have bookmarked on Handshake.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (starts at 1). | |
| per_page | No | Results per page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It does not disclose pagination behavior, auth requirements, or what happens with empty results. Very minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no waste. Could benefit from slight expansion but is concise and front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema exists, description is minimally adequate but lacks context on scope (all bookmarks) and integration with sibling tools. Very brief for a tool in a complex domain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both parameters documented with defaults). Description adds no additional meaning beyond schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists saved/bookmarked jobs, using specific verb 'list' and resource 'saved jobs'. It distinguishes from siblings like hs_search_jobs (searches all jobs) and hs_save_job (saves).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives like hs_search_jobs or hs_get_applications. No mention of preconditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_save_jobA
Bookmark a job posting to your Handshake saved-jobs list.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Handshake posting ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description only says 'Bookmark' without disclosing behavioral traits like idempotency, authentication needs, or state changes, leaving the agent underinformed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded verb and object, concise and efficient with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given simple tool with one parameter and output schema, description covers core purpose; lacks mention of return value or error cases but adequate for straightforward bookmarking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the single parameter (job_id) at 100% with a description 'Handshake posting ID.' Description adds no additional meaning beyond the schema, achieving baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'Bookmark' and resource 'job posting to your Handshake saved-jobs list,' distinguishing it from siblings like hs_unsave_job and hs_get_saved_jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage for bookmarking but lacks explicit guidance on when to use this vs alternatives like hs_unsave_job or prerequisites like login.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_search_employersC
Search for companies/employers on Handshake.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Company name or industry keyword. | |
| page | No | Page number (starts at 1). | |
| per_page | No | Results per page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description lacks behavioral details such as pagination behavior, rate limits, or authentication requirements. It only restates the basic search function without adding beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise but overly brief. It is a single sentence, which is efficient, but lacks critical details that could be added without verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description is insufficient for a tool with 3 parameters (1 required) and no usage guidance. It fails to provide enough context for an agent to use it effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes all parameters. The description does not add meaningful context beyond the schema, but the baseline is 3 due to high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches for companies/employers on Handshake, distinguishing it from sibling tools like hs_search_jobs (jobs search) and hs_get_employer (specific employer). The verb 'search' and resource 'companies/employers' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. The description does not mention when not to use it or provide context for sibling tools like hs_get_employer for detailed employer info.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_search_jobsA
Search for jobs and internships on Handshake.
Returns posting ID, title, employer, location, type, and deadline. Pass the posting ID to hs_get_job for the full description.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Keywords, job title, or company name. | |
| location | No | City/state or 'Remote'. | |
| job_types | No | Filter by type — full_time, part_time, internship, co_op, fellowship, volunteer. Omit for all types. | |
| page | No | Page number (starts at 1). | |
| per_page | No | Results per page (max 50). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It lists returned fields but does not disclose behavioral aspects like authentication requirements, rate limits, or side effects (though it's read-only). The schema covers parameters well, but the description could add more about pagination behavior or result ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Exemplary conciseness: 3 sentences with zero wasted words. First sentence states purpose; second lists key outputs; third gives next step. No redundancy with schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 5 optional parameters and an output schema, the description is nearly complete. It covers purpose, key outputs, and linkage to a related tool. Minor gap: no mention of pagination behavior beyond schema (e.g., default page size). Output schema exists, so return values are documented elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds no extra meaning beyond the schema; it merely summarizes returned fields which are already in the output schema. No parameter usage examples or constraints beyond schema are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb-resource combination - 'Search for jobs and internships on Handshake' explicitly states what it does. Distinguishes from sibling tools by listing returned fields and directing to hs_get_job for details, which contrasts with hs_search_employers or hs_get_job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear workflow hint: 'Pass the posting ID to hs_get_job for the full description.' However, it does not specify when to prefer this tool over alternatives like hs_search_employers or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_unsave_jobA
Remove a job from your Handshake saved-jobs list.
| Name | Required | Description | Default |
|---|---|---|---|
| saved_job_id | Yes | Saved-job record ID from hs_get_saved_jobs. This is different from the posting ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; the description states a destructive action ('Remove') but lacks details on prerequisites, consequences, or error states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence clearly states the function, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for a simple single-parameter tool with an output schema, though it could mention the prerequisite of having saved the job.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema explains the parameter's source and distinction from posting ID; the description adds no further meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Remove') and resource ('saved-jobs list'), clearly distinguishing from sibling tools like 'hs_save_job' and 'hs_get_saved_jobs'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternatives are given, but the simple nature and sibling context imply it is the inverse of 'hs_save_job'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_withdraw_applicationA
Withdraw a submitted Handshake job application.
| Name | Required | Description | Default |
|---|---|---|---|
| application_id | Yes | Application ID from hs_get_applications. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description lacks critical behavioral details. It does not disclose whether the action is destructive, reversible, or has side effects. For a mutation tool like withdrawal, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no extraneous words. It efficiently conveys the tool's purpose without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description need not detail return values. However, it omits prerequisites, status requirements for the application, and potential results. It is sufficient for simple use but lacks depth for complex scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of parameters, including a description for 'application_id' that references its origin from hs_get_applications. The main description adds no additional parameter insights, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Withdraw' and the resource 'submitted Handshake job application'. It effectively distinguishes the tool from its siblings, such as hs_apply (submission) and hs_get_applications (listing), making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when one needs to withdraw an application, but it does not provide explicit guidance on when to use this tool versus alternatives, nor does it mention prerequisites or conditions. A score of 3 reflects adequate but minimal guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
12 tool updates
v0.1.0- First observed
hs_apply - First observed
hs_get_applications - First observed
hs_get_documents - First observed
hs_get_employer - First observed
hs_get_job - First observed
hs_get_profile - First observed
hs_get_saved_jobs - First observed
hs_save_job - First observed
hs_search_employers - First observed
hs_search_jobs - First observed
hs_unsave_job - First observed
hs_withdraw_application
TDQS
Each tool has a clearly distinct purpose: searching, retrieving details, applying, managing saved jobs, and handling applications. No two tools overlap in functionality; even similar actions like get_job and search_jobs are well-differentiated (detail vs. list) with clear guidance in descriptions.
All tools follow a consistent pattern: 'hs_' prefix + verb_noun (e.g., hs_get_job, hs_save_job, hs_search_jobs). Verbs are operational (get, search, save, unsave, apply, withdraw) and nouns are the target resources. No mixing of styles or irregularities.
12 tools is an appropriate number for a Handshake student client. It covers the essential operations (search, retrieve, apply, manage saved jobs and applications, view profile and documents) without being overwhelming or sparse.
The tool set covers the core student workflow comprehensively: search jobs/employers, get details, save/unsave, apply, withdraw, view applications, and manage documents. Minor gaps like updating profile or uploading documents are absent but likely outside the MCP's scope.
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 Connectors
Manage job applications — jobs, companies, boards, notes, and profile — from your AI client.
Give AI agents the LinkedIn tools to find, qualify, engage, and follow up with prospects.
Analyze job listings against your resume, track applications, and generate cover letters.
Search AI-native jobs, inspect application forms, and fetch free interview-prep resources.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI-driven job application automation for LinkedIn and SEEK platforms with intelligent cover letter generation, automated application submission, and application tracking management. Supports anti-detection measures and complies with platform usage policies for safe job hunting automation.-
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to control and automate your Chrome browser directly, leveraging existing login states and configurations for tasks like content analysis, semantic search across tabs, screenshots, network monitoring, and interactive operations.10MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to connect to Handshake to search jobs, browse employers, explore events, and pull student or employer profiles.1Apache 2.0
- AlicenseAqualityCmaintenanceEnables AI assistants to interact with your personal Instaffo candidate account, allowing reading of profile, job suggestions, and conversations, as well as performing reversible write actions like bookmarking jobs and updating skills, all authenticated via your browser session and running fully locally.10MIT
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/shahparam11/handshake-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server