Resume Skill Extraction
Overview
This skill extracts structured skill, qualification, and experience data from resume information stored in ServiceNow's talent management modules. It helps you:
- Parse and extract skills, certifications, and qualifications from candidate records
- Map extracted skills to organizational competency frameworks
- Compare candidate qualifications against job requisition requirements
- Identify skill gaps and strengths relative to target positions
- Populate talent profile records with structured skill data
- Support bulk extraction for talent pipeline analysis
When to use: When recruiters or HR talent teams need to systematically extract and categorize skills from candidate applications, match candidates to open requisitions, or build competency profiles for workforce planning.
Prerequisites
- Roles:
sn_hr_tm.recruiter,sn_hr_tm.hiring_manager, orsn_hr_core.manager - Plugins:
com.sn_hr_service_delivery(HR Service Delivery),com.sn_hr_talent_management(Talent Management) - Access: Read/write access to
sn_hr_tm_candidate,sn_hr_tm_skill,sn_hr_tm_competency, andsn_hr_tm_job_requisition - Knowledge: Understanding of your organization's competency framework and job family structure
Procedure
Step 1: Retrieve Candidate Record
Fetch the candidate profile that contains resume data and application details.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_tm_candidate
query: number=[candidate_number]
fields: sys_id,number,first_name,last_name,email,phone,source,stage,resume_text,resume_content,current_title,current_employer,years_experience,education_level,location,skills_summary
limit: 1
Using REST API:
GET /api/now/table/sn_hr_tm_candidate?sysparm_query=number=[candidate_number]&sysparm_fields=sys_id,number,first_name,last_name,email,phone,source,stage,resume_text,resume_content,current_title,current_employer,years_experience,education_level,location,skills_summary&sysparm_display_value=true&sysparm_limit=1
Step 2: Retrieve Resume Attachment
If the resume is stored as an attachment rather than in a text field, fetch the attachment metadata.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sys_attachment
query: table_name=sn_hr_tm_candidate^table_sys_id=[candidate_sys_id]^content_typeLIKEpdf^ORcontent_typeLIKEdoc^ORcontent_typeLIKEtext
fields: sys_id,file_name,content_type,size_bytes,sys_created_on
limit: 5
Using REST API:
GET /api/now/table/sys_attachment?sysparm_query=table_name=sn_hr_tm_candidate^table_sys_id=[candidate_sys_id]&sysparm_fields=sys_id,file_name,content_type,size_bytes,sys_created_on&sysparm_limit=5
# Download attachment content:
GET /api/now/attachment/{attachment_sys_id}/file
Step 3: Retrieve Target Job Requisition
Fetch the job requisition to understand required skills and qualifications for comparison.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_tm_job_requisition
query: number=[requisition_number]
fields: sys_id,number,title,description,department,location,job_family,required_skills,preferred_skills,minimum_education,minimum_experience,competencies,status,hiring_manager
limit: 1
Using REST API:
GET /api/now/table/sn_hr_tm_job_requisition?sysparm_query=number=[requisition_number]&sysparm_fields=sys_id,number,title,description,department,location,job_family,required_skills,preferred_skills,minimum_education,minimum_experience,competencies,status,hiring_manager&sysparm_display_value=true&sysparm_limit=1
Step 4: Fetch Organizational Competency Framework
Retrieve the competency definitions that skills should be mapped to.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_tm_competency
query: active=true^job_familyLIKE[target_job_family]
fields: sys_id,name,description,category,proficiency_levels,job_family,required_level,active
limit: 50
Using REST API:
GET /api/now/table/sn_hr_tm_competency?sysparm_query=active=true^job_familyLIKEEngineering&sysparm_fields=sys_id,name,description,category,proficiency_levels,job_family,required_level&sysparm_display_value=true&sysparm_limit=50
Step 5: Retrieve Existing Skill Taxonomy
Pull the organization's skill taxonomy to map extracted skills to standardized entries.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_tm_skill
query: active=true
fields: sys_id,name,category,skill_type,description,active
limit: 200
Using REST API:
GET /api/now/table/sn_hr_tm_skill?sysparm_query=active=true&sysparm_fields=sys_id,name,category,skill_type,description&sysparm_display_value=true&sysparm_limit=200
Step 6: Extract and Categorize Skills from Resume
Parse the resume text and categorize extracted information:
=== SKILL EXTRACTION RESULTS ===
Candidate: John Martinez (CND0004521)
Current: Senior DevOps Engineer at TechCorp
Experience: 8 years
--- Technical Skills ---
| Skill | Proficiency | Years | Matched Taxonomy Entry |
|---------------------|-------------|-------|------------------------|
| Kubernetes | Expert | 5 | SKL0001234 - Kubernetes |
| AWS (EC2, S3, Lambda)| Expert | 6 | SKL0001201 - AWS Cloud |
| Terraform | Advanced | 4 | SKL0001256 - Terraform |
| Python | Advanced | 7 | SKL0001102 - Python |
| Jenkins/CI-CD | Expert | 6 | SKL0001189 - CI/CD |
| Docker | Expert | 5 | SKL0001233 - Docker |
| Ansible | Intermediate| 2 | SKL0001267 - Ansible |
--- Certifications ---
| Certification | Date | Mapped Qualification |
|--------------------------------------|---------|----------------------|
| AWS Solutions Architect Professional | 2024-06 | QAL0000456 |
| Certified Kubernetes Administrator | 2023-11 | QAL0000489 |
| HashiCorp Terraform Associate | 2025-01 | QAL0000512 |
--- Education ---
| Degree | Institution | Year |
|---------------------------|----------------------|------|
| B.S. Computer Science | State University | 2018 |
| M.S. Information Systems | Tech University | 2021 |
--- Soft Skills ---
- Team Leadership (managed team of 6)
- Cross-functional collaboration
- Incident management and on-call coordination
- Technical documentation and knowledge sharing
--- Unmapped Skills (New to Taxonomy) ---
- Pulumi (Infrastructure as Code - no taxonomy match)
- Backstage (Developer Portal - no taxonomy match)
Step 7: Compare Against Job Requirements
Match extracted skills against the target requisition:
=== SKILL GAP ANALYSIS ===
Requisition: REQ0002345 - Staff Site Reliability Engineer
Department: Platform Engineering
--- Required Skills Match ---
| Required Skill | Status | Candidate Level | Required Level |
|---------------------|---------|-----------------|----------------|
| Kubernetes | MATCH | Expert | Advanced |
| Cloud Platform (AWS) | MATCH | Expert | Advanced |
| CI/CD Pipelines | MATCH | Expert | Intermediate |
| Python or Go | PARTIAL | Python-Advanced | Advanced |
| Monitoring (Datadog) | GAP | Not found | Intermediate |
--- Preferred Skills Match ---
| Preferred Skill | Status | Candidate Level |
|----------------------|---------|-----------------|
| Terraform/IaC | MATCH | Advanced |
| Incident Response | MATCH | Experienced |
| Service Mesh (Istio) | GAP | Not found |
--- Competency Alignment ---
| Competency | Required Level | Assessed Level | Status |
|-------------------------|----------------|----------------|--------|
| Infrastructure Design | Level 4 | Level 4 | MET |
| Automation Engineering | Level 4 | Level 5 | EXCEEDS|
| Observability | Level 3 | Level 2 | GAP |
| Leadership | Level 3 | Level 3 | MET |
Overall Match Score: 82% (Strong Candidate)
Key Gaps: Monitoring/Observability tooling, Service Mesh
Key Strengths: Infrastructure automation, Cloud architecture, CI/CD
Step 8: Update Candidate Record with Extracted Skills
Write the structured skill data back to the candidate profile.
Using MCP:
Tool: SN-Update-Record
Parameters:
table_name: sn_hr_tm_candidate
sys_id: [candidate_sys_id]
data:
skills_summary: "Kubernetes(Expert), AWS(Expert), Terraform(Advanced), Python(Advanced), Docker(Expert), CI/CD(Expert), Ansible(Intermediate)"
education_level: "Masters"
years_experience: 8
Using REST API:
PATCH /api/now/table/sn_hr_tm_candidate/[candidate_sys_id]
Content-Type: application/json
{
"skills_summary": "Kubernetes(Expert), AWS(Expert), Terraform(Advanced), Python(Advanced), Docker(Expert), CI/CD(Expert), Ansible(Intermediate)",
"education_level": "Masters",
"years_experience": 8
}
Tool Usage
MCP Tools Reference
| Tool | When to Use |
|---|---|
SN-Query-Table |
Query candidates, requisitions, skills taxonomy, competencies |
SN-Natural-Language-Search |
Natural language search for matching candidates or roles |
SN-Get-Record |
Retrieve full candidate record with resume content |
SN-Update-Record |
Write extracted skill data back to candidate profiles |
REST API Reference
| Endpoint | Method | Purpose |
|---|---|---|
/api/now/table/sn_hr_tm_candidate |
GET/PATCH | Candidate records and resume data |
/api/now/table/sn_hr_tm_job_requisition |
GET | Job requisition requirements |
/api/now/table/sn_hr_tm_skill |
GET | Organizational skill taxonomy |
/api/now/table/sn_hr_tm_competency |
GET | Competency framework definitions |
/api/now/table/sn_hr_tm_qualification |
GET | Certification and qualification records |
/api/now/table/sys_attachment |
GET | Resume file attachments |
Best Practices
- Normalize skill names: Map variations (e.g., "k8s", "Kube", "Kubernetes") to the single canonical taxonomy entry
- Preserve original text: Keep the raw extracted text alongside normalized mappings for audit purposes
- Handle multi-format resumes: Support PDF, DOCX, and plain text; extraction quality varies by format
- Validate certifications: Cross-reference certification claims with known certification bodies and expiry dates
- Use proficiency indicators: Infer proficiency from context (years of use, project complexity, leadership role) rather than self-reported levels alone
- Respect data privacy: Resume data is PII; limit extraction results to authorized recruiting personnel
- Update taxonomy regularly: Flag unmapped skills for taxonomy administrators to review and potentially add
Troubleshooting
"Resume text field is empty"
Cause: Resume may be stored only as an attachment, not parsed into the text field
Solution: Query sys_attachment for the candidate record and download the file content via the attachment API
"No matching skills in taxonomy"
Cause: Organization's skill taxonomy may not cover all technical domains Solution: Record unmapped skills separately and flag them for taxonomy expansion; do not discard unmatched skills
"Candidate application not linked to requisition"
Cause: The application record may use a different reference field
Solution: Query sn_hr_tm_candidate_application with candidate=[candidate_sys_id] to find the linking record and requisition reference
"Competency framework returns empty"
Cause: Competencies may not be tagged by job family or may use a different categorization
Solution: Query without the job_family filter and manually match competencies based on description and category
Examples
Example 1: Single Candidate Screening
Input: "Extract skills from candidate CND0004521 for requisition REQ0002345"
Steps:
- Query
sn_hr_tm_candidatefor resume data - Query
sn_hr_tm_job_requisitionfor requirements - Fetch skill taxonomy from
sn_hr_tm_skill - Extract and categorize skills from resume text
- Run gap analysis against requisition
- Update candidate record with structured data
Example 2: Bulk Pipeline Analysis
Input: "Extract skills from all candidates applying to Engineering requisitions"
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_tm_candidate_application
query: job_requisition.departmentLIKEEngineering^status=active
fields: sys_id,candidate,job_requisition,status,applied_date,stage
limit: 50
Then iterate through each candidate to extract and compare skills.
Example 3: Internal Mobility Skill Assessment
Input: "Assess current employee's skills for an internal transfer"
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_core_profile
query: user=[employee_sys_id]
fields: sys_id,user,department,job_title,skills,certifications,education,years_in_role
limit: 1
Compare the employee's existing profile skills against the target role requirements using the same gap analysis framework.
Related Skills
hrsd/persona-assistant- Personalized HR guidance for internal mobilityhrsd/case-summarization- Summarize HR cases related to talent processeshrsd/sentiment-analysis- Assess candidate experience sentimentknowledge/duplicate-detection- Detect duplicate candidate profilesreporting/trend-analysis- Analyze skill demand trends across requisitions