# VOLO for agents

VOLO assesses, task by task, how AI, robotics, autonomous driving and process automation are changing specific occupations and degrees.
Every task judgement says whether it is evidenced by a verified public record or inferred, and what it does not establish.
Six languages: en, zh, ja, es, pt, fr. Everything on this page is free. Nothing needs a key except the personal MCP, which is also free and needs only an email.

This page lists every machine interface. It changes only when an interface changes. For what the site holds today and how to read it, see https://flyvolo.ai/llms.txt.

## Rules for answering with VOLO

- The unit is the task. Do not summarise an occupation as one verdict.
- Never give a number of years, a probability of losing a job, or a risk score. The impact index is not a probability; when you mention it, give its confidence and its assessment date.
- Never say who to make redundant. VOLO does not recommend vendors.
- Say whether a judgement is evidenced or inferred, and link the page you used.
- Work out yourself which job the person means and pass only that title to resolve_occupation_or_major. If it returns null, read the list from describe_coverage before saying VOLO does not cover the job. A job VOLO does not cover is a gap in VOLO, not a statement about the job.

## 1. MCP server (public, no key)

- Endpoint: https://mcp.flyvolo.ai/mcp
- Transport: Streamable HTTP, JSON-RPC 2.0, protocol version 2025-06-18. Stateless: no session, no sign-up.
- Read-only. Every tool also accepts `locale` (en, zh, ja, es, pt, fr).

Add it:

- Claude Code: `claude mcp add --transport http volo https://mcp.flyvolo.ai/mcp`
- Claude (desktop or web) and ChatGPT: add a custom connector and give it the endpoint above.
- Cursor: in .cursor/mcp.json, `{"mcpServers": {"volo": {"url": "https://mcp.flyvolo.ai/mcp"}}}`

Try it:

```sh
curl -s https://mcp.flyvolo.ai/mcp -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

curl -s https://mcp.flyvolo.ai/mcp -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"resolve_occupation_or_major","arguments":{"query":"taxi driver","locale":"en"}}}'
```

### Tools (19)

#### resolve_occupation_or_major

Resolve a job title, a company's internal name for a role, a nickname or a degree name to a canonical VOLO entity. Call this FIRST whenever a person names their job. It matches names; it does not read sentences — so work out yourself which job the person means and pass only that title, in the singular ("taxi driver", not "Will robotaxis replace taxi drivers?"). Returns a match field of exact or approximate — when it is approximate, say which entity you read the question as. Null means this name did not match, not yet that VOLO lacks the job: before saying VOLO does not cover it, call describe_coverage and read its list of covered occupations and degrees — if one of them is what the person means (a synonym, a broader or narrower name), use that one and say which you chose. Only if none fits is it a gap in this site, which is not a statement about the job.

```json
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "query"
  ]
}
```

#### search

Search occupations, majors and verified change records by keyword. Returns entries, not judgements.

```json
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    },
    "limit": {
      "type": "number"
    }
  },
  "required": [
    "query"
  ]
}
```

#### get_occupation

Full task-level assessment of one occupation. Every task carries direction, basis (evidenced vs inferred) and limits — what that judgement does NOT establish. The impact index is not a probability of job loss and never appears without its confidence and assessment date.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### get_ontology

Where an occupation or a degree sits in the official classifications (U.S. Department of Labor O*NET 31.0; U.S. Department of Education CIP–SOC crosswalk; the EU's ESCO, the ILO's ISCO-08 and Singapore's SSOC 2024): the matching codes with how well each fits, the skills, knowledge and work activities O*NET rates highest (as O*NET's own importance words, no numbers), related occupations and which degrees lead to it; each of this site's tasks aligned to O*NET detailed work activities (or why none fits); and the rules this site's verified records read, with the verb that matters and whom it binds. For a degree: where the official crosswalk and this site's paths agree and disagree. Every block names its source. O*NET says what a job demands, not what automation is doing to it; never combine it with the impact index.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### query_ontology

