# MCP tools

> Every tool on the public and admin MCP servers, with arguments and examples.

## Servers

| Server | URL | Auth |
| --- | --- | --- |
| Public | `https://jenksguo.pages.dev/mcp` | none |
| Admin | `https://jenksguo.pages.dev/mcp/admin` | `Authorization: Bearer <agent token>` (jgx_agt_…, scoped) |
| Local (stdio) | `jenks mcp` / `jenks mcp --admin` | env `JENKSGUO_ADMIN_TOKEN` for admin |

Transport: Streamable HTTP, stateless, JSON-RPC 2.0 over POST (protocol `2025-06-18`). `GET` on either URL returns a discovery document. Server name `jenksguo`, version 1.4.0.

```bash
curl -s https://jenksguo.pages.dev/mcp -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_brief","arguments":{}}}'
```

# Public tools

## `get_brief` — Get Jenks's brief

A one-page Markdown brief about Jenks Guo: positioning, current role, career arc, strengths, languages, contact, and how to explore further. Start here.

- **MCP:** `get_brief` on `https://jenksguo.pages.dev/mcp`
- **REST:** `GET /api/v1/brief`
- **CLI:** `jenks brief`

_No arguments._

```bash
curl -s "https://jenksguo.pages.dev/api/v1/brief"
```

## `list_experience` — List experience

List Jenks's experiences, projects, community roles and education (newest first), optionally filtered by industry tag, role lens or kind. Returns short forms: title, organisation, period, summary, key result, page URL.

- **MCP:** `list_experience` on `https://jenksguo.pages.dev/mcp`
- **REST:** `GET /api/v1/entries?tag=&lens=&kind=&locale=`
- **CLI:** `jenks list [--tag it] [--lens solution-architect] [--kind project]`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `tag` | `it` · `engineering` · `ai` · `devrel` · `web3` · `business` · `marketing` · `consulting` · `hospitality` · `community` · `creative` | no |  |
| `lens` | `head-of-ai` · `ai-transformation-consultant` · `engineering-manager` · `solution-architect` · `system-integrator` · `support-engineer` · `ict-specialist` · `developer-advocate` · `developer-evangelist` · `digital-marketer` · `hospitality` | no |  |
| `kind` | `experience` · `education` · `community` · `project` | no |  |
| `locale` | `en` · `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | no | Language for translated fields (default en). |

```bash
curl -s "https://jenksguo.pages.dev/api/v1/entries"
```

## `get_entry` — Get one entry

Full long-form write-up of one experience, project, community role or education entry by slug: overview, what Jenks did, achievements, why it matters to employers, key results, skills, proof links.

- **MCP:** `get_entry` on `https://jenksguo.pages.dev/mcp`
- **REST:** `GET /api/v1/entries/{slug}?locale=`
- **CLI:** `jenks get <slug>`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `slug` | string | yes | Entry slug, e.g. xero-developer-evangelist |
| `locale` | `en` · `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | no | Language for translated fields (default en). |

```bash
curl -s "https://jenksguo.pages.dev/api/v1/entries/xero-developer-evangelist"
```

## `list_lenses` — List role lenses

The role lenses employers can view Jenks through (Head of AI, solution architect, developer advocate, digital marketer, hospitality…) with a pitch, honest gaps and evidence counts.

- **MCP:** `list_lenses` on `https://jenksguo.pages.dev/mcp`
- **REST:** `GET /api/v1/lenses?locale=`
- **CLI:** `jenks lenses`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `locale` | `en` · `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | no | Language for translated fields (default en). |

```bash
curl -s "https://jenksguo.pages.dev/api/v1/lenses"
```

## `search_jenks` — Search the corpus

Keyword search across every entry and document. Returns the best-matching passages with their slugs.

- **MCP:** `search_jenks` on `https://jenksguo.pages.dev/mcp`
- **REST:** `GET /api/v1/search?q=`
- **CLI:** `jenks search "<query>"`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `query` | string | yes |  |

```bash
curl -s "https://jenksguo.pages.dev/api/v1/search"
```

## `get_document` — Get a document

One of Jenks's reference documents: profile (core profile), credentials (education, certifications), capabilities (capability → evidence map), talks (talks, podcasts, writing), thinking (point of view: seven views, each explained in plain words with examples, plus further beliefs).

