# info.summary
Public, read-only JSON API, MCP endpoint and markdown endpoint for www.tomborvan.com.

# info.description
Structured access to the professional profile of Tom Borvan, also written Tom Børvan: role, projects, career timeline, skills, essays and contact channels. Everything is public and read-only, requires no authentication, allows cross-origin reads, and is cached for up to an hour. Errors use RFC 9457 Problem Details (application/problem+json) with a stable `code` and a `resolution` hint. The same data is available over MCP at /api/mcp and as markdown via `Accept: text/markdown`.

# tags[].description
Plain-text profiles for language models.

# paths./api/v1.get.description
Lists every REST endpoint with its operationId, plus links to the OpenAPI document, developer docs, MCP manifests and discovery files.

# paths./api/v1/profile.get.description
Returns the structured profile: name, job title, employer, location, summary, specialisations, AI skills, differentiators, education, certifications, spoken languages, availability and links.

# paths./api/v1/projects.get.description
Returns featured projects and work history in display order: title, company, year, description, URL, tags and metrics.

# paths./api/v1/timeline.get.description
Returns the career timeline, newest first: year, organisation, role, description and metrics.

# paths./api/v1/skills.get.description
Returns skill categories (project leadership, e-commerce and web, marketing and analytics, AI and automation, technical foundation) and spoken languages with proficiency.

# paths./api/v1/contact.get.description
Returns email, LinkedIn, X, website, location and employer. Email is the preferred channel.

# paths./api/v1/writing.get.description
Returns all published essays, newest first: slug, title, dek, date, reading time, HTML URL and markdown URL.

# paths./api/v1/writing/{slug}.get.description
Returns one essay by slug, including the full body rendered as markdown.

# paths./api/v1/writing/{slug}.get.responses.404.description
No essay with that slug (code article_not_found).

# paths./api/mcp.get.description
Informational GET: returns the transport, protocol versions, tool and resource names, and links to the server card and docs. MCP clients should POST JSON-RPC 2.0 to this same URL.

# paths./api/mcp.post.summary
MCP Streamable HTTP endpoint (JSON-RPC 2.0)

# paths./api/mcp.post.description
Model Context Protocol server over Streamable HTTP. Send JSON-RPC 2.0 requests (initialize, tools/list, tools/call, resources/list, resources/read). Clients must accept both application/json and text/event-stream. Tools: get_profile, list_projects, list_timeline, list_skills, get_contact_info. Resources: profile://brief, profile://full. No authentication.

# paths./api/mcp.post.responses.200.description
JSON-RPC response, as application/json or as a text/event-stream carrying JSON-RPC messages.

# paths./api/mcp.post.responses.400.description
Body is not valid JSON or not a JSON-RPC request (JSON-RPC error -32700 or -32600).

# paths./api/mcp.post.responses.406.description
Client does not accept both application/json and text/event-stream (JSON-RPC error -32000).

# paths./api/markdown.get.description
Returns the markdown representation of a page. Equivalent to requesting the page with `Accept: text/markdown`. Supported paths: / (full profile), /writing, /writing/{slug}, /developers, /privacy. Unknown paths return a 404 markdown document with navigation links.

# paths./api/markdown.get.responses.404.description
Unknown path; body is a markdown page with recovery links.

# paths./llms.txt.get.description
About 1 KB of markdown: role, location, key differentiators, skills, featured work, writing, agent endpoints, contact, and when to use this site.

# paths./llms-full.txt.get.description
Detailed markdown profile: education, career timeline, projects, skills, writing, FAQ and contact.

# components.schemas.Problem.description
RFC 9457 Problem Details with a stable machine-readable code.

# components.schemas.Profile.properties.resources.description
Other machine-readable surfaces for the same profile.

# components.schemas.ProjectList.properties.source.description
Where the data came from: the Sanity CMS, or the site's bundled defaults when the CMS is unavailable.

# components.schemas.TimelineList.properties.source.description
Where the data came from: the Sanity CMS, or the site's bundled defaults when the CMS is unavailable.

# components.schemas.SkillsResponse.properties.sources.properties.categories.description
Where the data came from: the Sanity CMS, or the site's bundled defaults when the CMS is unavailable.

# components.schemas.SkillsResponse.properties.sources.properties.languages.description
Where the data came from: the Sanity CMS, or the site's bundled defaults when the CMS is unavailable.