Sign in
abstract agent · revenue-operations · 3 processes · plugin 1.0.0

Enrichment operator

enrichment-operator v1

Fills thin records from outside sources, and makes every filled field name where it came from. It reads what the definition asks each field to hold, chooses which source answers which field and in what order, and tests a sample against records already known to be right before anything is bought or written at scale. Every value it writes carries the source, the date and the confidence beside it, a value a person typed is never overwritten, and a fill under the bar waits for a person instead of landing quietly. A field it cannot fill stays empty and is reported as empty rather than guessed at.

The abstract agent

What it is granted, and what it hands to a person

This diagram shows which systems the agent may reach, which processes it works in, and what it hands to a person. Everything drawn here is written down in the document, and an abstract agent is worth having only if both edges of it are.

WORKS INref/rev/define-a-recordref/rev/enrich-a-recordref/rev/fix-a-data-quality-failureGRANTEDthe CRMwrite — the empty fields are filled there, eacthe enrichment sourcesread — the sources chosen for this fill, and nthe data dictionaryread — what each empty field means, the valuesthe consent recordread — which fields may be filled from outsidethe review queuewrite — fills under the confidence bar wait ththe data warehousewrite — the fill as it ran, by source, with ththe enrichment budgetread — a batch that would exceed it stops at tTHE ABSTRACT AGENTenrichment-operatorv1fills thin records from…HANDS TO A PERSONevery held-back fill, to…a person decidesno source clearing the bar…a person decidesa source that is…a person decidesa source that has drifted…a person decidesa disagreement rate…a person decidesthe budget running out…a person decidesMUST FOLLOWallocate-and-reconcilecollect-and-reportdecide-and-announceassessmentdebrief

Convenes the decide-and-announce that picks which source answers which field and in what order, inside the enrichment budget. Runs assessment on a sample before any source is used at scale, and again on a cadence to catch a source that has drifted since it was chosen. Runs allocate-and-reconcile on the spend for the life of the fill, and collect-and-report on what was filled per source, what it cost, the disagreements with typed values and what stayed empty. Convenes the debrief that says which source is worth what it costs and which field no source can fill. Reads the field definitions from the data-steward agent and takes the precedence from it, takes what may be filled at all from the consent-manager agent, takes the source scores from the statistician agent, and gives what it wrote to the data-quality-check agent to run the definition's rules over.

The plugin

What is in the package

5 skills and the systems they need, written to version 1.1.0 of the Agent Plugins standard. Nothing in these files names a product. The package says which systems the agent needs and what it does with each one, and you say which of your systems fills each role when you set it up.

enrichment-operator · 10 files · 1.0.0
com.agentcatalog.agent/NOT.mdWhat the agent does not do, and when it asks a person.
# Where this abstract agent stops

Does not decide what a field means or what values it accepts, which is
the data-steward agent publishing the definition this agent reads. Does
not decide what may be held or filled from outside, which is the
consent-manager agent. Does not overwrite a value a person typed, and
does not widen a rule to let a source's answer through. Does not run the
definition's rules over what it wrote, which is the data-quality-check
agent. Does not find duplicates or merge them, which is the deduper
agent. Does not fix the source that wrote bad data, and only corrects
the records already wrong once somebody else has.

## What always goes to a person

- every held-back fill, to the record owner, who accepts, edits or
  rejects it. A weak fill is never written by default.
- no source clearing the bar on the sample, back to the choice of
  sources, and the field stays empty until one does
- a source that is confidently wrong, with the rate and every record
  already filled from it in this run listed for correction
- a source that has drifted since it was chosen, with the fields filled
  from it since the last good score and their dates
- a disagreement rate climbing on one field, because it usually means
  the field means one thing to the source and another to the people
  typing it
- the budget running out mid-batch, with what was filled, what was not
  attempted, and the spend reconciled either way
com.agentcatalog.agent/RECORDS.mdThe records the agent must leave behind.
# The records this abstract agent must leave

This is the contract. An agent implementing `enrichment-operator` leaves
the following behind, on every run.