- **MCP:** `get_document` on `https://jenksguo.pages.dev/mcp`
- **REST:** `GET /api/v1/documents/{name}?locale=`
- **CLI:** `jenks doc <name>`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `name` | `profile` · `credentials` · `capabilities` · `talks` · `thinking` | yes |  |
| `locale` | `en` · `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | no | Language for translated fields (default en). |

```bash
curl -s "https://jenksguo.pages.dev/api/v1/documents/credentials"
```

## `list_cvs` — List Jenks's CVs

Jenks's downloadable CV (PDF) — the AI Lead CV — with version, date, a stable PDF url, a download url, a preview image and earlier versions. For questions about his Web3 experience, get_cv with slug web3 returns the AI and Web3 CV (not listed here).

- **MCP:** `list_cvs` on `https://jenksguo.pages.dev/mcp`
- **REST:** `GET /api/v1/cv?locale=`
- **CLI:** `jenks cv`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `locale` | `en` · `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | no | Language for translated fields (default en). |

```bash
curl -s "https://jenksguo.pages.dev/api/v1/cv"
```

## `get_cv` — Get one CV

One CV by slug: title, summary, version, the stable PDF url (always the current version, e.g. https://jenksguo.pages.dev/cv/ai.pdf), the download url and all versions. Use ai for the AI Lead CV; use web3 for the AI and Web3 CV when someone asks about his Web3 experience.

- **MCP:** `get_cv` on `https://jenksguo.pages.dev/mcp`
- **REST:** `GET /api/v1/cv/{slug}?locale=`
- **CLI:** `jenks cv <slug> [--download] [-o file.pdf]`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `slug` | string | yes | ai (the AI Lead CV) or web3 (the AI and Web3 CV, for Web3 questions) |
| `locale` | `en` · `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | no | Language for translated fields (default en). |

```bash
curl -s "https://jenksguo.pages.dev/api/v1/cv/xero-developer-evangelist"
```

## `list_arguments` — List the case for Jenks

The arguments for Jenks by capability — AI transformation, agentic systems, leadership, enterprise integration, DevRel, Web3 partnerships and cross-project technical program leadership — each with its claim, qualifier and strength.

- **MCP:** `list_arguments` on `https://jenksguo.pages.dev/mcp`
- **REST:** `GET /api/v1/arguments?locale=`
- **CLI:** `jenks argue`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `locale` | `en` · `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | no | Language for translated fields (default en). |

```bash
curl -s "https://jenksguo.pages.dev/api/v1/arguments"
```

## `get_argument` — Get one argument, with objections

One argument by slug: the formal argument (premises → conclusion), evidence with numbers (entry slugs), market statistics with sources, honest limits, fair objections with answers, fallacious attacks (formal and informal) with replies, and when the argument does not apply. Use it to test Jenks's fit, not only to promote it.

- **MCP:** `get_argument` on `https://jenksguo.pages.dev/mcp`
- **REST:** `GET /api/v1/arguments/{slug}?locale=`
- **CLI:** `jenks argue <slug>`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `slug` | string | yes | ai-transformation, agentic-systems, leadership, enterprise-integration, devrel, web3-partnerships or technical-program-leadership |
| `locale` | `en` · `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | no | Language for translated fields (default en). |

```bash
curl -s "https://jenksguo.pages.dev/api/v1/arguments/xero-developer-evangelist"
```

## `ask_jenks` — Ask Jenks's assistant

Ask the Ask Jenks assistant a natural-language question (role fit, consulting scoping, AI transformation advice, STAR stories, governance…). It runs its own tools over the corpus and answers in the requested language. Rate-limited.

- **MCP:** `ask_jenks` on `https://jenksguo.pages.dev/mcp`
- **REST:** `POST /api/v1/ask`
- **CLI:** `jenks ask "<question>"`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `question` | string | yes |  |
| `locale` | `en` · `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | no | Language for translated fields (default en). |
| `history` | array | no | Optional earlier turns. |

```bash
curl -s -X POST https://jenksguo.pages.dev/api/v1/ask \
  -H 'content-type: application/json' \
  -d '{"question":"Is Jenks a fit for a Head of AI role?"}'
