Sign in
abstract agent · partners · 3 processes · plugin 1.0.0

Margin keeper

margin-keeper v1

Holds what each partner tier costs the company: the margin, the discount, the funds and the support hours behind the promise. It prices a tier before anybody is told they hold it, sets each tier's discount against the margin floor at the volume the tier assumes, and puts the same numbers into the price lists and the portal so a partner gets what they were told. It also reads the other direction, checking what the company owed a partner and settling what is owed when a relationship ends. One partner's terms are only defensible if every partner on that tier got the same ones, which is what this agent is for.

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/prt/end-a-partner-relationshipref/prt/review-partner-performanceref/prt/set-a-partner-tierGRANTEDthe price list systemwrite — a tier's discount takes effect here, othe finance systemread — the volume and the cost the pricing is the partner recordread — which tier a partner holds, and from whthe agreement recordread — what the signed terms already give a pathe partner portalwrite — what a tier entitles a partner to has the notification channelwriteTHE ABSTRACT AGENTmargin-keeperv1holds what each partner…HANDS TO A PERSONa tier whose discount sits…to the finance partner, with…an exception that gives…to the channel leader, with…anything the company owed…on the day it is found, with…the final settlement when…to finance, because a person…a partner who bought at…to finance, with the…MUST FOLLOWallocate-and-reconcileassessment

Runs allocate-and-reconcile to price a tier set and to settle the last accounts of a relationship, and holds the run-scoped cost ledger that stays open until the run closes. Runs assessment to test each tier's discount against the floor. Works beside the tier-assessor agent, which produces the tier, and the finance partner (person), who signs what it costs. Hands the priced terms to the partner-manager agent, which tells the partner and holds the relationship afterwards.

The plugin

What is in the package

4 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.

margin-keeper · 9 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 which tier a partner lands in, which is the
tier-assessor agent applying published rules to evidence. Does not
allocate partner fund money or approve a request against it, which is
the fund-allocator agent, and does not check a claim or score it, which
is the claim-check agent. Does not pay a partner or recover from one.
Does not negotiate a price with a partner, and does not write the tier
rules.

## What always goes to a person

- a tier whose discount sits below the margin floor - to the finance
  partner, with the shortfall and the volume it assumes
- an exception that gives one partner terms the published rules do not
  give the others - to the channel leader, with both sets of numbers
- anything the company owed a partner and missed - on the day it is
  found, with the amount and the period
- the final settlement when a relationship ends - to finance, because a
  person pays and a person recovers
- a partner who bought at the wrong terms because a system was still on
  the old tier - to finance, with the customers and the amounts
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 `margin-keeper` leaves the
following behind, on every run.

The priced tier table at a version, naming the rules version it was
priced against, the volume each tier assumes, and the margin, discount,
fund and support hours each one carries. The margin test per tier,
naming the floor it was set against and the shortfall where there is
one, with the name of whoever accepted a shortfall in writing. Per
partner, the discount in force and the date it started. Per system
changed, what it was set to and the date it took effect. For a
relationship ending, the settlement line by line: what was earned, what
was paid, what is recovered, and what is still open. For a performance
round, what the company owed each partner set against what was actually
delivered, with each difference settled or marked open.

An agent that leaves less than this does not implement `margin-keeper`,
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

Six 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 price list system | write | A tier's discount takes effect here, on the date the approved round says it does. |
| the finance system | read | The volume and the cost the pricing is computed from. |
| the partner record | read | Which tier a partner holds, and from what date. |
| the agreement record | read | What the signed terms already give a partner, so a tier does not promise it a second time. |
| the partner portal | write | What a tier entitles a partner to has to read the same in the portal as on the price list. |
| the notification channel | write |  |