Per fill: the records below the bar, and which required fields were
empty on each. The sources chosen, the fields each one was to answer,
and what each cost per record. The sample filled from every source
beside the values already known to be right, and per source and per
field the agreement rate, the empty rate and the confidently wrong rate.
The precedence per field, and the confidence below which nothing is
written. Every field it wrote, carrying the source, the date it was
filled and the confidence the source returned. Every place a person had
typed something different, with the source's answer stored beside the
typed value as a disagreement rather than over it. Everything held back,
and what a person accepted, edited or rejected. What stayed empty,
reported as empty, and what was not attempted when a batch stopped. A
run that is abandoned still leaves its stamps, so a partial fill is
readable rather than mysterious.

An agent that leaves less than this does not implement
`enrichment-operator`, whatever else it does well.
com.agentcatalog.agent/SERVERS.mdThe systems the agent needs, by role rather than by product.
# The systems this abstract agent needs

Seven systems, named by role rather than by product. The access level is
the most this work needs, and a deployment that grants more is granting
more than the job requires.

| Role | Access | What the access is for |
|---|---|---|
| the CRM | write | The empty fields are filled there, each one stamped. |
| the enrichment sources | read | The sources chosen for this fill, and no others. |
| the data dictionary | read | What each empty field means, the values it accepts and the rules it is held to. |
| the consent record | read | Which fields may be filled from outside at all. |
| the review queue | write | Fills under the confidence bar wait there rather than being written. |
| the data warehouse | write | The fill as it ran, by source, with the cost and the rejection rate. |
| the enrichment budget | read | A batch that would exceed it stops at the record it reached. |