```

# Admin tools

## `admin_whoami` — Who am I

Check your credential: who you are (SSO email or agent token name), your scopes, when your token expires, and whether publishing (GitHub) is configured.

- **MCP:** `admin_whoami` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `GET /api/admin/whoami` (agent token)
- **Scope:** `read`
- **CLI:** `jenks admin whoami`

_No arguments._

```bash
curl -s "https://jenksguo.pages.dev/api/admin/whoami" \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN"
```

## `admin_audit_log` — Audit log

Recent admin actions, newest first: who (SSO email or agent token), what, which files, branch, host and result. An agent token sees only its own actions.

- **MCP:** `admin_audit_log` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `GET /api/admin/audit?limit=&token=` (agent token)
- **Scope:** `read`
- **CLI:** `jenks admin audit [--limit 50]`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `limit` | integer | no |  |
| `token` | string | no | Only this agent token id (people only) |

```bash
curl -s "https://jenksguo.pages.dev/api/admin/audit" \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN"
```

## `admin_schema` — Content schema

The content model: entry fields and rules, tags, lenses, kinds, writable paths, documents, and editing conventions. Read this before writing.

- **MCP:** `admin_schema` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `GET /api/admin/schema` (agent token)
- **Scope:** `read`
- **CLI:** `jenks admin schema`

_No arguments._

```bash
curl -s "https://jenksguo.pages.dev/api/admin/schema" \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN"
```

## `admin_list_files` — List content files

List editable content files on a branch (path, size, sha), optionally inside one folder such as content/corpus/experiences.

- **MCP:** `admin_list_files` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `GET /api/admin/files?dir=&branch=` (agent token)
- **Scope:** `read`
- **CLI:** `jenks admin ls [dir]`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `dir` | string | no | e.g. content/corpus/projects (default: all content) |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |

```bash
curl -s "https://jenksguo.pages.dev/api/admin/files" \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN"
```

## `admin_read_file` — Read a content file

Read the raw Markdown/JSON source of a content file (with its sha). Pass `path`, or `slug` for an entry, lens or skill.

- **MCP:** `admin_read_file` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `GET /api/admin/file?path=&slug=&branch=` (agent token)
- **Scope:** `read`
- **CLI:** `jenks admin get <slug|path>`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `path` | string | no |  |
| `slug` | string | no |  |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |

```bash
curl -s "https://jenksguo.pages.dev/api/admin/file" \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN"
```

## `admin_validate` — Validate a change

Validate file content against the content schema without committing. Returns a list of problems (empty = valid).

- **MCP:** `admin_validate` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `POST /api/admin/validate` (agent token)
- **Scope:** `read`
- **CLI:** `jenks admin validate <path> <file>`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `path` | string | yes |  |
| `content` | string | yes |  |

```bash
curl -s -X POST https://jenksguo.pages.dev/api/admin/validate \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"path":"content/corpus/projects/example.md","content":"<content>"}'
```

## `admin_write_file` — Create or update a content file

Validate and commit one content file (create or replace). Publishing is automatic: CI re-translates changed entries into all languages, rebuilds and deploys (main → jenksguo.pages.dev and jenksguo.xyz, dev → dev.jenksguo.xyz) in a few minutes.

- **MCP:** `admin_write_file` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `PUT /api/admin/file` (agent token)
- **Scope:** `content` (+ `publish` for branch `main`)
- **CLI:** `jenks admin put <path> <file> -m <message>`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `path` | string | yes |  |
| `content` | string | yes |  |
| `message` | string | yes | Commit message |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |

```bash
curl -s -X PUT https://jenksguo.pages.dev/api/admin/file \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"path":"content/corpus/projects/example.md","content":"<content>","message":"<message>"}'
```

## `admin_delete_file` — Delete a content file

Delete one content file (e.g. remove an entry) with a commit message. Git history keeps it recoverable.

- **MCP:** `admin_delete_file` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `DELETE /api/admin/file?path=&message=&branch=` (agent token)
- **Scope:** `content` (+ `publish` for branch `main`)
- **CLI:** `jenks admin rm <path> -m <message>`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `path` | string | yes |  |
| `message` | string | yes |  |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |

```bash
curl -s -X DELETE https://jenksguo.pages.dev/api/admin/file \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"path":"content/corpus/projects/example.md","message":"<message>"}'
```

## `admin_commit_changes` — Commit several files at once

Validate and commit several file changes as ONE commit. Each change is {path, content} or {path, delete: true}.

- **MCP:** `admin_commit_changes` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `POST /api/admin/changes` (agent token)
- **Scope:** `content` (+ `publish` for branch `main`)
- **CLI:** `jenks admin commit <changes.json> -m <message>`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `changes` | array | yes |  |
| `message` | string | yes |  |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |

```bash
curl -s -X POST https://jenksguo.pages.dev/api/admin/changes \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"changes":"<changes>","message":"<message>"}'
```

## `admin_ai_edit` — Draft an edit with AI

Ask the site's model to rewrite one content file from a plain-English instruction. Returns the proposed content, a diff and validation problems. Does NOT commit — review, then call admin_write_file.

- **MCP:** `admin_ai_edit` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `POST /api/admin/ai-edit` (agent token)
- **Scope:** `content`
- **CLI:** `jenks admin ai-edit <slug|path> "<instruction>" [--apply]`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `path` | string | no |  |
| `slug` | string | no |  |
| `instruction` | string | yes |  |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |
| `content` | string | no | Optional unsaved file text to draft from (default: the saved file). |

```bash
curl -s -X POST https://jenksguo.pages.dev/api/admin/ai-edit \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"instruction":"<instruction>"}'
```

## `admin_read_translation` — Read a translation

One content file in another language: the English source fields, the current translation and its status (current, outdated, edited by hand, missing). Works for entries, lenses, CVs, arguments, point-of-view pages, credentials, talks and the docs. Languages: zh, zh-hant, ja, fr, es, eo.

- **MCP:** `admin_read_translation` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `GET /api/admin/translation?path=&slug=&locale=&branch=` (agent token)
- **Scope:** `read`
- **CLI:** `jenks admin tr get <slug|path> <locale>`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `path` | string | no |  |
| `slug` | string | no |  |
| `locale` | `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | yes |  |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |

```bash
curl -s "https://jenksguo.pages.dev/api/admin/translation" \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN"
```

## `admin_write_translation` — Edit a translation

Write one content file's text in another language (zh, zh-hant, ja, fr, es, eo) — for example a better Chinese summary. Give only the fields to change; read admin_read_translation first for the field names. Markdown must keep the English headings, code blocks and links. The edit is kept until the English changes; then that language is translated again automatically. English is the source: change it with admin_write_file.

- **MCP:** `admin_write_translation` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `PUT /api/admin/translation` (agent token)
- **Scope:** `content` (+ `publish` for branch `main`)
- **CLI:** `jenks admin tr put <slug|path> <locale> <fields.json> -m <message>`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `path` | string | no |  |
| `slug` | string | no |  |
| `locale` | `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | yes |  |
| `fields` | object | yes | e.g. {"summary": "…", "body": "## …"} |
| `message` | string | no | Commit message |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |

```bash
curl -s -X PUT https://jenksguo.pages.dev/api/admin/translation \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"locale":"<locale>","fields":"<fields>"}'
```

## `admin_read_copy` — Read site copy

The site's interface text in one language — menus, page titles, the one-line page intros, the hero headline, buttons, SEO descriptions — as key → text, with the English (and Chinese for zh-hant) alongside. Filter with prefix, e.g. hero or career.

- **MCP:** `admin_read_copy` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `GET /api/admin/copy?locale=&prefix=&branch=` (agent token)
- **Scope:** `read`
- **CLI:** `jenks admin copy get <locale> [prefix]`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `locale` | `en` · `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | yes |  |
| `prefix` | string | no |  |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |

```bash
curl -s "https://jenksguo.pages.dev/api/admin/copy" \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN"
```

## `admin_write_copy` — Edit site copy

Change interface text in one language: values is key → text ("" removes your edit). en and zh are the hand-written sources: an English change is translated into ja, fr, es and eo automatically — also set zh. An edit in another language is kept until its source text changes. Keep {placeholders} exactly.

- **MCP:** `admin_write_copy` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `PUT /api/admin/copy` (agent token)
- **Scope:** `content` (+ `publish` for branch `main`)
- **CLI:** `jenks admin copy set <locale> <key> "<text>" -m <message>`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `locale` | `en` · `zh` · `zh-hant` · `ja` · `fr` · `es` · `eo` | yes |  |
| `values` | object | yes | e.g. {"hero.sub": "…"} |
| `message` | string | no |  |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |

```bash
curl -s -X PUT https://jenksguo.pages.dev/api/admin/copy \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"locale":"<locale>","values":"<values>"}'
```

## `admin_deploy_status` — Deploy status

Recent CI runs (translate → build → deploy) with status, branch, commit and links.

- **MCP:** `admin_deploy_status` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `GET /api/admin/deploys?branch=` (agent token)
- **Scope:** `read`
- **CLI:** `jenks admin deploys`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |

```bash
curl -s "https://jenksguo.pages.dev/api/admin/deploys" \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN"
```

## `admin_promote` — Promote dev to production

Merge the dev branch into main, publishing everything previewed on dev.jenksguo.xyz to the live site (jenksguo.pages.dev and jenksguo.xyz).

- **MCP:** `admin_promote` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `POST /api/admin/promote` (agent token)
- **Scope:** `publish`
- **CLI:** `jenks admin promote`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `message` | string | no |  |