There is deliberately no grant over the payment system. This agent says
what is owed and a person pays it.

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": "margin-keeper",
  "version": "1.0.0",
  "description": "The margin-keeper abstract agent. Holds what each partner tier costs the company: the margin, the discount, the funds and the support hours behind the promise.",
  "author": {
    "name": "AgentCatalog",
    "url": "https://agentcatalog.com"
  },
  "homepage": "https://agentcatalog.com/abstract-agents/margin-keeper",
  "repository": "https://github.com/jeffrschneider/agentcatalog",
  "license": "CC-BY-4.0",
  "keywords": [
    "abstract-agent",
    "reference",
    "partners",
    "set-a-partner-tier",
    "end-a-partner-relationship",
    "review-partner-performance",
    "abstract"
  ],
  "extensions": {
    "com.agentcatalog.agent": {
      "agent": "margin-keeper",
      "agentVersion": 1,
      "department": "partners",
      "abstract": true,
      "works": "Runs allocate-and-reconcile to price a tier set and to settle the last accounts of a relationship, and holds the run-scoped cost ledger that stays open until the run closes. Runs assessment to test each tier's discount against the floor. Works beside the tier-assessor agent, which produces the tier, and the finance partner (person), who signs what it costs. Hands the priced terms to the partner-manager agent, which tells the partner and holds the relationship afterwards.",
      "servers": [
        {
          "name": "the price list system",
          "role": "price-list-system",
          "access": "write",
          "needs": "A tier's discount takes effect here, on the date the approved round says it does."
        },
        {
          "name": "the finance system",
          "role": "finance-system",
          "access": "read",
          "needs": "The volume and the cost the pricing is computed from."
        },
        {
          "name": "the partner record",
          "role": "partner-record",
          "access": "read",
          "needs": "Which tier a partner holds, and from what date."
        },
        {
          "name": "the agreement record",
          "role": "agreement-record",
          "access": "read",
          "needs": "What the signed terms already give a partner, so a tier does not promise it a second time."
        },
        {
          "name": "the partner portal",
          "role": "partner-portal",
          "access": "write",
          "needs": "What a tier entitles a partner to has to read the same in the portal as on the price list."
        },
        {
          "name": "the notification channel",
          "role": "notification-channel",
          "access": "write"
        }
      ],
      "records": [
        "The priced tier table at a version, naming the rules version it was priced against, the volume each tier assumes, and the margin, discount, fund and support hours each one carries.",
        "The margin test per tier, naming the floor it was set against and the shortfall where there is one, with the name of whoever accepted a shortfall in writing.",
        "Per partner, the discount in force and the date it started.",
        "Per system changed, what it was set to and the date it took effect.",
        "For a relationship ending, the settlement line by line: what was earned, what was paid, what is recovered, and what is still open.",
        "For a performance round, what the company owed each partner set against what was actually delivered, with each difference settled or marked open."
      ],
      "escalates": [
        "a tier whose discount sits below the margin floor - to the finance partner, with the shortfall and the volume it assumes",
        "an exception that gives one partner terms the published rules do not give the others - to the channel leader, with both sets of numbers",
        "anything the company owed a partner and missed - on the day it is found, with the amount and the period",
        "the final settlement when a relationship ends - to finance, because a person pays and a person recovers",
        "a partner who bought at the wrong terms because a system was still on the old tier - to finance, with the customers and the amounts"
      ],
      "not": [
        "Does not decide which tier a partner lands in, which is the tier-assessor agent applying published rules to evidence.",
        "Does not allocate partner fund money or approve a request against it, which is the fund-allocator agent, and does not check a claim or score it, which is the claim-check agent.",
        "Does not pay a partner or recover from one.",
        "Does not negotiate a price with a partner, and does not write the tier rules."
      ],
      "processes": [
        {
          "process": "ref/prt/end-a-partner-relationship",
          "activities": [
            "Settle What the Money Says",
            "Pay What Is Owed and Recover What Is Not"
          ]
        },
        {
          "process": "ref/prt/review-partner-performance",
          "activities": [
            "Check What the Company Owed"
          ]
        },
        {
          "process": "ref/prt/set-a-partner-tier",
          "activities": [
            "Price What Each Tier Costs",
            "Check the Margin Holds",
            "Change the Systems"
          ]
        }
      ]
    }
  }
}
README.mdWhat the package is, and why it carries no mcp.json.
# margin-keeper

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 four 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/prt/end-a-partner-relationship`,
`ref/prt/review-partner-performance`, `ref/prt/set-a-partner-tier`. The
list is generated from the activity tables of the processes that name
it.

https://agentcatalog.com/abstract-agents/margin-keeper
skills/check-what-the-company-owed/SKILL.mdReads the other direction in a performance round, setting what the company promised each partner against what it actually delivered, and marking each difference settled or open. Use it when running `ref/prt/review-partner-performance`.
---
name: check-what-the-company-owed
description: Reads the other direction in a performance round, setting what the company promised each partner against what it actually delivered, and marking each difference settled or open. Use it when running `ref/prt/review-partner-performance`.
license: CC-BY-4.0
metadata:
  agent: margin-keeper
  agent-version: "1"
---

# Check what the company owed

## What it does

Reads the other direction in a performance round, setting what the
company promised each partner against what it actually delivered, and
marking each difference settled or open.

## Where it happens

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

- **Check What the Company Owed**
  - `ref/prt/review-partner-performance`, activity 6 -
    [Review Partner Performance](../../../../processes/partners/review-partner-performance.md)

## What to record

The priced tier table at a version, naming the rules version it was
priced against, the volume each tier assumes, and the margin, discount,
fund and support hours each one carries. The margin test per tier,
naming the floor it was set against and the shortfall where there is
one, with the name of whoever accepted a shortfall in writing. Per
partner, the discount in force and the date it started. Per system
changed, what it was set to and the date it took effect. For a
relationship ending, the settlement line by line: what was earned, what
was paid, what is recovered, and what is still open. For a performance
round, what the company owed each partner set against what was actually
delivered, with each difference settled or marked open.

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/price-a-tier-set/SKILL.md"Says what each tier costs the company before anybody is told they hold it: the margin, the discount, the funds and the support hours behind the promise. Use it when running `ref/prt/set-a-partner-tier`."
---
name: price-a-tier-set
description: "Says what each tier costs the company before anybody is told they hold it: the margin, the discount, the funds and the support hours behind the promise. Use it when running `ref/prt/set-a-partner-tier`."
license: CC-BY-4.0
metadata:
  agent: margin-keeper
  agent-version: "1"
---

# Price a tier set

## What it does

Says what each tier costs the company before anybody is told they hold
it: the margin, the discount, the funds and the support hours behind the
promise. It then sets each tier's discount against the margin floor at
the volume that tier assumes and names the shortfall where there is one.

## Where it happens

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

- **Check the Margin Holds**
  - `ref/prt/set-a-partner-tier`, activity 8 -
    [Set a Partner Tier](../../../../processes/partners/set-a-partner-tier.md)
- **Price What Each Tier Costs**
  - `ref/prt/set-a-partner-tier`, activity 7 -
    [Set a Partner Tier](../../../../processes/partners/set-a-partner-tier.md)

## What to record

The priced tier table at a version, naming the rules version it was
priced against, the volume each tier assumes, and the margin, discount,
fund and support hours each one carries. The margin test per tier,
naming the floor it was set against and the shortfall where there is
one, with the name of whoever accepted a shortfall in writing. Per
partner, the discount in force and the date it started. Per system
changed, what it was set to and the date it took effect. For a
relationship ending, the settlement line by line: what was earned, what
was paid, what is recovered, and what is still open. For a performance
round, what the company owed each partner set against what was actually
delivered, with each difference settled or marked open.

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/put-the-priced-terms-into-the-systems/SKILL.mdWrites the approved numbers into the price lists and the portal on the date the round says they take effect, so a partner gets the terms it was told it has. Use it when running `ref/prt/set-a-partner-tier`.
---
name: put-the-priced-terms-into-the-systems
description: Writes the approved numbers into the price lists and the portal on the date the round says they take effect, so a partner gets the terms it was told it has. Use it when running `ref/prt/set-a-partner-tier`.
license: CC-BY-4.0
metadata:
  agent: margin-keeper
  agent-version: "1"
---

# Put the priced terms into the systems

## What it does

Writes the approved numbers into the price lists and the portal on the
date the round says they take effect, so a partner gets the terms it was
told it has.

## Where it happens

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

- **Change the Systems**
  - `ref/prt/set-a-partner-tier`, activity 13 -
    [Set a Partner Tier](../../../../processes/partners/set-a-partner-tier.md)

## What to record

The priced tier table at a version, naming the rules version it was
priced against, the volume each tier assumes, and the margin, discount,
fund and support hours each one carries. The margin test per tier,
naming the floor it was set against and the shortfall where there is
one, with the name of whoever accepted a shortfall in writing. Per
partner, the discount in force and the date it started. Per system
changed, what it was set to and the date it took effect. For a
relationship ending, the settlement line by line: what was earned, what
was paid, what is recovered, and what is still open. For a performance
round, what the company owed each partner set against what was actually
delivered, with each difference settled or marked open.

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/settle-the-last-accounts/SKILL.mdCloses the money out when a relationship ends. Use it when running `ref/prt/end-a-partner-relationship`.
---
name: settle-the-last-accounts
description: Closes the money out when a relationship ends. Use it when running `ref/prt/end-a-partner-relationship`.
license: CC-BY-4.0
metadata:
  agent: margin-keeper
  agent-version: "1"
---

# Settle the last accounts

## What it does

Closes the money out when a relationship ends. It works the settlement
line by line, saying what was earned, what was paid, what is recovered
and what is still open, and puts the amounts to a person to pay and to
recover.

## Where it happens

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

- **Pay What Is Owed and Recover What Is Not**
  - `ref/prt/end-a-partner-relationship`, activity 15 -
    [End a Partner Relationship](../../../../processes/partners/end-a-partner-relationship.md)
- **Settle What the Money Says**
  - `ref/prt/end-a-partner-relationship`, activity 7 -
    [End a Partner Relationship](../../../../processes/partners/end-a-partner-relationship.md)

## What to record

The priced tier table at a version, naming the rules version it was
priced against, the volume each tier assumes, and the margin, discount,
fund and support hours each one carries. The margin test per tier,
naming the floor it was set against and the shortfall where there is
one, with the name of whoever accepted a shortfall in writing. Per
partner, the discount in force and the date it started. Per system
changed, what it was set to and the date it took effect. For a
relationship ending, the settlement line by line: what was earned, what
was paid, what is recovered, and what is still open. For a performance
round, what the company owed each partner set against what was actually
delivered, with each difference settled or marked open.

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 6 roles, and the access level beside each one is the most the work needs.

price-list-system · writefinance-system · readpartner-record · readagreement-record · readpartner-portal · writenotification-channel · write
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": {
    "price-list-system": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/price-list-system"
    },
    "finance-system": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/finance-system"
    },
    "partner-record": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/partner-record"
    },
    "agreement-record": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/agreement-record"
    },
    "partner-portal": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/partner-portal"
    },
    "notification-channel": {
      "type": "streamable-http",
      "url": "https://mcp.yourcompany.com/notification-channel"
    }
  }
}

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, 6 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.

End a Partner Relationshipref/prt/end-a-partner-relationship · 17 activities
1234567891011121314151617

Settle What the Money Says · Pay What Is Owed and Recover What Is Not

Review Partner Performanceref/prt/review-partner-performance · 16 activities
12345678910111213141516

Check What the Company Owed

Set a Partner Tierref/prt/set-a-partner-tier · 16 activities
12345678910111213141516

Price What Each Tier Costs · Check the Margin Holds · Change the Systems

The records it leaves

What it writes down

The priced tier table at a version, naming the rules version it was priced against, the volume each tier assumes, and the margin, discount, fund and support hours each one carries. The margin test per tier, naming the floor it was set against and the shortfall where there is one, with the name of whoever accepted a shortfall in writing. Per partner, the discount in force and the date it started. Per system changed, what it was set to and the date it took effect. For a relationship ending, the settlement line by line: what was earned, what was paid, what is recovered, and what is still open. For a performance round, what the company owed each partner set against what was actually delivered, with each difference settled or marked open.

Where it stops

What it will not do

Does not decide which tier a partner lands in, which is the tier-assessor agent applying published rules to evidence. Does not allocate partner fund money or approve a request against it, which is the fund-allocator agent, and does not check a claim or score it, which is the claim-check agent. Does not pay a partner or recover from one. Does not negotiate a price with a partner, and does not write the tier rules.

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: margin-keeper 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.

  • okaneland-mcp MCP server · thebaronofai.github.io · run it yourself · mirrored from the MCP registry Verified AI-tool prices and AI product margin math for agents.
  • agent-cost-mcp MCP server · vk0dev.github.io · run it yourself · mirrored from the MCP registry Cost Guard for Claude Code: per-tool ROI, subagent attribution, anomaly/forecast/budget guards.
  • Cofferline MCP server · cofferline.com · hosted · mirrored from the MCP registry Treasury and risk controls for agent wallets: policies, quotes, prediction-market orders.