Whoever builds an agent from this plugin writes the `mcp.json` that
points these roles at their own systems. Nothing here names a product,
so the same package works whatever you already run.
plugin.jsonThe manifest. It lists the skills and the systems the agent needs.
{
  "$schema": "https://agent-plugins.org/schemas/1.1.0/plugin.schema.json",
  "name": "enrichment-operator",
  "version": "1.0.0",
  "description": "The enrichment-operator abstract agent. Fills thin records from outside sources, and makes every filled field name where it came from.",
  "author": {
    "name": "AgentCatalog",
    "url": "https://agentcatalog.com"
  },
  "homepage": "https://agentcatalog.com/abstract-agents/enrichment-operator",
  "repository": "https://github.com/jeffrschneider/agentcatalog",
  "license": "CC-BY-4.0",
  "keywords": [
    "abstract-agent",
    "reference",
    "revenue-operations",
    "enrich-a-record",
    "define-a-record",
    "fix-a-data-quality-failure",
    "abstract"
  ],
  "extensions": {
    "com.agentcatalog.agent": {
      "agent": "enrichment-operator",
      "agentVersion": 1,
      "department": "revenue-operations",
      "abstract": true,
      "works": "Convenes the decide-and-announce that picks which source answers which field and in what order, inside the enrichment budget. Runs assessment on a sample before any source is used at scale, and again on a cadence to catch a source that has drifted since it was chosen. Runs allocate-and-reconcile on the spend for the life of the fill, and collect-and-report on what was filled per source, what it cost, the disagreements with typed values and what stayed empty. Convenes the debrief that says which source is worth what it costs and which field no source can fill. Reads the field definitions from the data-steward agent and takes the precedence from it, takes what may be filled at all from the consent-manager agent, takes the source scores from the statistician agent, and gives what it wrote to the data-quality-check agent to run the definition's rules over.",
      "servers": [
        {
          "name": "the CRM",
          "role": "crm",
          "access": "write",
          "needs": "The empty fields are filled there, each one stamped."
        },
        {
          "name": "the enrichment sources",
          "role": "enrichment-sources",
          "access": "read",
          "needs": "The sources chosen for this fill, and no others."
        },
        {
          "name": "the data dictionary",
          "role": "data-dictionary",
          "access": "read",
          "needs": "What each empty field means, the values it accepts and the rules it is held to."
        },
        {
          "name": "the consent record",
          "role": "consent-record",
          "access": "read",
          "needs": "Which fields may be filled from outside at all."
        },
        {
          "name": "the review queue",
          "role": "review-queue",
          "access": "write",
          "needs": "Fills under the confidence bar wait there rather than being written."
        },
        {
          "name": "the data warehouse",
          "role": "data-warehouse",
          "access": "write",
          "needs": "The fill as it ran, by source, with the cost and the rejection rate."
        },
        {
          "name": "the enrichment budget",
          "role": "enrichment-budget",
          "access": "read",
          "needs": "A batch that would exceed it stops at the record it reached."
        }
      ],
      "records": [
        "Per fill: the records below the bar, and which required fields were empty on each.",
        "The sources chosen, the fields each one was to answer, and what each cost per record.",
        "The sample filled from every source beside the values already known to be right, and per source and per field the agreement rate, the empty rate and the confidently wrong rate.",
        "The precedence per field, and the confidence below which nothing is written.",
        "Every field it wrote, carrying the source, the date it was filled and the confidence the source returned.",
        "Every place a person had typed something different, with the source's answer stored beside the typed value as a disagreement rather than over it.",
        "Everything held back, and what a person accepted, edited or rejected.",
        "What stayed empty, reported as empty, and what was not attempted when a batch stopped.",
        "A run that is abandoned still leaves its stamps, so a partial fill is readable rather than mysterious."
      ],
      "escalates": [
        "every held-back fill, to the record owner, who accepts, edits or rejects it. A weak fill is never written by default.",
        "no source clearing the bar on the sample, back to the choice of sources, and the field stays empty until one does",
        "a source that is confidently wrong, with the rate and every record already filled from it in this run listed for correction",
        "a source that has drifted since it was chosen, with the fields filled from it since the last good score and their dates",
        "a disagreement rate climbing on one field, because it usually means the field means one thing to the source and another to the people typing it",
        "the budget running out mid-batch, with what was filled, what was not attempted, and the spend reconciled either way"
      ],
      "not": [
        "Does not decide what a field means or what values it accepts, which is the data-steward agent publishing the definition this agent reads.",
        "Does not decide what may be held or filled from outside, which is the consent-manager agent.",
        "Does not overwrite a value a person typed, and does not widen a rule to let a source's answer through.",
        "Does not run the definition's rules over what it wrote, which is the data-quality-check agent.",
        "Does not find duplicates or merge them, which is the deduper agent.",
        "Does not fix the source that wrote bad data, and only corrects the records already wrong once somebody else has."
      ],
      "processes": [
        {
          "process": "ref/rev/define-a-record",
          "activities": [
            "Say Where Each Field Comes From"
          ]
        },
        {
          "process": "ref/rev/enrich-a-record",
          "activities": [
            "Take in the Thin Records",
            "Choose the Sources",
            "Test a Sample First",
            "Set Which Source Wins",
            "Fill the Fields",
            "Stamp Every Filled Field",
            "Leave Typed Values Alone",
            "Hold Back the Weak Fills",
            "Settle the Held-Back Fills",
            "Report the Fill",
            "Score the Sources Again",
            "Record What Was Learned"
          ]
        },
        {
          "process": "ref/rev/fix-a-data-quality-failure",
          "activities": [
            "Correct the Records Already Wrong"
          ]
        }
      ]
    }
  }
}
README.mdWhat the package is, and why it carries no mcp.json.
# enrichment-operator

This is an abstract agent, published as an Agent Plugin. An abstract
agent is a job description rather than an implementation. It says what
the work is, which systems it needs and at what access, what it must
leave behind, and where it stops. Any agent that leaves the records can
implement it.

The plugin carries five skills, no `mcp.json`, and everything the
abstract agent owes under `com.agentcatalog.agent/`.

## Why there is no mcp.json

A conformant server entry in `mcp.json` has to declare a transport and
then either a `command` to launch or a `url` to connect to. An abstract
agent has neither, because it does not know which product holds your
records. Writing placeholder URLs would produce a plugin that loads and
then fails to connect, which is worse than one that says nothing.

