Applied AI Engineer

Developers

Read-only access to Daniil Kutsyna's profile for agents and scripts. No API key, no sign-up, no sandbox needed: every endpoint is safe to call against production because nothing here writes.

Four ways in, same data:

SurfaceWhereUse it when
REST APIhttps://daniilkutsyna.com/api/v1You want JSON over plain HTTPS
MCP serverhttps://daniilkutsyna.com/mcpYour agent speaks MCP
Docs MCP serverhttps://daniilkutsyna.com/mcp/docsYour agent wants to search or read the documents
WebMCPthe homepageYour agent runs in a browser

Static files, if you would rather fetch a document: llms.txt, cv.md, resume.json, openapi.json.

Quickstart

curl https://daniilkutsyna.com/api/v1/profile
curl "https://daniilkutsyna.com/api/v1/roles?q=fintech&limit=3"
curl https://daniilkutsyna.com/api/v1/roles/nettle-founding-engineer
curl https://daniilkutsyna.com/api/v1/contact

Authentication

None. Do not send a key. Requests with an Authorization header are accepted and the header is ignored.

REST API

Base URL: https://daniilkutsyna.com/api/v1. All endpoints are GET and return application/json. Machine-readable description: openapi.json.

EndpointReturns
GET /api/v1Index of endpoints
GET /api/v1/profilePitch, roles he is open to, great-match list, proof, focus, current role, education, skills
GET /api/v1/rolesWork history, newest first. Paginated. q filters by keyword
GET /api/v1/roles/{slug}One role
GET /api/v1/contactEmail, LinkedIn, GitHub

Pagination

GET /api/v1/roles is cursor-paginated. Parameters: limit (1 to 50, default 5), cursor, q.

{
  "data": [ ... ],
  "pagination": { "limit": 5, "has_more": true, "next_cursor": "bzo1", "total": 13 }
}

Pass next_cursor back as cursor to get the next page. A Link: <...>; rel="next" header carries the same URL. Cursors are opaque; do not build them yourself.

Errors

Errors are RFC 9457 problem details, application/problem+json:

{
  "type": "https://daniilkutsyna.com/developers#error-role_not_found",
  "title": "Role not found",
  "status": 404,
  "code": "role_not_found",
  "detail": "No role with slug \"acme\".",
  "hint": "List valid slugs with GET https://daniilkutsyna.com/api/v1/roles.",
  "instance": "/api/v1/roles/acme"
}
StatuscodeMeaningWhat to do
400invalid_parameterlimit out of rangeUse 1 to 50
400invalid_cursorCursor was not issued by this APIStart again without cursor
404not_foundNo such endpointCheck the table above
404role_not_foundNo role with that slugList slugs with /api/v1/roles
405method_not_allowedNot a GETThe API is read-only
429rate_limitedToo many requestsWait Retry-After seconds

Rate limits

120 requests per minute per IP address, counted separately for the API and for MCP. Every response carries the IETF RateLimit and RateLimit-Policy headers, plus RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset. A 429 adds Retry-After.

Versioning and deprecation

The version is in the path: /api/v1. Within v1, fields are only added, never removed or renamed. A breaking change ships as /api/v2, and v1 then keeps running for at least 90 days while sending Deprecation and Sunset headers (RFC 9745, RFC 8594). Every response names its version in the API-Version header.

MCP server

https://daniilkutsyna.com/mcp, Streamable HTTP, JSON responses, no authentication, no session. Server card: https://daniilkutsyna.com/mcp/server-card.

{
  "mcpServers": {
    "daniil-kutsyna": { "type": "http", "url": "https://daniilkutsyna.com/mcp" }
  }
}
ToolWhat it does
get_profileStart here: pitch, great-match roles, proof, focus, current role
search_experienceCheck a requirement against the track record. query, limit
get_contact_detailsEmail, LinkedIn, GitHub
get_cvThe whole CV: markdown, json or links
draft_messagePrepare an email to Daniil. Returns a mailto link. Sends nothing

The documents are also exposed as MCP resources.

Docs MCP server

https://daniilkutsyna.com/mcp/docs, same transport. Server card: https://daniilkutsyna.com/mcp/docs/server-card.

ToolWhat it does
search_docsFind a phrase across the CV, homepage, site index and these docs
read_docRead one document: llms.txt, cv, homepage, developers

WebMCP

The homepage registers five tools with document.modelContext.registerTool: get_profile, search_experience, get_contact_details, get_cv and get_in_touch. get_in_touch opens a pre-filled email draft in the visitor's own mail app.

Discovery files

Changelog

Contact

Something broken or missing: daniil.kutsyna@gmail.com.