Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Meta Agent Tools Listings API
version: 1.0.0
description: Meta Agent Tools — registry of MCP servers, skills and plugins.
servers:
- url: https://agentalog.com
tags:
- name: Listings
paths:
/api/listings:
get:
operationId: list_listings
summary: 'The public mosaic: paginated search of the catalog''s live listings'
description: 'Only `live` in the mosaic. With `q`, `low_count` says how many `low` listings (few stars or no clear license) match the term — LIKE with a cap of 200. `low=1` includes that tail; without `q` the parameter is ignored.
Returns: { items[{id,kind,category,name,tagline,body,url,status,origin,origin_id,install,source,transporte,ns,versao,oficial_status,repo_host,topico,stars,forks,prs_abertos,pushed_at,repo_estado,likes,comments,visits,created_at,updated_at,mine,api,go,comments_api}], limit, offset, next_offset, low_count, low_capped, low_included, api }'
security: []
parameters:
- name: q
in: query
required: false
schema:
type: string
description: Free text over the name, the tagline and the description.
example: postgres
- name: kind
in: query
required: false
schema:
type: string
enum:
- mcp
- skill
- plugin
description: Which kind of resource to fetch.
- name: category
in: query
required: false
schema:
type: string
description: Category declared by whoever published.
- name: sort
in: query
required: false
schema:
type: string
default: recent
enum:
- recent
- likes
- visits
description: Result order.
- name: low
in: query
required: false
schema:
type: string
enum:
- '1'
description: '`1` includes `low` listings in the result. Only valid together with `q`.'
- name: limit
in: query
required: false
schema:
type: integer
default: 24
description: Listings per page.
- name: offset
in: query
required: false
schema:
type: integer
default: 0
description: How many listings to skip. Use `next_offset` from the previous response.
responses:
'200':
description: '{ items[{id,kind,category,name,tagline,body,url,status,origin,origin_id,install,source,transporte,ns,versao,oficial_status,repo_host,topico,stars,forks,prs_abertos,pushed_at,repo_estado,likes,comments,visits,created_at,updated_at,mine,api,go,comments_api}], limit, offset, next_offset, low_count, low_capped, low_included, api }'
content:
application/json:
schema:
$ref: '#/components/schemas/PaginaDeAnuncios'
tags:
- Listings
post:
operationId: create_listing
summary: Registers an MCP server, a skill or a plugin in the catalog.
description: 'Two doors to the same action. Human with a session: free, 1 per day, at most 3 in the queue. Agent (with or without a guest): **402 with `accepts[]`**, $0.10 — pay and repeat. For a skill, the `SKILL.md` URL is enough; the rest is checked. **Validates before charging:** a refused body (400) and an exhausted quota (429) come BEFORE the 402, so no payment settles for a listing already known not to get in. A valid body without payment keeps receiving the 402 with the price.
Returns: { ok, id, status }'
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
kind:
type: string
description: What is being registered.
url:
type: string
description: MCP endpoint, SKILL.md URL or the plugin's repository.
name:
type: string
description: Display name; without it, taken from the source.
tagline:
type: string
description: One line saying what it is for.
body:
type: string
description: Long description, optional.
category:
type: string
description: Category so the listing shows up under the right filter.
required:
- kind
- url
example:
kind: mcp
category: tools
name: Name
tagline: One line
url: https://example.com/mcp
responses:
'200':
description: '{ ok, id, status }'
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
description: Always `true` when the request went in.
id:
type: string
description: ID of the created listing.
status:
type: string
description: 'Always `pending`: everything goes through the queue before turning live.'
required:
- ok
- id
- status
'400':
description: '`kind` or `url` missing, invalid URL, URL that does not answer or refused field.'
'402':
description: 'Quota exceeded. The response carries `accepts[]` (x402, USDC on Base): pay and repeat the same call with `X-PAYMENT`.'
'429':
description: 1 per day, at most 3 pending — applies to both doors, and is checked before charging.
'502':
description: 'The payment settled and the write failed. The body carries `transaction`: keep it and talk to support.'
tags:
- Listings
/api/listings/{id}:
get:
operationId: get_listing
summary: One listing's page. The owner sees their own even when pending or hidden
description: 'Returns: { id, kind, category, name, tagline, body, url, status, origin, origin_id, install, source, transporte, ns, versao, oficial_status, repo_host, topico, stars, forks, prs_abertos, pushed_at, repo_estado, likes, comments, visits, created_at, updated_at, mine, api, go, comments_api }'
security: []
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: '{ id, kind, category, name, tagline, body, url, status, origin, origin_id, install, source, transporte, ns, versao, oficial_status, repo_host, topico, stars, forks, prs_abertos, pushed_at, repo_estado, likes, comments, visits, created_at, updated_at, mine, api, go, comments_api }'
content:
application/json:
schema:
$ref: '#/components/schemas/Anuncio'
'404':
description: The listing does not exist, or it is not yours and is not live/low.
tags:
- Listings
patch:
operationId: patch_api_listings_by_id
summary: Edits a listing of yours. Changing the URL sends it back to the queue
description: 'The URL is what moderation looks at; swapping it after approval would bypass the queue, so the listing goes back to `pending`.
Returns: { ok, id, status }'
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: New display name.
tagline:
type: string
description: New summary line.
body:
type: string
description: New long description.
category:
type: string
description: New category.
url:
type: string
description: New URL — changing this sends the listing back to `pending`.
example:
tagline: …
responses:
'200':
description: '{ ok, id, status }'
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
description: Always `true`.
id:
type: string
description: ID of the edited listing.
status:
type: string
description: State after the edit; back to `pending` if the URL changed.
required:
- ok
- id
- status
'400':
description: Invalid field in the body.
'401':
description: No credential, or an invalid one. See this endpoint's auth.
'404':
description: The listing is not yours or does not exist.
tags:
- Listings
/api/listings/{id}/comments:
get:
operationId: list_comments
summary: Public comments on a live listing
description: 'With a credential on the call, each comment of yours comes with `mine: true`.
Returns: { items[{id,body,author,created_at,mine}], total }'
security: []
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: '{ items[{id,body,author,created_at,mine}], total }'
content:
application/json:
schema:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/Comentario'
description: The comments, newest first.
total:
type: integer
description: How many comments the listing has.
required:
- items
- total
'404':
description: The listing does not exist or is not live.
tags:
- Listings
post:
operationId: post_api_listings_by_id_comments
summary: Writes a comment on the listing. Cap of 20 per hour per owner
description: 'Returns: { ok, id, body }'
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
body:
type: string
description: The comment text.
required:
- body
example:
body: text
responses:
'200':
description: '{ ok, id, body }'
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
description: Always `true` when the comment went in.
id:
type: string
description: ID of the created comment.
body:
type: string
description: The stored text.
required:
- ok
- id
- body
'400':
description: Empty or too long text.
'401':
description: No credential, or an invalid one. See this endpoint's auth.
'404':
description: The listing does not exist.
'429':
description: More than 20 comments in the hour.
tags:
- Listings
/api/listings/{id}/like:
post:
operationId: like_listing
summary: 'Likes the listing. Calling again does not add up: the counter counts people'
description: 'Returns: { ok, liked, likes }'
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: '{ ok, liked, likes }'
content:
application/json:
schema:
$ref: '#/components/schemas/Like'
'401':
description: No credential, or an invalid one. See this endpoint's auth.
'404':
description: The resource does not exist (or is not yours — the API does not tell the two apart on purpose).
tags:
- Listings
delete:
operationId: delete_api_listings_by_id_like
summary: Unlikes and gives the point back to the public counter
description: 'Returns: { ok, liked, likes }'
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: '{ ok, liked, likes }'
content:
application/json:
schema:
$ref: '#/components/schemas/Like'
'401':
description: No credential, or an invalid one. See this endpoint's auth.
'404':
description: The resource does not exist (or is not yours — the API does not tell the two apart on purpose).
tags:
- Listings
components:
schemas:
Like:
type: object
properties:
ok:
type: boolean
description: Always `true`.
liked:
type: boolean
description: Whether YOU are liking it now.
likes:
type: integer
description: Total people liking the listing.
required:
- ok
- liked
- likes
description: The state of the like after the call. Turning it on and off return the same shape.
Anuncio:
type: object
properties:
id:
type: string
description: Listing ID; it is the key across the whole API.
kind:
type: string
description: What this listing is.
category:
type: string
description: Category chosen by whoever published.
nullable: true
name:
type: string
description: Display name.
tagline:
type: string
description: One line saying what it is for.
nullable: true
body:
type: string
description: Long description, when whoever published wrote one.
nullable: true
url:
type: string
description: Where the resource lives — the MCP endpoint, the SKILL.md or the repository.
status:
type: string
description: State in the catalog.
origin:
type: string
description: 'Where the listing came from: `official`, `marketplace`, `directory` or a community submission.'
origin_id:
type: string
description: Identifier of the listing at the source.
nullable: true
install:
type: string
description: How to install, when the source says.
nullable: true
source:
type: string
description: Source code URL, when known.
nullable: true
transporte:
type: string
description: 'MCP transport: `stdio`, `http`, `sse`.'
nullable: true
ns:
type: string
description: Server namespace in the official registry.
nullable: true
versao:
type: string
description: Version declared by the source.
nullable: true
oficial_status:
type: string
description: State in the official MCP registry, when applicable.
nullable: true
repo_host:
type: string
description: Where the repository is hosted, e.g. `github`.
nullable: true
topico:
type: string
description: Topic inferred from the repository, used in the facets.
nullable: true
stars:
type: integer
description: Repository stars at the last check.
nullable: true
forks:
type: integer
description: Repository forks at the last check.
nullable: true
prs_abertos:
type: integer
description: Open pull requests at the last check.
nullable: true
pushed_at:
type: string
description: Last push to the repository (UTC).
nullable: true
repo_estado:
type: string
description: How the repository is doing (active, stalled, archived, renamed, gone).
nullable: true
likes:
type: integer
description: How many people liked it — the like is reversible and counts people.
comments:
type: integer
description: Public comments on the listing.
visits:
type: integer
description: Visits counted by the hop; at most 1 per owner per day.
created_at:
type: string
description: When it entered the catalog (UTC).
updated_at:
type: string
description: Last change (UTC).
nullable: true
mine:
type: boolean
description: '`true` when the listing is yours — only then can you edit it.'
api:
type: string
description: Absolute URL of this listing's page.
go:
type: string
description: 'Hop URL: redirects to `url` and counts the visit.'
comments_api:
type: string
description: Absolute URL of this listing's comments.
required:
- id
- kind
- category
- name
- tagline
- body
- url
- status
- origin
- origin_id
- install
- source
- transporte
- ns
- versao
- oficial_status
- repo_host
- topico
- stars
- forks
- prs_abertos
- pushed_at
- repo_estado
- likes
- comments
- visits
- created_at
- updated_at
- mine
- api
- go
- comments_api
description: 'A catalog listing: MCP server, Agent Skill or Claude Code plugin.'
PaginaDeAnuncios:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/Anuncio'
description: The listings on this page.
limit:
type: integer
description: Page size applied.
offset:
type: integer
description: Offset applied.
next_offset:
type: integer
description: Offset of the next page; `null` when there is no more.
nullable: true
low_count:
type: integer
description: How many `low` listings match `q` (cap 200). Zero without a term.
low_capped:
type: boolean
description: '`true` when the count hit the cap — there are at least that many.'
low_included:
type: boolean
description: '`true` when `low=1` mixed the tail into this page.'
api:
type: string
description: Absolute URL of this listing.
required:
- items
- limit
- offset
- next_offset
- low_count
- low_capped
- low_included
- api
description: 'A page of the public mosaic. No `total`: the catalog has tens of thousands of listings and counting everything on each search would be expensive without changing any decision.'
Comentario:
type: object
properties:
id:
type: string
description: Comment ID, for deleting.
body:
type: string
description: The comment text.
author:
type: string
description: Nickname of whoever wrote it.
nullable: true
created_at:
type: string
description: When it was written (UTC).
mine:
type: boolean
description: '`true` if it is yours — only you can delete it.'
required:
- id
- body
- author
- created_at
- mine
description: A public comment on a listing.
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: Guest mr_…, session sess_… or ADMIN_TOKEN.