jakegaylor-com-mcp-server
This server provides AI-accessible tools to retrieve Jake Gaylor's professional information and perform recruitment-related tasks. You can:
Access his resume (text and URL), LinkedIn, GitHub, website (URL and content), and structured candidate preferences (role type, level, location, remote, work authorization, compensation, availability).
Use AI-powered tools: ask questions about Jake (LLM with fallback), generate tailored interview questions (by type, focus, difficulty), and assess role fit (graded evaluation with strengths, gaps, and suggested questions).
Connect via MCP (Streamable HTTP/SSE) or A2A agent (JSON-RPC with automatic discovery).
View a human-readable resume webpage and a plain-text LLM-friendly version.
Schedule calls through Cal.com integration and relay messages to his email.
Allows sending emails to Jake via the contact_candidate tool, using Mailgun as the email provider.
Provides LLM capabilities for the about-jake skill, enabling answers to questions about Jake's experience using OpenAI models.
Allows sending emails to Jake via the contact_candidate tool, using Resend as the email provider.
Click on "Deploy 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., "@jakegaylor-com-mcp-server echo 'Hello, MCP!'"
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.
ai.jakegaylor.com
An Express + TypeScript server that makes Jake Gaylor legible to AI systems. One deployment serves four interfaces to the same underlying resume and bio:
A webpage (
GET /) for humansPlain-text context (
GET /llms.txt) for LLMs and crawlersAn MCP server (
/mcp) for AI clients a human has configuredAn A2A agent (
/a2a+ agent card) for agents that discover the site on their own
The resume content is fetched from jakegaylor.com/resume.json at boot and rendered to markdown, so every interface stays current without hand-editing.
Endpoints
Endpoint | What it serves |
| Webpage |
| Resume + core beliefs as plain text |
| MCP over Streamable HTTP |
| MCP over legacy SSE transport |
| A2A agent card (v1.0, with v0.3 translation for legacy clients), JWS-signed when a key is configured |
| Public keys for verifying the card signature |
| A2A JSON-RPC endpoint (v1.0 + v0.3 compat) |
Related MCP server: Echo MCP Server
MCP
Built on @jhgaylor/candidate-mcp-server. Tools exposed:
get_resume_text, get_resume_url, get_linkedin_url, get_github_url, get_website_url, get_website_text, contact_candidate (emails Jake), generate_interview_questions, assess_role_fit, get_candidate_preferences (structured screening data — see src/preferences.ts), get_availability + book_intro_call (Cal.com-backed scheduling with the same pending-confirmation and daily-cap guardrails as the A2A skill)
Connect a client to https://ai.jakegaylor.com/mcp, or run locally over stdio with npx @jhgaylor/me-mcp.
A2A
An A2A v1.0 agent built on @a2a-js/sdk, with the v0.3 compatibility layer enabled — clients that send no A2A-Version header are treated as v0.3 by the protocol, and most deployed clients still speak it. The card advertises both versions on the same URL.
Skills:
about-jake— answers questions about Jake's experience using a cheap LLM grounded in the resume, bio, and screening data. If no LLM key is configured or the call fails, it falls back to returning the complete resume as markdown, so the skill contract holds either way.candidate-preferences— structured screening data (role types, level, location, relocation, remote, work authorization, comp stance, availability, resume links) returned as a JSON data part plus markdown. Triggered by screening/logistics keywords ormetadata.skill. Values live insrc/preferences.ts.assess-role-fit— send a job description (JD:prefix, or any long JD-shaped text) and get an honest LLM-graded fit assessment: verdict, strengths with resume citations, gaps named plainly, logistics check, and suggested interview questions. Falls back to returning the resume when no LLM is available.schedule-intro-call— scheduling-intent messages return open slots from the self-hosted Cal.com (cal.jakegaylor.com, public booking endpoints — no licensed API needed);BOOK: <slot> | <email> | <name> | <note>creates a booking. Guardrails: bookings require Jake's confirmation (Cal.com-native), explicitBOOK:prefix for the side effect, and a daily attempt cap. Config viaCAL_*env vars insrc/calcom.ts.connect-via-mcp— messages mentioning MCP get connection instructions for the richer MCP interface.contact-jake— messages starting withCONTACT:are relayed to Jake by email. Only that explicit prefix (ormetadata.skill = "contact-jake") triggers mail.
Example:
curl -X POST https://ai.jakegaylor.com/a2a \
-H "Content-Type: application/json" -H "A2A-Version: 1.0" \
-d '{"jsonrpc":"2.0","id":1,"method":"SendMessage","params":{"message":{
"messageId":"m1","role":"ROLE_USER",
"parts":[{"text":"What is Jake's experience with Kubernetes?"}]}}}'Configuration
Env var | Purpose |
| HTTP port (default 3000) |
| Email via Resend SMTP (preferred when set) |
| From-address for Resend (domain must be verified in Resend) |
| Email via Mailgun (fallback when Resend is not configured) |
| LLM for |
| LLM for |
| Model override (default |
| Public base URL baked into the agent card (default |
| Private ES256 JWK (with |
| Server-side agent-traffic analytics (card fetches, MCP/A2A requests, skill routing); analytics are disabled without it |
| PostHog endpoint (default |
With no email keys set, contact_candidate/contact-jake report failure gracefully. With no LLM keys set, about-jake is fully deterministic.
Development
npm install
npm run build # tsc
npm run dev # stdio transport, auto-reload
npm run dev:web # HTTP transport on :3000, auto-reloadsrc/
├── index.ts # Entry point; picks stdio or HTTP transport
├── express.ts # HTTP server: web, MCP, A2A mounting
├── a2a.ts # A2A agent card, executor, skills
├── preferences.ts # Structured screening data (edit values here)
├── stdio.ts # STDIO transport for MCP
├── config.ts # Server + candidate config; fetches resume at boot
├── resumeMarkdown.ts # JSON Resume → markdown renderer
└── types.ts # Shared typesDeployment
Pushes to main trigger a GitHub Actions build of a multi-arch Docker image (jhgaylor/jake-gaylor-com-mcp-server). The workflow then pins k8s/kustomization.yaml to the new sha-<commit> tag and commits it back; Flux watches the repo and rolls the deployment on the home-cloud k3s cluster. Runtime secrets come from Infisical via an InfisicalSecret (see k8s/infisicalsecret.yaml) and land in the pod through envFrom.
License
Available Tools
9 toolsassess_role_fitC
Assess Jake Gaylor's fit for a specific role based on job description
Inputs: job_title (required), job_description (required), key_requirements (required).
generate_interview_questionsC
Generate tailored interview questions for Jake Gaylor
Inputs: difficulty (required), focus_areas (required), interview_type (required).
get_candidate_preferencesC
Structured screening and logistics data for Jake Gaylor: role types, level, location, relocation, remote preference, work authorization, compensation stance, availability, and machine-readable resume links. Returns JSON.
Inputs: no named parameters.
get_github_urlA
Get the GitHub URL of the candidate Jake Gaylor
Inputs: no named parameters.
get_linkedin_urlA
Get the LinkedIn URL of the candidate Jake Gaylor
Inputs: no named parameters.
get_resume_textA
Get the resume text of the candidate Jake Gaylor
Inputs: no named parameters.
get_resume_urlB
Get the resume URL of the candidate Jake Gaylor
Inputs: no named parameters.
get_website_textC
Get the website text of the candidate Jake Gaylor
Inputs: no named parameters.
get_website_urlB
Get the website URL of the candidate Jake Gaylor
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 9 tools
Each tool retrieves a distinct piece of information or performs a unique analysis (e.g., resume text vs. LinkedIn URL vs. interview question generation), with no overlap.
All tool names follow a consistent 'verb_noun' pattern (e.g., get_resume_text, get_linkedin_url, generate_interview_questions), making them predictable.
9 tools is well-suited for a focused personal-profile server, covering all needed operations without excess or deficiency.
The server comprehensively covers retrieving personal info, URLs, text, and conducting role assessments and interview prep, with no obvious gaps.
Maintenance
Related MCP Connectors
MCP compatibility and transport verification server.
MCP compatibility and transport verification server.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA test server implementing all features of the MCP protocol, including prompts, tools, resources, and sampling, designed for testing MCP clients rather than practical applications.MIT
- FlicenseNot gradedqualityDmaintenanceA simple demonstration MCP server that provides an echo tool and resource for learning how to build MCP servers. Serves as a starting point and template for creating custom MCP server implementations.1-
- AlicenseNot gradedqualityDmaintenanceA minimal demonstration server showcasing MCP protocol capabilities including tools, resources, and prompts with basic examples like hello world functionality.8 npmMIT
- FlicenseNot gradedqualityCmaintenanceMCP server providing greeting and echo tools for testing and demonstration.-