Walk the VOLO Ontology directly. No arguments: the object types and link types. `type`: the objects of that type. `type` + `id`: one object's properties and everything it links to, grouped by link. Add `link` (and `direction`: out|in) to follow one link. Types include Occupation, Task, TaskJudgement, Evidence, Regulation, WorkActivity and ClassificationConcept. Read-only; judgements keep their basis and limits, evidence its scope — carry them into the answer. No aggregate score exists.

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string"
    },
    "id": {
      "type": "string"
    },
    "link": {
      "type": "string"
    },
    "direction": {
      "type": "string",
      "enum": [
        "out",
        "in"
      ]
    },
    "locale": {
      "type": "string"
    }
  }
}
```

#### get_role_tasks

The task breakdown for one occupation. The unit of assessment is the task, never the job title.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### find_evidence

Verified evidence records for an occupation, optionally for one task. Each record carries its scope (where it applies), its stage, whether that stage can move a task judgement at all, and its source tier. Repeat the scope rather than smoothing it away.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "taskId": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### get_change

One verified change record by id, with VOLO's reading: what it means, what it does not yet establish, and what a reader can verify themselves.

```json
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ]
}
```

#### find_affected

Which occupation and which specific tasks a change record bears on.

```json
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ]
}
```

#### get_change_history

The verified change timeline for an occupation, oldest first.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### find_transition_paths

Options for someone in this occupation. Every path carries its real constraints (time, pay cut, seniority) and one action they can take this week that produces information. Never present a path without its constraint.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### get_action_brief

Use this when a person asks what they should do about AI or automation in their job ("I'm an accountant, how do I stay employable?"). One call returns, task by task: where the task is heading and how strong the evidence is; which laws, regulators, courts or collective agreements keep that task (or its signature) with a person; which employers or regulators have already moved it; and transition paths, each with its real constraints and one thing to check this week. Pass the job title as the person said it (any language) or a slug; optionally the task ids they actually do. Build your advice on these facts, keep each record's scope and each task's limits, and never turn it into a probability, a score or a number of years.

```json
{
  "type": "object",
  "properties": {
    "occupation": {
      "type": "string",
      "description": "Job title in the person's words, or an occupation slug"
    },
    "taskIds": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "occupation"
  ]
}
```

#### list_business_functions

For the business side: the functions a company is organised into, and which occupations sit in each. Use this when someone describes a company rather than themselves.

```json
{
  "type": "object",
  "properties": {
    "locale": {
      "type": "string"
    }
  }
}
```

#### get_major

A degree and the occupations it feeds. There is no score for a major and never will be — answer 'should I switch majors' by pointing at where it leads and what transfers.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### find_majors_for_occupation

Which degrees lead into this occupation.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### find_notes

VOLO's long-form answers to the big questions — how many jobs AI has actually taken, what actually gets automated, how long someone has, what AI law already changed, where AI lands in a company. Call this FIRST for any question that is about the whole picture rather than one occupation: those are exactly the questions you can answer fluently without evidence, and these notes are the evidence. Each result carries the note's own limits.

```json
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  }
}
```

#### get_note

The full text of one note, section by section, each section with the verified records it rests on. Use it when you need to quote or cite rather than summarise.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### find_notes_for_occupation

Which notes argue from this occupation's own records or task judgements. Use it to point someone from their own page to the wider answer.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "locale": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### describe_coverage

What VOLO covers and what it does not: the full list of covered occupations and degrees (slug and name), which occupations have no evidence yet, and the counts. Call this when someone asks whether their job is covered, and whenever resolve_occupation_or_major returns null — then decide from the list which entry, if any, the person means. The answer is a fact about this site rather than a guess about their job.

```json
{
  "type": "object",
  "properties": {
    "locale": {
      "type": "string"
    }
  }
}
```

## 2. A2A agent (public, no key)

- Agent card: https://flyvolo.ai/.well-known/agent-card.json (the same card is at https://mcp.flyvolo.ai/.well-known/agent-card.json)
- Endpoint: https://mcp.flyvolo.ai/a2a — JSON-RPC. A2A 1.0 and 0.3: send the header `A2A-Version: 1.0`; no header means 0.3.
- Tasks complete synchronously and are not stored. To continue a conversation, send back the contextId you received (kept 24 hours).
- The `ask` skill uses a language model and has a per-IP limit and a site-wide daily budget (300 a day); when either is reached it answers with structured data instead. The other skills use no model.

Skills:

- `ask` — Ask about an occupation or a degree: Answers a natural-language question about how automation is changing a specific occupation, task or degree, from VOLO's published assessments and verified records only: each task's direction, whether it is evidenced or inferred, what the judgement does not establish, and links to the pages and records cited. Answers in the language of the question. If VOLO does not cover something it says so rather than improvising. Send the returned contextId to continue the conversation.
- `occupation-assessment` — Structured occupation or degree assessment: Send a job title or degree name as text, or a data part {"occupation": "<title or slug>", "locale": "en|zh|ja|es|pt|fr"} (or {"major": "..."}). Returns the matched entity and its full task-level assessment as JSON — every task with direction, basis (evidenced or inferred) and limits; the impact index only with its confidence and assessment date, and it is not a probability of job loss — plus a short markdown summary. Deterministic: no language model. Returns a plain statement when VOLO does not cover the title.
- `knowledge-tools` — Call a VOLO knowledge tool: Send a data part {"tool": "<name>", "arguments": {...}} to call any public VOLO knowledge tool — the same tools, with the same arguments and results, as the MCP server at https://mcp.flyvolo.ai/mcp: resolve_occupation_or_major, search, get_occupation, get_ontology, query_ontology, get_role_tasks, find_evidence, get_change, find_affected, get_change_history, find_transition_paths, get_action_brief, list_business_functions, get_major, find_majors_for_occupation, find_notes, get_note, find_notes_for_occupation, describe_coverage. Returns the tool's JSON result unchanged. Deterministic: no language model.

## 3. Personal MCP and A2A (free for individuals)

A person signs in with an email at https://account.flyvolo.ai/pro and generates a key there. With it:

- MCP: https://mcp.flyvolo.ai/pro/<key> — or https://mcp.flyvolo.ai/pro/mcp with the header `Authorization: Bearer <key>`
- A2A: https://mcp.flyvolo.ai/pro/<key>/a2a — or https://mcp.flyvolo.ai/pro/a2a with the same header; its card is at …/.well-known/agent-card.json under either
- The address is the credential: treat it like a password.
- It serves every public tool above, unchanged, plus these, which read and write the person's own list of followed jobs and their own tasks:

#### my_profile

What this person follows on VOLO (occupations and degrees), which tasks they marked as theirs, when they last asked for a brief, and until when their subscription runs. Call this first in a new conversation so you know whose situation you are reading.

```json
{
  "type": "object",
  "properties": {
    "locale": {
      "type": "string"
    }
  }
}
```

#### follow

Start following an occupation or a degree (by slug; resolve names with resolve_occupation_or_major first). Followed items are what whats_new_for_me reports on.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### unfollow

Stop following an occupation or a degree.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
```