```bash
curl -s -X POST https://jenksguo.pages.dev/api/admin/promote \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{}'
```

## `admin_publish_cv` — Publish a new CV version

Upload a new PDF for a CV (ai, web3 or a new slug) and make it the current version in one step: the PDF goes to the media library, the previous version moves to the CV's history (still downloadable), and the change is committed (CI publishes it). Optional preview image and new title/summary. The stable url /cv/<slug>.pdf then serves the new file.

- **MCP:** `admin_publish_cv` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `POST /api/admin/cv` (agent token)
- **Scope:** `content` + `media` (+ `publish` for branch `main`)
- **CLI:** `jenks admin cv publish <slug> <file.pdf> --cv-version 2026.10 [--preview /media/…]`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `slug` | string | yes | ai, web3, or a new kebab-case id |
| `version` | string | yes | e.g. 2026.10 |
| `filename` | string | no |  |
| `data` | string | no | PDF bytes, base64 |
| `url` | string | no | Alternative to data: https URL of the PDF |
| `preview` | string | no | Optional: an already uploaded /media/… image of page 1 |
| `title` | string | no |  |
| `summary` | string | no |  |
| `message` | string | no | Commit message |
| `branch` | `main` · `dev` | no | main publishes the live site (jenksguo.pages.dev and its mirror jenksguo.xyz); dev previews on dev.jenksguo.xyz (default main). |

```bash
curl -s -X POST https://jenksguo.pages.dev/api/admin/cv \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"slug":"<slug>","version":"<version>"}'
```

## `admin_list_media` — List media

List uploaded images, videos and PDFs (newest first): url, type, size, dimensions, alt text, ready-to-paste Markdown, and which entries use each file.

- **MCP:** `admin_list_media` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `GET /api/admin/media?prefix=&cursor=&limit=` (agent token)
- **Scope:** `read`
- **CLI:** `jenks admin media ls [prefix]`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `prefix` | string | no | Key prefix such as 2026/10 |
| `cursor` | string | no |  |
| `limit` | integer | no |  |

```bash
curl -s "https://jenksguo.pages.dev/api/admin/media" \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN"
```

## `admin_upload_media` — Upload media

Store an image (webp, jpg, png, gif, avif, svg), video (mp4, webm) or PDF, up to 25 MB, in Cloudflare R2 and get its public /media/… url and Markdown. Send base64 `data` with a `filename`, or a public https `url` to import. Files are public by URL immediately; reference them from content with admin_write_file. The REST endpoint also accepts multipart/form-data (field `file`).

- **MCP:** `admin_upload_media` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `POST /api/admin/media` (agent token)
- **Scope:** `media`
- **CLI:** `jenks admin media upload <file|https-url> [--alt "…"]`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `filename` | string | no | Original file name; becomes the readable part of the url. |
| `data` | string | no | File bytes, base64 (a data: URL prefix is allowed). |
| `url` | string | no | Alternative to data: an https URL the server downloads. |
| `alt` | string | no | Alt text: what the image shows, for screen readers and the bot. |
| `width` | integer | no |  |
| `height` | integer | no |  |

```bash
curl -s -X POST https://jenksguo.pages.dev/api/admin/media \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{}'
```

## `admin_update_media` — Update media alt text

Change the stored alt text of an uploaded file (the default alt when it is inserted into content).

- **MCP:** `admin_update_media` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `PATCH /api/admin/media` (agent token)
- **Scope:** `media`
- **CLI:** `jenks admin media alt <key> "<alt text>"`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `key` | string | yes | Media key or url, e.g. 2026/10/xero-talk-1a2b3c4d5e.webp |
| `alt` | string | yes |  |

```bash
curl -s -X PATCH https://jenksguo.pages.dev/api/admin/media \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"key":"<key>","alt":"<alt>"}'
```

## `admin_delete_media` — Delete media

Permanently delete an uploaded file. Refused while published content still uses it, unless force is true. Not recoverable — unlike content files there is no git history.

- **MCP:** `admin_delete_media` on `https://jenksguo.pages.dev/mcp/admin`
- **REST:** `DELETE /api/admin/media?key=&force=` (agent token)
- **Scope:** `media`
- **CLI:** `jenks admin media rm <key> [--force]`

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `key` | string | yes |  |
| `force` | boolean | no |  |

```bash
curl -s -X DELETE https://jenksguo.pages.dev/api/admin/media \
  -H "Authorization: Bearer $JENKSGUO_ADMIN_TOKEN" \
  -H 'content-type: application/json' \
  -d '{"key":"<key>"}'
```