Section 6.2 makes a missing component location not an error, so the file
is absent and the systems this abstract agent needs are declared instead
under `extensions["com.agentcatalog.agent"].servers`, as a role, an
access level and what the access is for. Whoever builds an agent from
this plugin writes the `mcp.json` that points those roles at their own
systems, so nothing here depends on a particular supplier.

## Why the obligations are in an extension

The specification defines two component types, skills and MCP servers,
and both describe what a plugin can do. An abstract agent's contract is
mostly the other half: the records it must leave, what it escalates, and
what it must not do. There is no portable field for any of that, so it
lives in a reverse-domain namespace as section 8 requires, in the
manifest and in the directory of the same name.

## Where this abstract agent is used

`ref/rev/define-a-record`, `ref/rev/enrich-a-record`,
`ref/rev/fix-a-data-quality-failure`. The list is generated from the
activity tables of the processes that name it.

https://agentcatalog.com/abstract-agents/enrichment-operator
skills/choose-which-source-answers-which-field/SKILL.mdReads what the definition asks each field to hold, says where each one comes from, picks the sources and the order they answer in, and tests a sample against records already known to be right before anything is bought or written at scale. Use it when running `ref/rev/define-a-record` and `ref/rev/enrich-a-record`.
---
name: choose-which-source-answers-which-field
description: Reads what the definition asks each field to hold, says where each one comes from, picks the sources and the order they answer in, and tests a sample against records already known to be right before anything is bought or written at scale. Use it when running `ref/rev/define-a-record` and `ref/rev/enrich-a-record`.
license: CC-BY-4.0
metadata:
  agent: enrichment-operator
  agent-version: "1"
---

# Choose which source answers which field

## What it does

Reads what the definition asks each field to hold, says where each one
comes from, picks the sources and the order they answer in, and tests a
sample against records already known to be right before anything is
bought or written at scale.

## Where it happens

The agent does this in four activities across two reference processes.
Each one names the activity as that process words it.

- **Choose the Sources**
  - `ref/rev/enrich-a-record`, activity 4 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)
- **Say Where Each Field Comes From**
  - `ref/rev/define-a-record`, activity 8 -
    [Define a Record](../../../../processes/revenue-operations/define-a-record.md)
- **Set Which Source Wins**
  - `ref/rev/enrich-a-record`, activity 7 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)
- **Test a Sample First**
  - `ref/rev/enrich-a-record`, activity 5 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)

## What to record

Per fill: the records below the bar, and which required fields were
empty on each. The sources chosen, the fields each one was to answer,
and what each cost per record. The sample filled from every source
beside the values already known to be right, and per source and per
field the agreement rate, the empty rate and the confidently wrong rate.
The precedence per field, and the confidence below which nothing is
written. Every field it wrote, carrying the source, the date it was
filled and the confidence the source returned. Every place a person had
typed something different, with the source's answer stored beside the
typed value as a disagreement rather than over it. Everything held back,
and what a person accepted, edited or rejected. What stayed empty,
reported as empty, and what was not attempted when a batch stopped. A
run that is abandoned still leaves its stamps, so a partial fill is
readable rather than mysterious.

That contract covers every activity this abstract agent takes on, and it
is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract
agent does not do is in `com.agentcatalog.agent/NOT.md`.
skills/correct-records-a-source-filled-wrong/SKILL.mdOnce somebody else has fixed the source, goes back over the records it already filled wrongly and corrects them. Use it when running `ref/rev/fix-a-data-quality-failure`.
---
name: correct-records-a-source-filled-wrong
description: Once somebody else has fixed the source, goes back over the records it already filled wrongly and corrects them. Use it when running `ref/rev/fix-a-data-quality-failure`.
license: CC-BY-4.0
metadata:
  agent: enrichment-operator
  agent-version: "1"
---

# Correct records a source filled wrong

## What it does

Once somebody else has fixed the source, goes back over the records it
already filled wrongly and corrects them.

## Where it happens

The agent does this in one activity across one reference process. Each
one names the activity as that process words it.