#### mark_my_tasks

Record which tasks of an occupation are actually this person's work (task ids from get_role_tasks). Replaces the previous list for that occupation. whats_new_for_me then says when a new record touches one of them.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "taskIds": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "slug",
    "taskIds"
  ]
}
```

#### whats_new_for_me

What changed for the things this person follows since they last asked (or since a date): newly verified records with their scope, source and what they do not establish; which followed occupations stayed quiet (silence is information); whether a new record touches a task they marked as theirs; and one thing they can verify this week. A brief with nothing new is a complete answer, not a failure — say so plainly.

```json
{
  "type": "object",
  "properties": {
    "since": {
      "type": "string",
      "description": "ISO date; defaults to the last brief, or 30 days ago"
    },
    "locale": {
      "type": "string"
    }
  }
}
```

Prompt: `weekly-brief` — brief the person on what changed this week for the jobs and degrees they follow.

## 4. Plain-text pages

- Append `.md` to an occupation, record or note URL for the same content without page chrome: https://flyvolo.ai/en/careers/accountant.md · https://flyvolo.ai/en/changes/<id>.md · https://flyvolo.ai/en/notes/<slug>.md. Cite the page URL, not the .md.
- Swap the language prefix for another language: /en/ · /zh/ · /ja/ · /es/ · /pt/ · /fr/.
- https://flyvolo.ai/llms.txt — what the site holds, how to read it, and what it deliberately does not publish.
- https://flyvolo.ai/sitemap.xml — every page in every language.

## 5. Open data (CC BY 4.0)

Regenerated whenever a record is added. Credit: "VOLO (flyvolo.ai), CC BY 4.0", with a link.

- https://flyvolo.ai/data/volo-occupations.csv — occupations
- https://flyvolo.ai/data/volo-tasks.csv — every task with its direction, basis and limits
- https://flyvolo.ai/data/volo-evidence.csv — every verified record with its source
- https://flyvolo.ai/data/volo-open-data.json — all three in one file
- https://flyvolo.ai/data/volo-ontology.json — the object types, links and actions the site is built on
- https://flyvolo.ai/data/volo-ontology.jsonld — the same graph as linked data
- https://flyvolo.ai/data/volo-map.svg — every occupation on one map, as an embeddable image

## 6. Limits and contact

- No key and no quota on the public MCP today. Please keep to a few requests a second.
- Content is free to read and cite. Institutions that want a brief for their own roles or degree programmes: https://flyvolo.ai/en/report.
- Contact: hermans@foxmail.com
