MCP Server

person.work — Agent-maintained CV

work.person/career-record
Knowledge & Documentation Productivity Public & reachable MCP 2025-11-25

What this MCP does

Maintains an authenticated career record, proposes CV changes for review and exposes approved public profile records.

get_my_career_record
Get the authenticated owner's Career Record
Returns the OAuth-authenticated owner's canonical record. Read this before proposing an ongoing CV update so stable experience identifiers and confirmed facts are preserved.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}}
get_profile
Get an opt-in public Career Record
Returns one public Career Record whose owner explicitly enabled MCP visibility. Contact values are excluded.
Read only
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['username'], 'properties': {'format': {'enum': ['full', 'summary'], 'type': 'string', 'default': 'full'}, 'username': {'type': 'string', 'maxLength': 50, 'minLength': 3, 'description': 'The person.work profile slug'}, 'include_extensions': {'type': 'boolean', 'default': True}}}
propose_my_career_change
Propose an ongoing CV change for owner review
Adds a structured, human-readable diff to the owner's review inbox. Experience upserts may include a public HTTPS company_logo_url; person.work imports its own protected copy only after owner approval. Use this for normal maintenance after the initial import; the agent cannot apply or publish it.
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['instruction', 'proposed_patch'], 'properties': {'instruction': {'type': 'string', 'maxLength': 12000, 'minLength': 1}, 'diff_summary': {'type': 'array', 'items': {'type': 'object', 'required': ['path', 'operation'], 'properties': {'path': {'type': 'string', 'maxLength': 300, 'minLength': 1}, 'after': {}, 'before': {}, 'reason': {'type': 'string', 'maxLength': 1000}, 'operation': {'enum': ['add', 'replace', 'remove'], 'type': 'string'}}}, 'default': [], 'maxItems': 100}, 'source_label': {'anyOf': [{'type': 'string', 'maxLength': 300}, {'type': 'null'}]}, 'proposed_patch': {'type': 'object', 'properties': {'profile': {'type': 'object', 'properties': {'summary': {'anyOf': [{'type': 'string', 'maxLength': 12000}, {'type': 'null'}]}, 'headline': {'anyOf': [{'type': 'string', 'maxLength': 300}, {'type': 'null'}]}, 'avatar_url': {'anyOf': [{'type': 'string', 'format': 'uri', 'pattern': '^https:\\/\\/', 'maxLength': 2000}, {'type': 'null'}], 'description': 'Public HTTPS URL of the profile picture. person.work imports and stores a protected copy, cropped to a portrait frame. Use null to remove the current picture and fall back to initials; omit the field to preserve it.'}, 'competencies': {'type': 'array', 'items': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'maxItems': 40}, 'summary_full': {'anyOf': [{'type': 'string', 'maxLength': 20000}, {'type': 'null'}]}, 'summary_short': {'anyOf': [{'type': 'string', 'maxLength': 2000}, {'type': 'null'}]}, 'profession_group': {'anyOf': [{'type': 'string', 'maxLength': 160}, {'type': 'null'}]}, 'spoken_languages': {'type': 'array', 'items': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'maxItems': 40}}, 'additionalProperties': False}, 'extension': {'type': 'object', 'required': ['extension_id', 'fields'], 'properties': {'fields': {'type': 'object', 'propertyNames': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'additionalProperties': {'anyOf': [{'type': 'string', 'maxLength': 320}, {'type': 'array', 'items': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'maxItems': 60}, {'type': 'number'}, {'type': 'object', 'required': ['min', 'max'], 'properties': {'max': {'type': 'number'}, 'min': {'type': 'number'}}, 'additionalProperties': False}]}}, 'extension_id': {'type': 'string', 'maxLength': 120, 'minLength': 1}}, 'description': 'Typed profession fields (e.g. primaryLanguages, seniority). Replaces the stored fields of that extension; omit to leave them untouched.', 'additionalProperties': False}, 'experiences': {'type': 'array', 'items': {'oneOf': [{'type': 'object', 'required': ['operation', 'experience'], 'properties': {'operation': {'type': 'string', 'const': 'upsert'}, 'experience': {'type': 'object', 'required': ['stable_uri', 'company', 'role', 'start_date', 'end_date', 'order_index', 'is_prominent'], 'properties': {'role': {'type': 'string', 'maxLength': 320, 'minLength': 1}, 'result': {'anyOf': [{'type': 'string', 'maxLength': 8000}, {'type': 'null'}]}, 'company': {'type': 'string', 'maxLength': 240, 'minLength': 1}, 'context': {'anyOf': [{'type': 'string', 'maxLength': 8000}, {'type': 'null'}]}, 'problem': {'anyOf': [{'type': 'string', 'maxLength': 8000}, {'type': 'null'}]}, 'end_date': {'anyOf': [{'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$'}, {'type': 'null'}]}, 'headline': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}]}, 'learning': {'anyOf': [{'type': 'string', 'maxLength': 8000}, {'type': 'null'}]}, 'key_result': {'anyOf': [{'type': 'string', 'maxLength': 2000}, {'type': 'null'}]}, 'stable_uri': {'type': 'string', 'maxLength': 200, 'minLength': 3}, 'start_date': {'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$'}, 'order_index': {'type': 'integer', 'maximum': 99, 'minimum': 0}, 'contribution': {'anyOf': [{'type': 'string', 'maxLength': 16000}, {'type': 'null'}]}, 'is_prominent': {'type': 'boolean'}, 'company_logo_url': {'anyOf': [{'type': 'string', 'format': 'uri', 'pattern': '^https:\\/\\/', 'maxLength': 2000}, {'type': 'null'}], 'description': 'Public HTTPS URL of the company logo. person.work imports and stores a protected copy. Use null to remove the current logo; omit the field to preserve it.'}}, 'additionalProperties': False}}, 'additionalProperties': False}, {'type': 'object', 'required': ['operation', 'stable_uri'], 'properties': {'operation': {'type': 'string', 'const': 'remove'}, 'stable_uri': {'type': 'string', 'maxLength': 200, 'minLength': 3}}, 'additionalProperties': False}]}, 'maxItems': 24, 'minItems': 1}}, 'additionalProperties': False}}}
sync_my_profile
Import a complete existing CV for the authenticated owner
Explicit initial-import operation for structured facts already interpreted by the calling agent. It does not accept or store a raw CV, PDF, or source text, and person.work does not run a second AI interpretation. The operation deterministically validates the payload and atomically creates a private profile when needed or replaces the owner's profile facts and complete experience list. Experiences may include a public HTTPS company_logo_url; person.work imports a protected copy. Use null to remove a logo and omit the field to preserve it. Identity is required only for first creation. Never use this for routine updates.
Destructive Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['profile', 'experiences'], 'properties': {'profile': {'type': 'object', 'required': ['headline', 'summary', 'summary_short', 'summary_full', 'profession_group', 'competencies'], 'properties': {'summary': {'type': 'string', 'maxLength': 4000, 'minLength': 1}, 'headline': {'type': 'string', 'maxLength': 240, 'minLength': 1}, 'avatar_url': {'anyOf': [{'type': 'string', 'format': 'uri', 'pattern': '^https:\\/\\/', 'maxLength': 2000}, {'type': 'null'}], 'description': 'Public HTTPS URL of the profile picture. person.work imports and stores a protected copy, cropped to a portrait frame. Use null to remove the current picture and fall back to initials; omit the field to preserve it.'}, 'competencies': {'type': 'array', 'items': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'maxItems': 80}, 'summary_full': {'type': 'string', 'maxLength': 12000}, 'summary_short': {'type': 'string', 'maxLength': 1000}, 'primary_language': {'type': 'string', 'default': 'de', 'maxLength': 12, 'minLength': 2}, 'profession_group': {'type': 'string', 'maxLength': 160, 'minLength': 1}}, 'additionalProperties': False}, 'identity': {'type': 'object', 'required': ['first_name', 'last_name', 'slug'], 'properties': {'slug': {'type': 'string', 'pattern': '^[a-z0-9][a-z0-9-]{1,28}[a-z0-9]$', 'description': 'Requested public slug. Used only when the authenticated owner has no person.work profile yet.'}, 'last_name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'first_name': {'type': 'string', 'maxLength': 120, 'minLength': 1}}, 'description': "Required only when this initial sync creates the authenticated owner's private person.work profile.", 'additionalProperties': False}, 'extension': {'type': 'object', 'required': ['extension_id', 'fields'], 'properties': {'fields': {'type': 'object', 'propertyNames': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'additionalProperties': {'anyOf': [{'type': 'string', 'maxLength': 320}, {'type': 'array', 'items': {'type': 'string', 'maxLength': 160, 'minLength': 1}, 'maxItems': 60}, {'type': 'number'}, {'type': 'object', 'required': ['min', 'max'], 'properties': {'max': {'type': 'number'}, 'min': {'type': 'number'}}, 'additionalProperties': False}]}}, 'extension_id': {'type': 'string', 'maxLength': 120, 'minLength': 1}}, 'description': 'Typed profession fields (e.g. primaryLanguages, seniority). Replaces the stored fields of that extension; omit to leave them untouched.', 'additionalProperties': False}, 'experiences': {'type': 'array', 'items': {'type': 'object', 'required': ['stable_uri', 'company', 'role', 'start_date', 'end_date', 'order_index', 'is_prominent'], 'properties': {'role': {'type': 'string', 'maxLength': 320, 'minLength': 1}, 'result': {'anyOf': [{'type': 'string', 'maxLength': 8000}, {'type': 'null'}]}, 'company': {'type': 'string', 'maxLength': 240, 'minLength': 1}, 'context': {'anyOf': [{'type': 'string', 'maxLength': 8000}, {'type': 'null'}]}, 'problem': {'anyOf': [{'type': 'string', 'maxLength': 8000}, {'type': 'null'}]}, 'end_date': {'anyOf': [{'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$'}, {'type': 'null'}]}, 'headline': {'anyOf': [{'type': 'string', 'maxLength': 500}, {'type': 'null'}]}, 'learning': {'anyOf': [{'type': 'string', 'maxLength': 8000}, {'type': 'null'}]}, 'key_result': {'anyOf': [{'type': 'string', 'maxLength': 2000}, {'type': 'null'}]}, 'stable_uri': {'type': 'string', 'maxLength': 200, 'minLength': 3}, 'start_date': {'type': 'string', 'format': 'date', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$'}, 'order_index': {'type': 'integer', 'maximum': 99, 'minimum': 0}, 'contribution': {'anyOf': [{'type': 'string', 'maxLength': 16000}, {'type': 'null'}]}, 'is_prominent': {'type': 'boolean'}, 'company_logo_url': {'anyOf': [{'type': 'string', 'format': 'uri', 'pattern': '^https:\\/\\/', 'maxLength': 2000}, {'type': 'null'}], 'description': 'Public HTTPS URL of the company logo. person.work imports and stores a protected copy. Use null to remove the current logo; omit the field to preserve it.'}}, 'additionalProperties': False}, 'maxItems': 24, 'minItems': 1}}, 'description': 'Structured CV facts interpreted by the calling agent. Raw files and source text are not part of this contract; person.work validates and stores only this structured payload.', 'additionalProperties': False}
Added
propose_my_career_change
Sept. 17, 2026, 12:55 p.m.
Added
get_my_career_record
Sept. 17, 2026, 12:55 p.m.
Added
sync_my_profile
Sept. 17, 2026, 12:55 p.m.
Added
get_profile
Sept. 17, 2026, 12:55 p.m.