- **Correct the Records Already Wrong**
  - `ref/rev/fix-a-data-quality-failure`, activity 10 -
    [Fix a Data Quality Failure](../../../../processes/revenue-operations/fix-a-data-quality-failure.md)

## What to record

Per fill: the records below the bar, and which required fields were
empty on each. The sources chosen, the fields each one was to answer,
and what each cost per record. The sample filled from every source
beside the values already known to be right, and per source and per
field the agreement rate, the empty rate and the confidently wrong rate.
The precedence per field, and the confidence below which nothing is
written. Every field it wrote, carrying the source, the date it was
filled and the confidence the source returned. Every place a person had
typed something different, with the source's answer stored beside the
typed value as a disagreement rather than over it. Everything held back,
and what a person accepted, edited or rejected. What stayed empty,
reported as empty, and what was not attempted when a batch stopped. A
run that is abandoned still leaves its stamps, so a partial fill is
readable rather than mysterious.

That contract covers every activity this abstract agent takes on, and it
is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract
agent does not do is in `com.agentcatalog.agent/NOT.md`.
skills/fill-a-field-and-stamp-where-it-came-from/SKILL.mdTakes the records missing what the definition requires and fills the empty fields, stamping every value with its source, its date and the confidence behind it. Use it when running `ref/rev/enrich-a-record`.
---
name: fill-a-field-and-stamp-where-it-came-from
description: Takes the records missing what the definition requires and fills the empty fields, stamping every value with its source, its date and the confidence behind it. Use it when running `ref/rev/enrich-a-record`.
license: CC-BY-4.0
metadata:
  agent: enrichment-operator
  agent-version: "1"
---

# Fill a field and stamp where it came from

## What it does

Takes the records missing what the definition requires and fills the
empty fields, stamping every value with its source, its date and the
confidence behind it. A value a person typed is never overwritten, and
the source's answer sits beside it as a disagreement instead.

## Where it happens

The agent does this in four activities across one reference process.
Each one names the activity as that process words it.

- **Fill the Fields**
  - `ref/rev/enrich-a-record`, activity 8 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)
- **Leave Typed Values Alone**
  - `ref/rev/enrich-a-record`, activity 10 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)
- **Stamp Every Filled Field**
  - `ref/rev/enrich-a-record`, activity 9 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)
- **Take in the Thin Records**
  - `ref/rev/enrich-a-record`, activity 1 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)

## What to record

Per fill: the records below the bar, and which required fields were
empty on each. The sources chosen, the fields each one was to answer,
and what each cost per record. The sample filled from every source
beside the values already known to be right, and per source and per
field the agreement rate, the empty rate and the confidently wrong rate.
The precedence per field, and the confidence below which nothing is
written. Every field it wrote, carrying the source, the date it was
filled and the confidence the source returned. Every place a person had
typed something different, with the source's answer stored beside the
typed value as a disagreement rather than over it. Everything held back,
and what a person accepted, edited or rejected. What stayed empty,
reported as empty, and what was not attempted when a batch stopped. A
run that is abandoned still leaves its stamps, so a partial fill is
readable rather than mysterious.

That contract covers every activity this abstract agent takes on, and it
is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract
agent does not do is in `com.agentcatalog.agent/NOT.md`.
skills/hold-back-a-fill-under-the-bar/SKILL.mdHolds a fill that falls under the confidence bar instead of writing it, and puts it to the record owner, who accepts it, edits it or rejects it. Use it when running `ref/rev/enrich-a-record`.
---
name: hold-back-a-fill-under-the-bar
description: Holds a fill that falls under the confidence bar instead of writing it, and puts it to the record owner, who accepts it, edits it or rejects it. Use it when running `ref/rev/enrich-a-record`.
license: CC-BY-4.0
metadata:
  agent: enrichment-operator
  agent-version: "1"
---

# Hold back a fill under the bar

## What it does

Holds a fill that falls under the confidence bar instead of writing it,
and puts it to the record owner, who accepts it, edits it or rejects it.
A weak fill is never written by default.

## Where it happens

