visitor@flyvolo.ai:~/agents$ cat agents.md

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

1. MCP server (public, no key)

Add it:

Try it:

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.

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

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

{
  "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.

{
  "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.

{
  "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.

{
  "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.

{
  "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.

{
  "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.

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

find_affected

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

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

get_change_history

The verified change timeline for an occupation, oldest first.

{
  "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.

{
  "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.

{
  "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.

{
  "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.

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

find_majors_for_occupation

Which degrees lead into this occupation.

{
  "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.

{
  "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.

{
  "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.

{
  "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.

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

2. A2A agent (public, no key)

Skills:

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:

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.

{
  "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.

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

unfollow

Stop following an occupation or a degree.

{
  "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.

{
  "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.

{
  "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

5. Open data (CC BY 4.0)

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

6. Limits and contact