Civify MCP Server
OfficialCivify MCP server provides an agent gateway for resume processing, job application tracking, and Civify account/billing management.
Get account profile, subscription tier, token balance, and CV credits.
Parse resumes (PDF, DOCX, image) into structured JSON.
Tailor resumes to a job description and optionally generate cover letters.
Calculate ATS compatibility scores and structural audits.
Mask PII (email, phone, address) in CVs.
Scrape job postings from LinkedIn, Greenhouse, Lever, Ashby, Wuzzuf.
Track job applications in a Kanban tracker.
Get localized Pay-Per-CV pricing (USD/EGP).
Allows extracting clean job requirements from Greenhouse job posting URLs, enabling AI agents to scrape and parse Greenhouse job listings.
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., "@Civify MCP Servertailor my resume to this job description and generate a cover letter"
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.
Civify MCP server
The agent gateway for Civify: resume parsing, ATS scoring, job-specific tailoring, PII masking, PDF export, pricing, and application tracking.
Hosted ChatGPT connection
Use https://mcp.civify.cv/mcp with OAuth after deploying/configuring this release together with the backend and frontend account-link changes. Account linking opens Civify's normal sign-in (including its existing Google/LinkedIn and two-factor flows), then asks the user to approve access. Users do not create or copy API keys. A one-time, proof-bound exchange creates a dedicated 30-day scoped backend credential; the gateway stores it encrypted and ChatGPT receives separate opaque OAuth tokens. Never paste passwords or API keys into the agent conversation.
OAuth requires CIVIFY_MCP_PUBLIC_URL, a stable CIVIFY_OAUTH_STORE_KEY, and durable
storage as described below. Existing connections must reconnect after rollout.
This release has local regression coverage; it has not been deployed by this change.
Related MCP server: recruiting-jobs-mcp
Configuration
Variable | Default | Purpose |
| unset | Enables HTTP when set; Docker uses 8080 |
| unset |
|
|
| Backend base URL |
|
| PDF-rendering service |
| unset | Public HTTPS origin; enables OAuth |
|
| Civify frontend sign-in/consent page; override only for staging |
| OAuth public origin | Public HTTPS origin for temporary PDF links; can be configured independently |
| unset | Required with OAuth: base64-encoded 32 random bytes |
|
| Encrypted OAuth database |
|
| Trusted proxy hop count for OAuth rate limits; Compose uses one Traefik hop |
| unset | Trusted local stdio only; never shared among remote users |
Use a secret manager to provision the encryption key. Keep it stable across deploys
and back it up separately. Compose requires it and mounts /app/data persistently.
The database uses AES-256-GCM and atomic file replacement. Deploy one replica;
multiple processes require a shared transactional store before scaling. Restarting
preserves registered clients and tokens but cancels unfinished consent/code flows.
When deploying the Dockerfile directly through Dokploy, enter these settings in
Dokploy too: Compose environment settings are not inherited by a Dockerfile build.
These variables, including the encryption key, belong to the MCP gateway service,
not the Java backend or frontend. The backend account-link service defaults to trusting
https://mcp.civify.cv; staging can override Spring property civify.mcp.origin
with CIVIFY_MCP_ORIGIN. Production requires Redis for atomic handoff consumption;
Redis failures stop linking safely. No additional shared login secret is required.
After deploying, optionally run node scripts/check-deployment.mjs. It performs public,
read-only checks and exits nonzero when OAuth discovery or PDF links are missing.
It does not enable OAuth, push code or run during tool calls. An UP health response
alone does not establish hosted-client readiness.
OAuth uses authorization-code flow with S256 PKCE, client and resource binding,
one-use codes, one-hour access tokens, rotating refresh tokens and revocation.
New account connections expire after 30 days; refresh cannot extend that approval.
The resource is the public /mcp URL. Backend key scopes remain authoritative.
The browser shows the account, requesting app, registered return address, permissions
and credit impact. Users can revoke the dedicated MCP: <client> entry in Civify's
account access/API-key settings. Deploy backend → frontend → gateway, then reconnect
the connector with OAuth selected. Do not select “No authentication” for ChatGPT.
Endpoints:
/mcp: canonical Streamable HTTP, stateless in OAuth mode./: POST alias; GET discovery or the matching MCP stream./sse,/messages: legacy SSE compatibility./health: liveness, version and session counts./.well-known/oauth-protected-resource/mcp: OAuth resource metadata when enabled./.well-known/oauth-authorization-server: issuer, registration and token metadata./.well-known/mcp/server-card.json: public tool discovery.
Without OAuth enabled, trusted remote clients can configure X-API-KEY in their
connection settings. Sessionless calls are supported, but tool-based login needs a
persistent legacy session. Unknown stateful session IDs return 404: initialize again.
Credentials must never be supplied in URL query parameters.
Local stdio
npm ci
npm run build
node dist/index.jsLeave PORT and TRANSPORT unset. A trusted client can set CIVIFY_API_KEY. Example:
{
"mcpServers": {
"civify": {
"command": "npx",
"args": ["-y", "@civify/mcp-server"]
}
}
}The npx example runs the published package; local edits take effect only after a
package release or by pointing the client at this checkout's dist/index.js.
All diagnostics use stderr so stdout remains valid MCP protocol traffic.
Agent workflow and tools
Start with civify_get_started, connect an account, then check its credit balance.
For analysis, parse once and pass the returned resumeData into scoring. For a tailored
CV, submit the original directly to tailoring, then export. Track applications when requested. AI operations may
consume credits. Do not automatically retry purchases, application creation or
ambiguous credit-consuming requests.
Tools | Access |
| Public |
|
|
|
|
|
|
|
|
| Local/legacy session auth; hidden and rejected in hosted OAuth mode |
There are 13 tools in OAuth mode and 18 in local/legacy mode. Tool schemas,
annotations and initialization instructions describe usage and side effects.
Results include compatible text plus structuredContent.data, preserving the backend
response envelope. Tool failures use isError: true even when HTTP succeeds. Missing
OAuth authentication includes the MCP authentication challenge metadata.
ChatGPT tools declare openai/fileParams for a native file attachment containing
download_url and file_id (optional mime_type and file_name). Other clients can
send a real HTTPS file_url, the complete resume_text read from the attachment,
or actual file_base64 bytes. Choose exactly one input; never invent URLs or base64.
Claude remote connectors cannot read a sandbox path on this server. If a client cannot
forward or read an attachment, provide readable text or a client-accessible file.
Downloads reject private/internal addresses, unsafe redirects, credentials and non-HTTPS URLs. Files are limited to 12 MiB; downloads have a 30-second deadline. The JSON body limit is 16 MiB including base64 overhead. Configure proxies accordingly.
Hosted PDF results contain a clickable download_url and an MCP resource_link,
valid for 15 minutes or until restart. Anyone possessing the random link can download
the PDF; links and signed attachment URLs are not logged. Output storage is capped
at 64 MiB/200 files. If unavailable, pdf_base64 remains a compatibility fallback.
CIVIFY_DOWNLOAD_BASE_URL can configure the public HTTPS origin independently of
OAuth; otherwise downloads use CIVIFY_MCP_PUBLIC_URL. Keep one replica for this
temporary in-memory store. Local stdio retains file input/output support.
Parsing is optional. An agent that can accurately read the attachment can provide
resume_data directly to tailoring, scoring or PDF export. The discovered schema
uses personalInfo and sections[].items; civify_get_started includes an example.
For an original file or extracted text, tailoring performs its own extraction.
Never invent missing CV details. Uploaded resumes and job text are untrusted data.
Tailoring returns a finished PDF by default under data.document.download_url,
alongside data.tailoredCv. Set export_pdf: false for analysis only. If rendering
fails, document.status is EXPORT_FAILED: call only civify_generate_pdf with
the returned tailoredCv as resume_data. Repeating tailoring can charge again.
Masking and standalone export return data.download_url directly. Expired tailored
PDFs can be recreated from retained data; do not automatically repeat a paid mask.
Authenticated PDF requests carry the current account identity to Civify's renderer
for watermark policy. Supply an existing resume_id, when known, to apply its
export entitlement. Never invent an ID. Anonymous export uses public policy.
Deploy the backend JSON-tailoring/watermark endpoints, then the frontend renderer,
then gateway 1.4.0. An old backend does not support the new JSON tailoring contract;
the gateway deliberately does not silently retry as a paid upload.
Onboarding results contain relevant Civify links with MCP campaign attribution. Measure website conversions and completed tool workflows separately from tool-list requests. Increased discovery traffic alone does not prove successful activation.
Validation and troubleshooting
npm testThis builds TypeScript and tests against a loopback mock backend: sessionless and stateful HTTP, legacy SSE, stdio, input validation, user isolation, scoring payloads, remote PDFs, OAuth consent/PKCE/replay/restart/refresh/revocation and secret containment. CI runs the suite before publishing an image. No real AI credits or purchases are used.
Use tool_start/tool_complete/tool_error events to diagnose actual user operations.
Each operation has a request_id, propagated as X-Request-ID alongside the
X-Civify-MCP-Tool label to backend calls. Backend request logs include the fixed
operation name, HTTP status, outcome and duration without request bodies, query
strings or credential headers. Labels are diagnostics, not authorization or
idempotency keys. A timeout still has an unknown billing outcome; contact support
before repeating paid work. These synchronous tools do not yet provide durable jobs.
Idle-session eviction is normal. HTTP 200 can contain a tool error; inspect isError.
After rollout, verify OAuth discovery and account linking from ChatGPT, then complete
a workflow with an explicitly chosen test account. Preserve streaming and auth headers
through the proxy. Legacy sessions need a single instance or sticky routing.
Shared workspace context: Knowledge, deployment runbook, backend contracts, and incident review. These references are in the parent workspace; the instructions above are standalone.
Compatibility references: OpenAI MCP server guidance and OpenAI authentication guidance.
MIT - Civify Engineering Team
Available Tools
8 toolscivify_get_accountA
Get user account profile, subscription tier, remaining token balance, and CV credits.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not state whether this is a read-only operation, whether authentication is required, what happens when not authenticated, or whether it hits rate limits. For a zero-param identity/balance tool these are relevant traits an agent would want to know.
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 front-loaded sentence listing exactly what is returned. No filler, no restatement of the tool name.
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?
No output schema, so the description must explain what comes back, and it does list the returned fields. However, it says nothing about auth requirements, read-only nature, error behavior, or units for token/credit balances, which leaves gaps for a tool an agent will call to check state.
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?
Zero parameters, so baseline 4 applies. The description identifies what the single implicit input (the calling user) yields, which is all the parameter-semantic content a zero-param tool can have.
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?
States a specific verb (Get) and resource (user account) and enumerates exactly what is returned: profile, subscription tier, token balance, and CV credits. The sibling tools are all action tools (parse, tailor, score, mask, scrape, track) or a pricing lookup, so this read-only account tool is clearly distinct.
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 (retrieve account info before doing work that consumes tokens or credits) but doesn't explicitly state when to use it versus alternatives. With no siblings competing for the same account-data purpose, the exclusion burden is low, but explicit when-to-use guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
civify_get_pay_per_cv_pricingB
Get localized Pay-Per-CV single unlock pricing (USD base and EGP regional pricing).
| Name | Required | Description | Default |
|---|---|---|---|
No 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 pricing is localized with USD base and EGP regional currencies, which is useful behavioral context. However, it doesn't state whether pricing can change, whether it requires authentication, or how the result is structured. Adequate but with gaps for a no-annotation tool.
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?
A single tight sentence that front-loads the verb and resource, then qualifies the currency scope. No waste.
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 zero-param, no-annotation, no-output-schema tool, the description covers what is fetched and the currency dimensions but omits authentication needs, rate limits, or how pricing is consumed. It is minimally adequate but leaves behavioral questions unanswered.
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?
There are zero parameters, so the baseline is 4. The description confirms no input is needed by describing a pure lookup, which aligns with the empty schema. No further parameter semantics are possible.
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?
States a specific verb (Get) and resource (Pay-Per-CV single unlock pricing), with the added scope of localization and currencies. It is distinguishable from siblings like civify_get_account or civify_score_ats, though it doesn't explicitly name an alternative. Clear but no explicit sibling differentiation beyond the resource name.
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 when-to-use or when-not-to-use guidance is provided. The agent must infer that this is called before a Pay-Per-CV unlock to determine cost, but nothing states that context or any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
civify_mask_piiB
Upload a CV and produce a sanitized, PII-masked version (redacts email, phone, physical address).
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Path to resume file to redact. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it only covers the redaction scope. It does not say whether the original file is modified or preserved, where the sanitized output goes, whether authentication is required, or what the tool returns — all important for an upload/mutation-style tool.
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?
A single front-loaded sentence with no redundant clauses; the action and the redaction scope are both stated compactly and every element earns its place.
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 one-parameter tool with no output schema and no annotations, the description covers the input action and redaction behavior but omits the return value and output-format details the agent needs to chain it with follow-up tools. Adequate but with a clear gap.
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% for the single file_path parameter, so the schema already carries the parameter semantics. The description adds nothing about accepted formats or path conventions, making the baseline 3 appropriate here.
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 gives a specific verb pair (upload + produce) and a precisely scoped resource: a PII-masked CV with the redaction targets enumerated in parentheses (email, phone, physical address). This clearly separates it from siblings like civify_parse_cv or civify_tailor_cv, which handle the same CV artifact for different purposes.
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?
There is no when-to-use guidance and no mention of alternatives, despite several siblings operating on the same CV (parse_cv, tailor_cv, score_ats). The agent must infer from the name alone that this is the privacy/sanitization path rather than the generic parsing path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
civify_parse_cvB
Parse a resume document (PDF, DOCX, image) into structured JSON schema containing contact details, work experience, education, skills, and projects.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Language code (e.g. 'en', 'ar', 'auto'). Default is 'auto'. | auto |
| file_path | Yes | Absolute or relative file path to the resume document (PDF, DOCX, image). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose the output contents (contact, experience, education, skills, projects), which is useful given no output schema. However it says nothing about cost, authentication, file-size limits, or failure modes, and a sibling pricing tool suggests the operation is paid.
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?
A single front-loaded sentence with zero waste that names the input formats and the returned schema sections in one pass.
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?
Since no output schema exists, the description appropriately enumerates the returned fields, making it nearly self-sufficient for a 2-parameter parse tool. Only error behavior and size limits are absent.
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 both parameters are already documented. The description only echoes the format list from file_path and adds no extra meaning about language handling or path resolution.
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?
States a specific verb (parse) and resource (resume document) plus the supported formats and the resulting structured fields. It is clearly the extraction tool among siblings like tailor_cv, score_ats, and mask_pii, though it never names those alternatives.
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 choose this tool over siblings such as civify_tailor_cv or civify_score_ats, nor any prerequisites (e.g., payment via civify_get_pay_per_cv_pricing). Usage must be inferred from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
civify_score_atsB
Calculate general ATS compatibility score and structural audit without needing a full JD.
| Name | Required | Description | Default |
|---|---|---|---|
| resume_id | Yes | UUID of an existing resume in Civify. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not state whether the operation is read-only, what permissions are needed, how the score is returned, or whether the structural audit has side effects; the only extra context is that a full JD is not required.
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 front-loaded sentence with no filler. Every part of the sentence adds useful information: the action, the two outputs, and the key condition for using the tool.
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 one-parameter tool with a fully documented schema and no output schema, the description covers purpose and the main usage condition. It omits details about the score format and what the structural audit includes, but those are not essential for correct invocation.
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 single parameter 'resume_id' is fully documented in the schema as the UUID of an existing resume. The description adds no further parameter meaning, which is acceptable given the high schema coverage 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?
The description states a specific verb ('Calculate') and two concrete outputs ('general ATS compatibility score and structural audit'), so the tool's purpose is clear. It does not explicitly distinguish itself from siblings by name, though the 'without needing a full JD' clause implies a contrast with tools that do require one.
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 phrase 'without needing a full JD' gives an implied usage condition: use this when the full job description is unavailable. However, it does not name alternatives, state when not to use it, or explain what to do if a JD is available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
civify_scrape_jobA
Scrape and extract structured job description, company name, requirements, and responsibilities from a job URL (LinkedIn, Greenhouse, Lever, Ashby, Wuzzuf).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL of the job posting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses a scope constraint by naming supported sources (LinkedIn, Greenhouse, Lever, Ashby, Wuzzuf), which hints at failure modes for unsupported sites, but it omits auth requirements, rate limits, and whether the scrape is live/network-dependent.
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?
A single efficient sentence with the core action front-loaded and the output fields enumerated compactly. The parenthetical platform list is slightly dense but earns its place by defining scope.
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 one-parameter tool with no output schema, the description adequately covers both the input (job URL) and the expected return (job description, company, requirements, responsibilities). Only the platform-failure behavior remains unaddressed.
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?
There is a single parameter whose schema description coverage is 100%, so the baseline is 3. The description adds only the notion that the URL points to a job posting and implies platform compatibility, but gives no syntax or format detail 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?
States a specific verb (scrape and extract) plus the resource (structured job data from a job URL) and enumerates the extracted fields. It is clearly distinct from siblings like civify_parse_cv, civify_tailor_cv, and civify_score_ats, which operate on CVs rather than job postings.
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?
Usage is only implied: an agent can infer it applies when it holds a job posting URL. There is no explicit when-to-use vs. when-not-to-use guidance, no prerequisites, and no mention of what to do with an unsupported URL even though the tool names specific supported platforms.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
civify_tailor_cvB
Tailor a candidate's resume against a target job description. Optimizes bullet points, highlights matching skills, and generates an optional targeted cover letter.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | No | Path to resume document file to tailor. | |
| job_title | No | Target job title. | |
| company_name | No | Target company name. | |
| job_description | Yes | The full text of the job description to tailor against. | |
| generate_cover_letter | No | Whether to generate a matching tailored cover letter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the tailoring actions but not critical traits: whether the source file is overwritten or a new document is produced, what the response contains, or that this appears to be a paid operation (given the civify_get_pay_per_cv_pricing sibling).
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 tightly written sentences, front-loaded with the primary action and followed by the specific transformations, with zero 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?
Adequate for the core purpose, but with no annotations and no output schema the description should say more about the result (does it return tailored text, a file path, a diff?) and cost/auth requirements implied by sibling pricing tools.
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 documents all five parameters. The description reinforces the optional cover-letter toggle via 'optional targeted cover letter,' but adds no format, length, or content expectations 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?
States a specific verb (tailor) and resource (resume/CV) against a target job description, and enumerates sub-actions: optimizing bullets, highlighting matching skills, and generating a cover letter. An agent can distinguish this from siblings like parse_cv or score_ats, though the description never explicitly names those alternatives.
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 choose this over civify_score_ats, civify_parse_cv, or civify_scrape_job, and no ordering/prerequisite hints (e.g., that a resume must be parsed first). Usage is implied by the verb only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
civify_track_applicationC
Record a job application in the candidate's Civify Application Kanban tracker.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | ||
| status | No | APPLIED | |
| job_url | No | ||
| job_title | Yes | ||
| company_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It implies a write operation against a tracker but doesn't disclose key behaviors: how duplicates are handled, whether status transitions are validated, what side effects occur, or what the response contains.
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?
A single efficient sentence with the resource and verb front-loaded. No waste, though minimal content limits its usefulness.
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 5-parameter mutation tool with zero schema descriptions, no annotations, and no output schema, the description is too thin. It omits parameter meanings, the status enum's role, and behavioral expectations the agent would need to call this correctly.
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 0%. Description mentions no parameters at all; the schema lists required company_name and job_title plus optional status enum, notes, and job_url but the description adds no semantics, no default status note, and no enumeration guidance.
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?
States a specific verb (record) and resource (a job application) with its destination (the Civify Application Kanban tracker). It's distinguishable from siblings like tailor_cv and score_ats, but doesn't explicitly delineate against them.
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 when-to-use guidance, no mention of alternatives, and no prerequisite context for recording versus other trackers. The description is purely declarative.
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.
8 tool updates
v1.0.0- First observed
civify_get_account - First observed
civify_get_pay_per_cv_pricing - First observed
civify_mask_pii - First observed
civify_parse_cv - First observed
civify_score_ats - First observed
civify_scrape_job - First observed
civify_tailor_cv - First observed
civify_track_application
TDQS
Scored across 8 tools
Each tool targets a distinct action and resource: parsing, tailoring, ATS scoring, PII masking, job scraping, application tracking, account retrieval, and pricing are all clearly separate. No two tools overlap in purpose.
All tools use the same civify_ prefix followed by a snake_case verb_noun pattern (e.g., civify_parse_cv, civify_tailor_cv). The convention is predictable and consistent throughout.
Eight tools is well-scoped for a CV and job application assistant, with each tool covering a distinct part of the workflow. No tools feel redundant or extraneous.
Core operations for CV parsing, tailoring, ATS scoring, PII masking, job scraping, and application recording are present. However, the application tracker lacks list, update, and delete operations, and account management only supports retrieval, leaving notable lifecycle gaps.
Maintenance
Related MCP Connectors
Auto-apply to jobs: matches your CV, tailors a fresh CV per posting, and applies for you.
Job platform for AI agents. Track tech jobs from companies that match your stack.
Manage job applications — jobs, companies, boards, notes, and profile — from your AI client.
Analyze job listings against your resume, track applications, and generate cover letters.
Related MCP Servers
AlicenseAqualityAmaintenanceResume tailoring, cover letter generation, CV PDF export, and job search tools for AI agents. 18 tools powered by the Laddro Career API.1850 npmMIT- FlicenseNot gradedqualityCmaintenanceEnables AI agents to pull live job listings from major ATS platforms (Greenhouse, Lever, Ashby, Workable), Hacker News hiring threads, and detect hiring signals on company career pages.-
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to upload resumes and receive structured ATS scores with parseability, section coverage, contact-info, and keyword analysis, along with qualitative improvement suggestions via an LLM.-
- AlicenseAqualityBmaintenanceEnables AI agents to search job openings across free sources, prepare application materials using known experience, and handle authorized email sending and follow-ups.92MIT