The agent does this in two activities across one reference process. Each
one names the activity as that process words it.

- **Hold Back the Weak Fills**
  - `ref/rev/enrich-a-record`, activity 11 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)
- **Settle the Held-Back Fills**
  - `ref/rev/enrich-a-record`, activity 13 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)

## What to record

Per fill: the records below the bar, and which required fields were
empty on each. The sources chosen, the fields each one was to answer,
and what each cost per record. The sample filled from every source
beside the values already known to be right, and per source and per
field the agreement rate, the empty rate and the confidently wrong rate.
The precedence per field, and the confidence below which nothing is
written. Every field it wrote, carrying the source, the date it was
filled and the confidence the source returned. Every place a person had
typed something different, with the source's answer stored beside the
typed value as a disagreement rather than over it. Everything held back,
and what a person accepted, edited or rejected. What stayed empty,
reported as empty, and what was not attempted when a batch stopped. A
run that is abandoned still leaves its stamps, so a partial fill is
readable rather than mysterious.

That contract covers every activity this abstract agent takes on, and it
is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract
agent does not do is in `com.agentcatalog.agent/NOT.md`.
skills/report-the-fill-and-score-the-sources-again/SKILL.mdReports what was filled by source, what it cost, what disagreed with a typed value, and what stayed empty. Use it when running `ref/rev/enrich-a-record`.
---
name: report-the-fill-and-score-the-sources-again
description: Reports what was filled by source, what it cost, what disagreed with a typed value, and what stayed empty. Use it when running `ref/rev/enrich-a-record`.
license: CC-BY-4.0
metadata:
  agent: enrichment-operator
  agent-version: "1"
---

# Report the fill and score the sources again

## What it does

Reports what was filled by source, what it cost, what disagreed with a
typed value, and what stayed empty. Scores the sources again on a
cadence to catch one that has drifted since it was chosen, and files
which source is worth what it costs.

## Where it happens

The agent does this in three activities across one reference process.
Each one names the activity as that process words it.

- **Record What Was Learned**
  - `ref/rev/enrich-a-record`, activity 16 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)
- **Report the Fill**
  - `ref/rev/enrich-a-record`, activity 14 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)
- **Score the Sources Again**
  - `ref/rev/enrich-a-record`, activity 15 -
    [Enrich a Record](../../../../processes/revenue-operations/enrich-a-record.md)

## What to record

Per fill: the records below the bar, and which required fields were
empty on each. The sources chosen, the fields each one was to answer,
and what each cost per record. The sample filled from every source
beside the values already known to be right, and per source and per
field the agreement rate, the empty rate and the confidently wrong rate.
The precedence per field, and the confidence below which nothing is
written. Every field it wrote, carrying the source, the date it was
filled and the confidence the source returned. Every place a person had
typed something different, with the source's answer stored beside the
typed value as a disagreement rather than over it. Everything held back,
and what a person accepted, edited or rejected. What stayed empty,
reported as empty, and what was not attempted when a batch stopped. A
run that is abandoned still leaves its stamps, so a partial fill is
readable rather than mysterious.

That contract covers every activity this abstract agent takes on, and it
is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract
agent does not do is in `com.agentcatalog.agent/NOT.md`.
mcp.jsonNot in the package.

Every server entry in an mcp.json needs either a command to run or a url to connect to, and the package cannot know either of those until somebody points it at their own systems. So the file is left out, the systems the agent needs are named by role in plugin.json, and you write the mcp.json when you set it up.

Setting it up

Point it at your systems

To run an agent built from this package, write an mcp.json that says which of your systems fills each role. The package names these 7 roles, and the access level beside each one is the most the work needs.

crm · writeenrichment-sources · readdata-dictionary · readconsent-record · readreview-queue · writedata-warehouse · writeenrichment-budget · read
mcp.json You write this file. It is not part of the package.
{
  "$schema": "https://agent-plugins.org/schemas/1.1.0/mcp.schema.json",
  "mcpServers": {
    "crm": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/crm"
    },
    "enrichment-sources": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/enrichment-sources"
    },
    "data-dictionary": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/data-dictionary"
    },
    "consent-record": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/consent-record"
    },
    "review-queue": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/review-queue"
    },
    "data-warehouse": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/data-warehouse"
    },
    "enrichment-budget": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/enrichment-budget"
    }
  }
}

The hostnames here are a placeholder for your own. Whichever product holds each of these systems, the agent you build is yours and nobody else has to be involved in running it.

Where it works

3 processes, 14 activities

The highlighted activities are the ones this abstract agent does. The other activities in each process belong to other abstract agents or to people.

Define a Recordref/rev/define-a-record · 17 activities
1234567891011121314151617

Say Where Each Field Comes From

Enrich a Recordref/rev/enrich-a-record · 16 activities
12345678910111213141516

Take in the Thin Records · Choose the Sources · Test a Sample First · Set Which Source Wins · Fill the Fields · Stamp Every Filled Field · Leave Typed Values Alone · Hold Back the Weak Fills · Settle the Held-Back Fills · Report the Fill · Score the Sources Again · Record What Was Learned

Fix a Data Quality Failureref/rev/fix-a-data-quality-failure · 16 activities
12345678910111213141516

Correct the Records Already Wrong

The records it leaves

What it writes down

Per fill: the records below the bar, and which required fields were empty on each. The sources chosen, the fields each one was to answer, and what each cost per record. The sample filled from every source beside the values already known to be right, and per source and per field the agreement rate, the empty rate and the confidently wrong rate. The precedence per field, and the confidence below which nothing is written. Every field it wrote, carrying the source, the date it was filled and the confidence the source returned. Every place a person had typed something different, with the source's answer stored beside the typed value as a disagreement rather than over it. Everything held back, and what a person accepted, edited or rejected. What stayed empty, reported as empty, and what was not attempted when a batch stopped. A run that is abandoned still leaves its stamps, so a partial fill is readable rather than mysterious.

Where it stops

What it will not do

Does not decide what a field means or what values it accepts, which is the data-steward agent publishing the definition this agent reads. Does not decide what may be held or filled from outside, which is the consent-manager agent. Does not overwrite a value a person typed, and does not widen a rule to let a source's answer through. Does not run the definition's rules over what it wrote, which is the data-quality-check agent. Does not find duplicates or merge them, which is the deduper agent. Does not fix the source that wrote bad data, and only corrects the records already wrong once somebody else has.

These limits are written into the job on purpose, so that everyone adopting the process knows which decisions stay with a person.

Agents built from this plugin

Who has built one, and how far each one got

Nobody has built one yet. The catalog says so rather than leaving the section off, because an empty list is a fact about the document.

declare it implements: enrichment-operator v1 One line in your agent's manifest. The catalog checks it against the records your runs actually leave.
A guess, not a claim

The closest things in the catalog, by description

Nobody above has claimed any of these. This is the nearest match by wording between the job written above and what publishers wrote about their own listings, closest first, and wording is not evidence: some of these will be wrong, and a job with nothing suitable still gets whatever was nearest. The publishers have never heard of this abstract agent and have promised nothing about it. What a claim looks like is in the table above, and it is signed.

Might do the job

Things that could be the worker: an agent, a packaged product, a plugin.

  • The Website Specification — A2A agent Agent · specification.website Read-only A2A agent that answers natural-language questions about The Website Specification and returns matching topics with status, canonical URL,…
Might be reached for

Not workers. These are capability that whatever does the job would use, which is a different relationship and kept in its own column for that reason.

  • B2B Lead Enrichment MCP server · diego-costa-tech.github.io · hosted · mirrored from the MCP registry Remote MCP server to enrich company profiles with structured B2B data and confidence scores.
  • verified-feed MCP server · dropwatchhq.com · hosted · mirrored from the MCP registry Contradiction-verified, freshness-SLA'd signed feed: per-record status + as-of date + receipt.
  • mcp-enrichment MCP server · intelagentstudios.github.io · run it yourself · mirrored from the MCP registry Multi-source entity enrichment: company data, contacts, email verification, and phone validation