Skip to main content
Glama
Opedd

Opedd

Official

Lets AI assistants (Claude Desktop, Cursor, Windsurf, or any MCP-compatible host) discover, purchase, and verify content licenses autonomously — mid-conversation, without opening a browser. Every license is recorded in a public registry on Tempo, with cryptographic proof.

Unlike generic search APIs, Opedd returns content with a verifiable license key — with the rights cleared and a record you can show your legal team.

Quick start

npx opedd-mcp

Then add it to your MCP host (see Claude Desktop / Cursor / Windsurf setup below). Discovery + verification tools work with no configuration; purchasing and content retrieval use optional API keys from opedd.com.

Related MCP server: veris

Hosted endpoint — no install (mcp.opedd.com)

Prefer zero-install? The same 20 tools are served hosted at https://mcp.opedd.com/mcp (Streamable HTTP). Auth is an Authorization: Bearer header with any Opedd key — public discovery tools need no auth at all.

Claude Messages API (production agents):

{
  "mcp_servers": [{
    "type": "url",
    "url": "https://mcp.opedd.com/mcp",
    "name": "opedd",
    "authorization_token": "opedd_buyer_live_..."
  }]
}

OpenAI Responses API:

{
  "tools": [{
    "type": "mcp",
    "server_label": "opedd",
    "server_url": "https://mcp.opedd.com/mcp",
    "authorization": "opedd_buyer_live_..."
  }]
}

claude.ai / Claude Desktop custom connector (all plans): Settings → Connectors → Add custom connector → URL https://mcp.opedd.com/mcp; add a Authorization: Bearer <your key> request header for the credentialed tools.

Cursor (.cursor/mcp.json):

{
  "mcpServers": {
    "opedd": {
      "url": "https://mcp.opedd.com/mcp",
      "headers": { "Authorization": "Bearer ${env:OPEDD_KEY}" }
    }
  }
}

Key routing: opedd_sk_* (legacy opedd_pub_*) → publisher tools · opedd_buyer_* → content retrieval · ent_* → bulk feeds · buyer-portal JWT → audit/compliance tools. Your key is forwarded per request and never stored by the gateway.

What it does

Exposes up to 20 tools to any AI assistant (some are conditional on env vars):

Every tool carries a title and MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) so an assistant can tell which tools only read and which spend money or write (v0.12.0).

Always available — discovery + onboarding + rights signaling

Tool

Description

search_content

Free discovery. Full-text search across everything licensable (v0.8.0) — ranked matches with publisher, prices, word count and a description snippet; quotes for phrases, -word to exclude. Returns no article text — use search_passages to actually read

search_passages

Paid per answer, or included in a monthly subscription. Ask a question, get licensed passages that answer it, with citations. Pay per answer: charged once per article the answer uses, at that publication's own price per article, each passage capped at 300 words or 25% of the article, counted cumulatively. Monthly AI answers subscriptions (v0.12.0): included, not capped, from the subscription's start. Narrow with publishers, published_after, published_before, max_results (1–10, default 5) and cap a question's cost with max_charge_cents. Needs a buyer key with the search scope. Re-asking within 24h is free

lookup_content

Look up an article by URL — returns title, publisher and how to license it, or that it is not on Opedd yet

request_publication

Ask to be told when a publication Opedd does not carry yet becomes available (url + email; no key)

verify_license

Verify a license key — returns validity, article, publisher, public-record proof

browse_registry

Browse the public Opedd registry — lists issued LICENSES (use publisher_directory to browse publishers themselves)

publisher_directory

Browse the public Opedd publisher catalog — paginated publishers with article counts + pricing + sample articles (primary buyer-discovery surface for AI labs)

place_licence_order

Place a licence order for one or more publishers: AI answers (monthly full text, or metered pay-per-request snippets ≤300 words / 25%), Full catalogue (archive, one_time: everything published up to the order date, kept permanently, no AI training), AI training (one_time, back catalogue), client display (monthly × end clients). Optional include_archive: true on a monthly AI answers order adds each publisher's Full catalogue for complete access. Each publisher is its own Schedule at its own price; returns the order, lines, unavailable publishers and hosted_invoice_url. Needs OPEDD_BUYER_JWT and terms_accepted: true

rsl_get

Fetch a publisher's RSL Standard manifest — public discovery surface; jsonld: true returns CDSM Article 4(3) signed receipt (Phase 12 W1.1)

detect_platform

Detect the content platform behind a URL — returns suggested onboarding workflow for Substack / Beehiiv / Ghost / Medium / Brevo / custom (Phase 12 W3.1)

Requires OPEDD_BUYER_TOKEN (opedd_buyer_live_*) — one key covers search, articles and the feed (v0.12.0)

Tool

Description

get_content

Retrieve a licensed article under any order your account holds — full text for AI answers monthly and client display orders; pay-per-request licences read through search_passages (403 SEARCH_ONLY_LICENCE); includes 7 RAG metadata fields (author, language, word_count, content_hash, image_urls, canonical_url, tags)

Feed tools — OPEDD_BUYER_TOKEN + order_id, or an order's OPEDD_ACCESS_KEY (ent_*)

Tool

Description

list_feed

List the articles a licence order covers, with since delta-feed support. AI training and Full catalogue orders carry full content_body (content_access: "included"); monthly orders are discovery-only (content_access: "retrieval_per_article", fetch text via get_content); per-request orders are "search_only". With a buyer key, pass order_id (optional when the account holds one active order)

stream_feed_ndjson

Bulk-export up to 1000 articles per call via NDJSON wire format. Same content contract and credentials as list_feed

Requires OPEDD_BUYER_JWT (Supabase JWT) — buyer account + audit + compliance + attestation surfaces

Tool

Description

get_buyer_account

Fetch buyer profile + masked API key list — buyer-dashboard mental model

list_licence_orders

The buyer's licence orders and lines; with order_id, each line's Schedule document and its SHA-256 (the fingerprint recorded on Tempo). Also works with an audit-scoped OPEDD_BUYER_TOKEN

get_audit_events

Per-event audit ledger with public-record (Tempo) inclusion proofs inline (Phase 9.x + 10 M5)

get_compliance_dossier

Procurement-defense compliance dossier mapping retrievals to license terms (Phase 11 M4)

article_53_attestation

Signed compliance attestation (JWT) for a license — the artifact a buyer hands to legal/procurement (Phase 12 W1.4)

Requires OPEDD_PUB_BEARER (opedd_sk_*; legacy opedd_pub_* still works) — publisher-side

Tool

Description

list_publisher_content

List your own articles with pricing and stats

push_content

Push your articles to Opedd so AI buyers can license them — 1–100 per call (title/url/html_body required, everything else optional). Onboard your back-catalogue or new posts with no code, straight from your AI assistant.

Compliance artifacts (publisher-side vs buyer-side — never conflated)

Per Opedd's platform invariants (W1.6 amendment):

  • rsl_get(publisher_id, jsonld=true) → publisher-side CDSM Article 4(3) opt-out declaration (signed JSON-LD receipt over the reservation state).

  • article_53_attestation(license_id) → buyer-side signed compliance attestation (HS256 JWT scoped to one license).

  • get_compliance_dossier(from, to) → comprehensive procurement-defense dossier covering BOTH sides (publisher CDSM reservation honored + buyer attestation evidence chain).

These serve different audit-defensibility modes and never share wire format. Tool descriptions cite the W1.6 invariant inline.

Install

npm install -g opedd-mcp

Or run directly with npx:

npx opedd-mcp

Configuration

Set environment variables to pre-configure the server:

Variable

Required

Description

OPEDD_BUYER_TOKEN

Optional

Buyer API key (opedd_buyer_live_*; opedd_buyer_test_* for sandbox) — enables search_passages (with the search scope), get_content, list_feed + stream_feed_ndjson (with order_id)

OPEDD_ACCESS_KEY

Optional

An order's enterprise access key (ent_*) — alternative credential for list_feed + stream_feed_ndjson

OPEDD_BUYER_JWT

Optional

Supabase session JWT from the buyer portal — enables place_licence_order + list_licence_orders + get_buyer_account + get_audit_events + get_compliance_dossier + article_53_attestation

OPEDD_PUB_BEARER

Optional

Publisher API key (opedd_sk_<32-hex>, canonical since 2026-08-27; older opedd_pub_<32-hex> keys keep working) — from the Opedd dashboard, Settings → Developers. Enables list_publisher_content (+ include_body) and push_content.

OPEDD_API_KEY

Deprecated

Legacy Publisher API key (op_...) — fallback during the transition window; will stop working when opedd-backend Phase C deploys. Migrate to OPEDD_PUB_BEARER.

OPEDD_API_URL

Optional

Override the API base URL (default: Opedd production)

OPEDD_MCP_TELEMETRY

Optional

Set to 0 to disable anonymous usage telemetry (see below)

Getting a Stripe payment method ID: Save a card in your Stripe account and retrieve the pm_... ID via the Stripe API.

Anonymous usage telemetry

To understand how AI assistants use this server, opedd-mcp sends anonymous telemetry for each tool call: only the tool name, its duration, whether it succeeded, and the server version — plus a random per-process id. It never sends tool parameters, responses, your email, API keys, tokens, content, or your IP. Data goes to Opedd's PostHog (EU region).

To opt out, set either environment variable before starting the server:

OPEDD_MCP_TELEMETRY=0
# or the cross-tool standard:
DO_NOT_TRACK=1

When opted out, no telemetry client is created and nothing is sent.

Claude Desktop setup

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "opedd": {
      "command": "npx",
      "args": ["opedd-mcp"],
      "env": {
        "OPEDD_BUYER_TOKEN": "opedd_buyer_live_..."
      }
    }
  }
}

Cursor / Windsurf setup

Add to your MCP settings:

{
  "opedd": {
    "command": "npx opedd-mcp",
    "env": {
      "OPEDD_BUYER_TOKEN": "opedd_buyer_live_..."
    }
  }
}

Example usage

Once configured, you can ask your AI assistant:

"Look up the licensing options for this article: https://theinformation.com/articles/..."

"What do Opedd's publications say about EU chip subsidies? Cite the passages." — uses search_passages

"Verify license key OP-XXXX-XXXX and tell me what it covers."

"Browse the latest licenses from The Information publisher."

Phase 12 Wave 1 + 3 surfaces (v0.3.0)

"What does publisher 8268c353-ffa3-4db3-bbb2-90ddbbb43e41 license? Pull the RSL manifest." — uses rsl_get

"Get me a CDSM Article 4(3) signed receipt for that publisher's reservation state — set jsonld: true." — uses rsl_get with content negotiation

"Generate a signed compliance attestation for our license 11111111-... covering the last 90 days. I need the artifact for our procurement audit committee." — uses article_53_attestation (requires OPEDD_BUYER_JWT)

"This publisher just signed up: https://noahpinion.substack.com. Which onboarding workflow should we use?" — uses detect_platform

"Browse the finance category in the Opedd catalog — show me publishers with at least 50 articles." — uses publisher_directory

"What's in my buyer account? Show me my active API keys." — uses get_buyer_account (requires OPEDD_BUYER_JWT)

The assistant will call the appropriate Opedd tools and show you the results.

Payment

No account? An agent can pay for one answer on the spot. POST https://api.opedd.com/agent-answer with the same body as search_passages ({"query": "..."}). The response is HTTP 402 with the price (each article the answer uses, at its publication's own price), the licence and the buyer terms. Pay by card through the Machine Payments Protocol (a Stripe shared payment token, at least 0.50 USD; the rest stays as credit on a search key returned with the answer) and retry. Machine-readable: api.opedd.com/openapi.json.

Pay-per-answer search is billed to the card on your buyer account (opedd.com/buyer/billing); licence orders are paid through Stripe. Single-article purchases (Human republication, purchase_license) were retired on 2026-10-26.

Development

git clone https://github.com/Opedd/opedd-mcp
cd opedd-mcp
npm install
npm run dev   # runs with tsx (no build step)
npm run build # compiles to dist/

How Opedd compares to search APIs

Opedd

Generic search APIs

What you get

Licensed content + license key + public-record proof — all in one API call

Scraped web content, no rights

Content delivery

Full article text via API (JSON) — bulk on flat-fee licenses, per-call (metered) on filtered licenses; real-time feed via webhooks

Scraped snippets or full-page dumps

Content quality

Curated publisher content (niche B2B newsletters, expert analysis)

Whatever's on the open web

Rights

Verifiable licence for every use, publisher-authorized

No rights clearance

Proof

Public record (Tempo) — independently verifiable

None

Compliance

Signed attestation + full provenance chain

No provenance

Pricing

Publisher sets their own prices

Platform decides

Delivery modes

Article API, bulk feed (JSON firehose), buyer webhooks (push)

Query-response only

Protocol

REST + MCP native

REST only

Opedd is the licensed content delivery layer for AI — not just a licensing wrapper. Publishers upload content, you retrieve it via API with a license attached. One integration gives your pipeline both the content and the legal right to use it.

Learn more

License

MIT

Available Tools

20 tools
article_53_attestationGet an EU AI Act Article 53 attestationA
Read-onlyIdempotent
Inspect

Issue a signed JWT attesting to EU AI Act Article 53 compliance for a specific license via GET /eu-ai-act/article-53-attestation (Phase 12 Wave 1 W1.4). Returns a freshly-signed HS256 JWT regulators can verify offline against the canonical signing key. Embeds: license context, usage-count over the attestation window, the most-recent Tempo Merkle root, and canonical claims (iss/sub/iat/exp/jti/aud). The artifact AI labs hand to legal/procurement for EU AI Act Article 53(1)(d) transparency-obligation evidence. Per INVARIANTS.md W1.6: this attests to EU AI Act Article 53 ONLY (buyer-side GPAI-model-provider transparency obligation). It does NOT discharge a publisher's CDSM Article 4(3) reservation obligation — that lives on the rsl_get tool (jsonld=true variant). Never conflate. Optional content_id scopes the attestation to one article; default is license-wide. Window cap: 365 days. Auth: an audit-scoped buyer API key (OPEDD_BUYER_TOKEN) or OPEDD_BUYER_JWT.

NameRequiredDescriptionDefault
content_idNoOptional UUID of a specific article to scope the attestation. Default: license-wide.
license_idYesUUID of the enterprise_license OR legacy individual license to attest. Buyer must own it.
window_endNoISO 8601 upper bound. Default: now. Window may not exceed 365 days (hard cap).
window_startNoISO 8601 lower bound of the attestation window. Default: now - 90 days.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry the safe-read profile (readOnlyHint/idempotentHint/destructiveHint=false), and the description adds substantial context beyond them: output is a freshly-signed HS256 JWT verifiable offline against a canonical key, the embedded claims (iss/sub/iat/exp/jti/aud), the 365-day window cap, and the required auth (audit-scoped OPEDD_BUYER_TOKEN or OPEDD_BUYER_JWT).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and return format, and dense with actionable content, but it carries internal project references ('Phase 12 Wave 1 W1.4', 'INVARIANTS.md W1.6') that add noise for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully covers the return value (signed JWT with named claims), scope defaults, the hard window cap, auth requirements, and the boundary versus rsl_get. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are already documented. The description only restates scoping semantics (content_id default license-wide, window cap 365 days) that the schema itself provides, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Issue a signed JWT attesting to EU AI Act Article 53 compliance') with the exact endpoint, and explicitly distinguishes itself from the sibling rsl_get (CDSM Article 4(3) reservation). An agent can pick it over any sibling without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the concrete scenario ('artifact AI labs hand to legal/procurement for Article 53(1)(d) evidence') and an explicit when-NOT clause routing CDSM Article 4(3) obligations to rsl_get with 'never conflate'. Both the use case and the disambiguation are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browse_registryBrowse the licence registryA
Read-onlyIdempotent
Inspect

Lists licences recently issued on Opedd and the content they cover. Filters: publisher_id and article_id. Public; no key needed.

NameRequiredDescriptionDefault
limitNoNumber of results to return (default: 10, max: 50)
article_idNoFilter results to a specific article (UUID)
publisher_idNoFilter results to a specific publisher (UUID)

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds genuinely new behavioral context beyond the annotations: it is public and requires no API key, which is an auth requirement an agent needs. It omits pagination/default-limit behavior, keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short clauses, zero filler: what it returns, the filters, then the auth posture. Front-loaded with the resource and scope, so an agent can decide quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description states what the results contain (licences and the content they cover), which covers the return-value burden. Filters, defaults and auth are all accounted for; only result ordering/pagination detail is absent, which is minor for a read-only browse tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with all three parameters documented (limit, article_id, publisher_id), so the schema carries parameter meaning. The description only restates the two filter names and says nothing about limit or UUID format, adding no value beyond the schema. Baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Lists licences recently issued on Opedd and the content they cover,' which tells an agent exactly what comes back. It does not explicitly differentiate itself from close siblings such as list_licence_orders or verify_license, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Public; no key needed' plus the two named filters imply a browsing/discovery use case, but there is no explicit when-to-use statement, no exclusions, and no pointer to an alternative for related needs (e.g. list_licence_orders). Usage is inferable but not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detect_platformDetect a site's publishing platformA
Read-onlyIdempotent
Inspect

Detect the content platform behind a URL via POST /detect-platform (Phase 12 Wave 3 W3.1). Public no-auth lookup. Given a URL, identifies what platform powers it (Substack / Beehiiv / Ghost / Medium / Brevo / custom) and returns the suggested onboarding workflow. Hostname-detectable platforms (Substack subdomain, Beehiiv suffix, etc.) resolve in milliseconds; custom domains may take ~few seconds while the detector probes well-known platform endpoints in parallel. Returns: {platform, confidence, archive_method, forward_method, required_credentials, instructions}. The archive_method + forward_method fields are the two onboarding-workflow inputs Opedd's setup wizard reads (one for historical content backfill, one for new-content forward stream). instructions is human-readable operator copy explaining the inferred path.

NameRequiredDescriptionDefault
urlYesPublisher URL to inspect (any well-formed URL works; hostname-match short-circuits the probe path).

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, open-world, non-destructive, but the description adds real behavioral context beyond them: no auth required, hostname-matched platforms resolve in milliseconds while custom domains take a few seconds because the detector probes well-known endpoints in parallel. It also enumerates the returned fields and explains what archive_method/forward_method and instructions mean downstream.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, endpoint, and auth model before behavior and return shape, and every sentence carries information. The internal build tag '(Phase 12 Wave 3 W3.1)' and dense parenthetical detail are minor noise for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the return fields and their role, plus latency expectations. It leaves the semantics of the confidence value (scale/interpretation) unexplained, a minor gap for a detection tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single url parameter, so the schema already documents it. The description's added detail (any well-formed URL works, hostname-match short-circuits the probe) largely restates what the schema description already says, meeting but not exceeding the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (detect the content platform behind a URL) and names the exact endpoint, plus enumerates the detection targets (Substack / Beehiiv / Ghost / Medium / Brevo / custom). It is clearly distinct from siblings like verify_license, lookup_content, and purchase_license.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for use: public no-auth lookup on a publisher URL, returning the onboarding workflow inputs that Opedd's setup wizard consumes. It does not name an alternative tool or state when NOT to use it, so it falls short of explicit routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_audit_eventsRead your audit logA
Read-onlyIdempotent
Inspect

Returns the account's audit records, one per licensed access, each with its licence terms and on-chain attestation (Merkle root and inclusion proof once confirmed). Filter: event_type ('content_access', 'bulk_content_access' or 'compliance_report_generated'). At most 30 days per call. Read-only. Requires a buyer API key with the 'audit' scope, a buyer session, or the Opedd connector sign-in.

NameRequiredDescriptionDefault
toNoISO 8601 timestamp upper bound (inclusive)
fromNoISO 8601 timestamp lower bound (inclusive)
limitNoMax events per response (default: 50, max: 200)
cursorNoOpaque cursor for pagination
event_typeNoOptional event-class filter

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds real behavioral context beyond them: the 30-day-per-call window cap, that attestations are only Merkle-rooted once confirmed, and the exact auth paths required (buyer API key with 'audit' scope, buyer session, or connector sign-in). It does not discuss pagination behavior beyond the schema's cursor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with what is returned, then the filter, then the constraints and auth. No filler or repetition of schema field names.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-shape burden and does so ('each with its licence terms and on-chain attestation...'), plus range limits, filter semantics, and auth requirements. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds genuine semantic value the schema lacks: the 'at most 30 days per call' rule constrains what from/to may span, and the event_type filter values are put in context as 'event-class' selectors.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: returns the account's audit records, one per licensed access, and enumerates the per-record payload (licence terms, Merkle root, inclusion proof). This is clearly distinguishable from sibling tools like list_licence_orders or get_compliance_dossier, which deal with orders and dossiers rather than access events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives usable context (filter by event_type, max 30 days per call, auth conditions) but never states when to reach for this tool versus list_licence_orders, get_compliance_dossier, or article_53_attestation. Usage is implied by the resource, not routed explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_buyer_accountRead your buyer accountA
Read-onlyIdempotent
Inspect

Fetch the authenticated buyer's account profile + masked API key list via GET /buyer-account. Returns the enterprise_buyers row (contact_email, buyer_org, created_at, etc.) plus a list of all buyer-side API keys with masked prefixes (NEVER plaintext post-issuance — only the 12-char key_prefix is returned, e.g. 'opedd_buyer_'). Use cases: post-signup verification ('what was just issued to me?'), buyer dashboard mental model ('what licenses do I currently hold?'), audit prep ('show me the key list before rotation'). For full mid-lifecycle license details (filter_rules, billing, payouts), buyers consult the buyer portal at opedd.com/buyer. Requires OPEDD_BUYER_JWT (JWT-only by design: this surface manages API keys, and a key must never mint keys).

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/closed-world, and the description still adds substantive context: keys are masked to a 12-char prefix post-issuance and never returned in plaintext, and the call requires OPEDD_BUYER_JWT with a stated rationale ('a key must never mint keys'). That auth constraint and data-masking behavior are not derivable from the annotations or the empty schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and return payload in the first sentence, with use cases and auth constraints following in a logical order. It is on the long side and the three parenthetical use-case quotes are somewhat decorative, but every clause carries differentiating information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly compensates by enumerating the returned fields (enterprise_buyers row with contact_email, buyer_org, created_at) and the shape of the key list (masked 12-char prefixes). Combined with the auth requirement, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; there is no parameter syntax the description needs to compensate for. The schema coverage signal is 100% on an empty object, so nothing is left undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch the authenticated buyer's account profile + masked API key list') and even names the underlying endpoint GET /buyer-account. This clearly separates it from sibling read tools like verify_license or list_licence_orders, which concern licenses rather than the buyer's own account and key inventory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives three concrete trigger scenarios (post-signup verification, dashboard mental model, audit prep before rotation) and explicitly routes the agent elsewhere ('buyer portal at opedd.com/buyer') for mid-lifecycle license details such as filter_rules, billing, and payouts. The only gap is that it doesn't disambiguate against sibling MCP tools that might also surface buyer/license data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_compliance_dossierGet your compliance dossierA
Read-onlyIdempotent
Inspect

Returns the account's compliance dossier for a period: one row per licensed article, with article metadata, licence terms, on-chain attestation and flags for EU AI Act Article 53, CDSM Article 4(3) and text-and-data-mining reservations. At most 90 days per call; longer periods are paginated with _meta.next_cursor. Each call is recorded in the account's audit log. Requires a buyer API key with the 'audit' scope, a buyer session, or the Opedd connector sign-in.

NameRequiredDescriptionDefault
toYesISO 8601 timestamp upper bound (inclusive). Window cap 90 days.
fromYesISO 8601 timestamp lower bound (inclusive)
cursorNoOpaque cursor for pagination

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world behavior, so the safety profile is covered. Beyond that, the description adds substantive context: each call is recorded in the account's audit log, the 90-day cap and pagination behavior, and the required auth scopes/session types. This is meaningful behavioral disclosure above the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the return content, then layers window/pagination, audit-logging, and auth requirements in tight, information-dense sentences. Every sentence earns its place for a tool with this much operational nuance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully explains the return shape (row-per-article with metadata, terms, attestation, flags). Annotations cover safety, and the description covers pagination, window cap, audit logging, and auth requirements. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so from/to/cursor are already documented in the schema. The description reinforces the 90-day window and mentions pagination via _meta.next_cursor, but does not add format or syntax detail beyond what the schema already provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (returns the account's compliance dossier) and enumerates the exact return shape: one row per licensed article with metadata, licence terms, on-chain attestation, and specific regulatory flags (EU AI Act Article 53, CDSM Article 4(3), TDM reservations). This clearly distinguishes it from siblings like get_audit_events, article_53_attestation, and verify_license.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear operational context: a 90-day window cap, pagination via _meta.next_cursor, and explicit auth requirements (buyer API key with 'audit' scope, buyer session, or Opedd connector sign-in). It does not, however, explicitly compare this tool to alternatives such as get_audit_events or article_53_attestation, so no exclusion guidance is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contentRead a licensed articleA
Read-onlyIdempotent
Inspect

Retrieve the full body of a licensed article using a buyer API token (opedd_buyer_live_* canonical; opedd_buyer_test_* for sandbox). Requires OPEDD_BUYER_TOKEN env var (create one at opedd.com/licenses after purchasing). Works for per-article Human republication licences and for licence orders: AI answers monthly and client display return full text. Your self-serve buyer API key reads articles under every order your account holds — no separate order token is needed. AI answers pay-per-request (including the self-serve licence) does NOT retrieve articles: it answers 403 SEARCH_ONLY_LICENCE — ask a question with search_passages instead. Articles the publisher stopped licensing answer 403 ARTICLE_EXCLUDED. The publisher must have content delivery enabled and must have pushed content for the article. Phase 11 M2 RAG-extended shape: response includes 7 RAG-essential metadata fields — author, language, word_count, content_hash, image_urls, canonical_url, tags. On pre-2026-05-14 historical articles, optional fields (author/language/image_urls/canonical_url/tags) may be NULL. NULL means 'data unavailable for this article', NOT 'explicitly empty' — treat as data-missing when filtering; do not interpret as anti-match.

NameRequiredDescriptionDefault
article_idYesThe Opedd article UUID to retrieve content for
buyer_tokenNoBuyer API token (opedd_buyer_live_* or opedd_buyer_test_*). Falls back to OPEDD_BUYER_TOKEN env var.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds significant context beyond annotations: token format, env var requirement, licence types, error codes, and NULL semantics for pre-2026-05-14 articles. Annotations already indicate read-only, idempotent, closed-world behavior, so this is thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose but includes several dense parentheticals and error codes. It is informative but somewhat verbose and could be reorganized for better flow.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all critical context: authentication, licence applicability, error conditions, response shape, and NULL handling. No output schema, but it explains the RAG-extended response fields adequately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already documents both parameters at 100% coverage. The description adds value by specifying token format (opedd_buyer_live_* / opedd_buyer_test_*) and env var fallback, plus the note that no separate order token is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the specific action: retrieve the full body of a licensed article. It distinguishes itself from search_passages by noting that pay-per-request AI answers do not retrieve articles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly covers when to use (per-article Human republication licences, AI answers monthly, client display) and when not to use (AI answers pay-per-request → use search_passages). Also covers error conditions 403 SEARCH_ONLY_LICENCE and 403 ARTICLE_EXCLUDED.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_feedList a licence order's articlesA
Read-onlyIdempotent
Inspect

List articles from a buyer's licensed catalog via GET /enterprise-license (Phase 10 + 11). Content contract: AI training orders include full content_body for the back catalogue up to the order date (content_access 'included'). Every other order is discovery-only (content_body null): AI answers monthly and client display fetch text per article via get_content (content_access 'retrieval_per_article'); pay-per-request fetches billed snippets via get_content (content_access 'metered_per_call'). Returns JSON-format response with paginated articles. Use since (ISO 8601) for delta-feed polling — only articles published after the timestamp. Use cursor for pagination across pages. Credentials: the order's enterprise access key (OPEDD_ACCESS_KEY, ent_*) OR your buyer API key (OPEDD_BUYER_TOKEN) with order_id — if your account holds exactly one active order, order_id may be omitted; with several, the error lists them. For larger bulk corpus pulls, use stream_feed_ndjson (up to 1000 articles per call vs 200 here).

NameRequiredDescriptionDefault
limitNoMax articles per response (default: 50, max: 200)
sinceNoISO 8601 timestamp — return only articles with published_at > since
cursorNoOpaque cursor from the prior response's data.pagination.next_cursor
order_idNoThe licence order to list (UUID, from list_licence_orders). Used with a buyer API key; ignored with an ent_* key.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description does not need to restate safety. It adds real behavioral context beyond the annotations: the content contract per order type (included/discovery-only/metered), null content_body semantics, pagination, and delta-feed polling. It does not describe pagination mechanics such as next_cursor shape, but the schema covers cursor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Each sentence earns its place with contract and routing info, but the description is dense and front-loads implementation detail ('Phase 10 + 11') that does not help an agent select or invoke the tool. It is information-rich but could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, paginated list tool with a 100%-covered schema and annotations, the description is complete enough: it covers content access modes, auth, pagination, and bulk alternatives. The only gap is inherit return-shape detail for the 'included' content contract, which is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters well. The description reinforces since, cursor, and order_id semantics, but the schema is doing the heavy lifting; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('List articles from a buyer's licensed catalog') and even cites the endpoint. It explicitly distinguishes itself from stream_feed_ndjson and get_content, so an agent can tell what this tool does versus its siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names the alternatives and the conditions that select them: get_content for per-article text, stream_feed_ndjson for bulk pulls over 200 articles. It also gives credential/order_id prerequisites and the omittable-order_id case, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_licence_ordersList your licence ordersA
Read-onlyIdempotent
Inspect

Lists the account's licence orders, newest first, each with its lines (publication, licence, unit, price, quantity, status). With order_id, returns one order, each line with its Schedule text and the SHA-256 fingerprint recorded on the Tempo blockchain when the line was issued. Read-only. Requires a buyer API key with the 'audit' scope, a buyer session, or the Opedd connector sign-in.

NameRequiredDescriptionDefault
limitNoOrders per page (default 20, max 100)
cursorNoOpaque cursor from the prior response's pagination.next_cursor
order_idNoRead one order (UUID) including Schedule documents

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered. The description adds genuinely new behavioral context: result ordering, the per-line field set, the blockchain-anchored SHA-256 fingerprint disclosure, and the exact authentication scopes required. It does not describe pagination edge behavior, but that is minor against an already-strong annotation set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, then the order_id variant, then the access requirement. Dense and largely waste-free, though the field enumeration and the auth-sentence alternatives could be trimmed slightly without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly compensates by enumerating returned line fields and the extra Schedule/fingerprint payload for the single-order mode. Auth prerequisites and pagination are covered. Only minor gaps remain, such as what happens with an unknown or unauthorized order_id.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit, cursor and order_id are already documented in the schema itself (including 'max 100' and the next_cursor origin). The description adds only ordering information and a restatement of what order_id returns, which the schema already covers. Baseline 3 is appropriate when the schema carries the parameter detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lists the account's licence orders'), plus ordering ('newest first') and the exact payload ('publication, licence, unit, price, quantity, status'). It also distinguishes the two modes (list vs. single order via order_id), so an agent can tell it apart from siblings like place_licence_order or verify_license without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly signals the two usage modes: omit order_id to page through orders, pass order_id to fetch one order with Schedule text and fingerprint. It also gives the precondition (buyer API key with 'audit' scope, buyer session, or Opedd connector sign-in). It stops short of naming an alternative sibling for related needs (e.g., audit events), so it is not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_publisher_contentList your published articlesA
Read-onlyIdempotent
Inspect

List all licensable articles for the authenticated publisher (requires OPEDD_PUB_BEARER, or legacy OPEDD_API_KEY). Returns articles with titles, descriptions, pricing, and sales statistics. Set include_body=true to read back the STORED article text exactly as licensed buyers receive it (this is how you check that a push_content call stored what you meant; bodies are truncated to 8,000 characters per article, page size 20, paginate with cursor). Use article IDs from this list to purchase licenses via purchase_license.

NameRequiredDescriptionDefault
idNoWith include_body=true: fetch exactly one of your articles by id (full body, no truncation).
typeNoFilter by license type availability (ignored when include_body is true)
limitNoNumber of results (default: 20, max: 100; max 20 when include_body is true)
cursorNoOpaque next_cursor from a previous include_body=true call.
offsetNoPagination offset (default: 0; ignored when include_body is true — use cursor)
include_bodyNoReturn each article's stored body (what buyers receive). Default false.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/idempotent/non-destructive annotations: it names the required credential (OPEDD_PUB_BEARER or legacy OPEDD_API_KEY), the 8,000-character body truncation, page size 20, and cursor-based pagination. These are exactly the operational facts an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then credentials, then return shape, then the include_body workflow hook. Dense but organized; a few clauses (page size 20, cursor) duplicate the schema rather than earning their place in prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating returned fields (titles, descriptions, pricing, sales statistics). Auth, pagination, truncation, and the cross-tool workflow to purchase_license are all covered, so nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter, including the include_body/id interplay, the limit cap of 20 under include_body, and offset being ignored. The description largely restates these facts (truncation, page size, cursor), adding little semantic value beyond the schema baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all licensable articles for the authenticated publisher'), and the publisher-scoped framing distinguishes it from siblings like search_content, lookup_content, and browse_registry. An agent can identify this as the 'my own published content' listing tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: article IDs from this list feed purchase_license, and include_body=true is the way to verify a prior push_content write. It gives clear when-to-use context but never states when NOT to use it (e.g., vs. search_content for discovery), so it stops short of full alternative coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_contentLook up an article's licence and priceA
Read-onlyIdempotent
Inspect

Looks up an article on Opedd by its web address. Returns the title, publication, available licence types and prices, or that the article is not on Opedd.

NameRequiredDescriptionDefault
urlYesThe canonical URL of the article or content to look up

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real behavioral value the annotations don't: what the response contains (title, publication, licence types and prices) and the 'article is not on Opedd' negative case, which tells the agent to expect a miss rather than an error.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The lookup mechanism is front-loaded, then the return values and the negative case follow in the same sentence. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly carries the return-value burden and covers both the hit and miss cases. It stops short of mentioning error behavior, auth requirements, or whether non-Opedd URLs error versus return empty, but for a single-parameter read tool it is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single required 'url' parameter whose schema description already says 'canonical URL of the article or content to look up'. The description's 'by its web address' is slightly looser than the schema's 'canonical URL' and adds no new syntax or format detail, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('looks up an article on Opedd by its web address') and enumerates the payload: title, publication, licence types, prices, plus the not-found case. It's clear enough to distinguish from search_content or get_content, but it never names a sibling to disambiguate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'by its web address' implies you must already hold a URL, which suggests usage, but there is no explicit when-to-use, when-not-to-use, or pointer to alternatives like get_content or search_content. An agent must infer the routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

place_licence_orderPlace a licence orderAInspect

Place a licence order with Opedd for one or more publishers. One order = one licence and one billing mode; each publisher becomes its own Schedule priced from that publisher's settings (publishers that do not offer it are returned in unavailable and never charged). Licences: 'enterprise' (AI answers: 'monthly' full text per article, or 'metered' pay per answer, read through search_passages only; self-serve buyers need no order for this, the licence created when they add a card at sign-up already covers every publisher offering a per-answer price), 'archive' (Full catalogue: everything the publisher published up to the order date, kept permanently, not for AI training: 'one_time', full text in the feed), 'training' (AI training of the back catalogue up to the order date: 'one_time', bulk export via stream_feed_ndjson), 'display' (client display: 'monthly', quantity = number of end clients). A monthly AI answers subscription only covers articles published from the day it starts; set include_archive=true on a 'enterprise' + 'monthly' order to add each publisher's Full catalogue in the same order (complete access). Returns the order, its lines, the access key (works once paid) and hosted_invoice_url — the buyer (your principal) pays there. Requires a buyer session (OPEDD_BUYER_JWT) and terms_accepted=true after the buyer has accepted the Opedd Master Services Agreement (opedd.com/terms).

NameRequiredDescriptionDefault
licenceYesenterprise = AI answers, archive = Full catalogue (everything published up to the order date, kept permanently, no AI training), training = AI training, display = client display
quantityNodisplay only: number of end clients (1-500)
billing_modeYesenterprise: monthly | metered; archive: one_time; training: one_time; display: monthly
publisher_idsYesPublisher UUIDs (1-500; at most 18 for metered)
terms_acceptedYesREQUIRED. Set true only after the buyer has accepted the Opedd Master Services Agreement at opedd.com/terms. The current version label is recorded with the order; orders without genuine acceptance are rejected.
include_archiveNoOptional, monthly AI answers only (licence 'enterprise' + billing_mode 'monthly'). true adds each publisher's Full catalogue to the same order: everything published before the order date, kept permanently, not for AI training. Publishers that do not sell their Full catalogue are returned in `unavailable`.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare write/non-idempotent/non-destructive, and the description adds substantial context beyond them: requires a buyer session (OPEDD_BUYER_JWT) and genuine terms_accepted=true per the MSA, returns the access key (only valid once paid) and hosted_invoice_url where the buyer pays, and guarantees non-offering publishers appear in `unavailable` and are never charged. This is exactly the kind of auth, payment, and failure-mode disclosure the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and cardinality are front-loaded, but the body is a dense run-on packed with nested parentheticals covering four licence modes and cross-references, making it hard to scan. Most sentences carry needed detail, but the structure could be broken up and the description is close to over-length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter, multi-mode order tool with no output schema, it covers return contents (order, lines, access key, hosted_invoice_url), auth prerequisites, terms acceptance, and edge cases (unavailable publishers, monthly coverage window). Nothing essential to calling it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description adds interpretive value by explaining valid licence/billing_mode combinations and the monthly-answers temporal caveat ('only covers articles published from the day it starts'). It reinforces include_archive and quantity semantics but mostly duplicates what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Place a licence order with Opedd for one or more publishers') and immediately scopes the cardinality ('one order = one licence and one billing mode'). It clearly distinguishes itself from list_licence_orders, purchase_license, and verify_license by describing order creation with per-publisher Schedules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong conditional guidance: self-serve buyers need no order for enterprise/per-answer pricing, include_archive is only for 'enterprise' + 'monthly', and each licence/billing_mode pairing is enumerated. It names related siblings (search_passages, stream_feed_ndjson) as context but never explicitly contrasts when to choose this tool over purchase_license or list_licence_orders.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publisher_directoryList publishersA
Read-onlyIdempotent
Inspect

Lists the publications on Opedd with their article counts, licences, prices and sample articles. Filters: category (case-insensitive substring), min_articles and verified status. Public; no key needed.

NameRequiredDescriptionDefault
limitNoPage size cap.
offsetNoPagination offset.
categoryNoCase-insensitive substring filter on publisher category (e.g. 'finance', 'AI').
verifiedNo'true' to show only verified publishers (default), 'false' for unverified.
min_articlesNoFilter to publishers with at least this many licensable articles.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuinely useful context beyond them: it is public with no key required, and it discloses the shape of the response (counts, licences, prices, samples). Pagination/rate behavior is left to the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences: purpose and payload first, filters second, access requirement last. No redundancy and nothing that fails to earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming the returned fields, and it covers access requirements and the filter set. It omits pagination behavior and default ordering, but for a read-only list endpoint with fully documented parameters this is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit, offset, category, verified and min_articles are all already documented with equivalent detail (e.g. the case-insensitive substring note is repeated verbatim from the schema). The description adds no syntax or format meaning beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lists the publications on Opedd') and enumerates the returned fields (article counts, licences, prices, sample articles), which clearly separates it from siblings like search_content or list_publisher_content. It does not explicitly name a sibling alternative, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies the browse/discovery use case through the filter list and notes 'Public; no key needed', which tells the agent it can call this freely. However, it never says when to prefer this over browse_registry, list_publisher_content or search_content, so usage remains inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

purchase_licenseBuy an article licenceAInspect

Purchase a content license from the Opedd protocol using a Stripe payment method. Returns a license key (format: OP-XXXX-XXXX) and a certificate URL. The buyer receives a Handshake Email with their license key. Set OPEDD_BUYER_EMAIL and OPEDD_PAYMENT_METHOD_ID env vars to avoid passing them on every call. Single-article purchases are Human republication licences only (license_type 'human'). AI licences (AI answers, AI training, client display) are bought as licence orders: see place_licence_order.

NameRequiredDescriptionDefault
article_idNoOpedd article UUID (use this OR article_url)
buyer_nameNoFull name of the buyer (for the license record and certificate)
article_urlNoURL of the article to license (use this OR article_id)
buyer_emailNoEmail address for the license. Falls back to OPEDD_BUYER_EMAIL env var.
intended_useNoIntended use of the licensed content
license_typeYeshuman = Human republication (editorial republication of one article)
terms_acceptedYesREQUIRED. Set true only after the buyer (your principal) has accepted the Opedd licence terms at opedd.com/terms. The acceptance timestamp is recorded with the licence; purchases without genuine acceptance are rejected.
payment_method_idNoStripe payment method ID (pm_...). Falls back to OPEDD_PAYMENT_METHOD_ID env var.
buyer_organizationNoOrganization or company name (for enterprise/editorial licenses)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false), and the description adds useful behavior beyond them: the returned license key format, certificate URL, and the Handshake Email delivery. It stops short of warning that, given idempotentHint=false, a retried call likely creates a second charge — a notable omission for a payment tool, keeping it out of 5 territory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action and payment mechanism, then layers returns, side effects, and the sibling routing in a tight sequence. Every sentence carries information, though the env-var sentence slightly overlaps with schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully compensates by naming what comes back (license key, certificate URL) and the out-of-band Handshake Email. Combined with explicit sibling routing for AI licences, an agent has enough to call correctly, though the retry/duplicate-charge risk of a non-idempotent purchase is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 9 parameters including env-var fallbacks and the terms_accepted semantics are already documented in the schema. The description restates the env-var fallbacks (OPEDD_BUYER_EMAIL, OPEDD_PAYMENT_METHOD_ID) rather than adding new meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Purchase a content license from the Opedd protocol'), names the payment rail (Stripe), and adds concrete outputs (license key OP-XXXX-XXXX, certificate URL). It also draws a hard boundary against the sibling place_licence_order for AI licence types, so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly scopes the tool to single-article Human republication licences (license_type 'human') and tells the agent to use place_licence_order for AI licences, which is its closest sibling. It also flags the env-var shortcut (OPEDD_BUYER_EMAIL, OPEDD_PAYMENT_METHOD_ID) so callers know what need not be passed each time.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

push_contentPublish or update your articlesA
DestructiveIdempotent
Inspect

Push your published articles to Opedd so they can be licensed to AI buyers (requires OPEDD_PUB_BEARER — your opedd_sk_ publisher key). Send 1–100 articles per call; batch larger back-catalogues into multiple calls. Each article needs title, url, and html_body — everything else is optional (published_at defaults to now). This is the supply-side companion to list_publisher_content: use it to onboard your archive or push new content with no code, straight from your AI assistant.

NameRequiredDescriptionDefault
articlesYes1–100 articles to push in this call.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real context beyond the annotations: the required bearer credential (OPEDD_PUB_BEARER / opedd_sk_ publisher key), the 1–100 batch ceiling, and the minimal required fields with published_at defaulting to now. It does not, however, explain the update-on-conflict behavior implied by the title 'Publish or update' and by destructiveHint=true / idempotentHint=true, so the consequence of re-pushing an existing article remains unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences, front-loaded with the action and destination, then credentials, then batching limits. Every sentence carries operational information; only the closing 'no code, straight from your AI assistant' clause is marketing filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description should cover the return contract for a batch operation — e.g. whether results are per-article, how partial failures are reported, and whether re-pushing overwrites. Those are unaddressed, leaving a real gap for a destructive, batch, non-idempotent-looking write even though auth and limits are well covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents the array bounds, required fields, published_at default, and every optional field. The description restates the required trio and the default rather than adding format or constraint detail, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Push your published articles to Opedd') plus the downstream purpose ('licensed to AI buyers'). It explicitly positions itself against the sibling list_publisher_content, so an agent can separate supply-side push from read-side listing without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete conditions: onboard an archive, push new content, batch back-catalogues into multiple calls when over 100 articles. Names the companion tool list_publisher_content. It stops short of stating when not to use it or what to do if an article already exists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rsl_getRead a publisher's RSL licence termsA
Read-onlyIdempotent
Inspect

Fetch a publisher's RSL Standard manifest via GET /rsl-manifest (Phase 12 Wave 1 W1.1). Public no-auth endpoint — discovery surface for AI agents/crawlers wanting to know what's licensable from a publisher BEFORE going through the buyer-account signup flow. Returns the 4 canonical license types (ai_retrieval, ai_training, human_per_article, human_full_archive) the publisher has opted into, plus the EU CDSM Article 4(3) opt-out posture (tdm_reservation). Set jsonld: true to request the JSON-LD shape with embedded HMAC-SHA256 signed receipt over the CDSM Article 4(3) reservation state + tdm:reservationSignedAt timestamp — regulators can post-hoc verify the reservation was the claimed value at the claimed time. Default jsonld: false returns the raw RSL Standard JSON manifest. Per INVARIANTS.md W1.6: this is the PUBLISHER-side CDSM Article 4(3) declaration surface. It is NOT an EU AI Act Article 53 attestation (which is buyer-side, JWT-auth, via article_53_attestation tool).

NameRequiredDescriptionDefault
jsonldNoIf true, request JSON-LD shape (Accept: application/ld+json) with embedded HMAC-SHA256 signed receipt. Default false returns raw RSL Standard JSON shape.
publisher_idYesUUID of the publisher whose RSL manifest to fetch. Publisher must be verified.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it discloses the endpoint is public no-auth, that requesting jsonld:true embeds an HMAC-SHA256 signed receipt with a tdm:reservationSignedAt timestamp, and what the default response shape is. That is exactly the behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose and the no-auth/discovery framing, and most sentences earn their place. It is dense with internal references ('Phase 12 Wave 1 W1.1', 'INVARIANTS.md W1.6') that add no value to an invoking agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so: it enumerates the four license types and the tdm_reservation field, and distinguishes the JSON vs JSON-LD shapes. Nothing needed to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains why jsonld:true exists (regulators can post-hoc verify the reservation value and time) and confirms the default is the raw RSL Standard JSON shape. It does not add format detail for publisher_id beyond the schema's UUID/verified note.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch a publisher's RSL Standard manifest via GET /rsl-manifest') and pins the exact shape returned (4 canonical license types plus the CDSM Article 4(3) opt-out posture). It also explicitly distinguishes itself from the confusable sibling article_53_attestation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use ('discovery surface ... BEFORE going through the buyer-account signup flow') and an explicit when-not ('It is NOT an EU AI Act Article 53 attestation ... via article_53_attestation tool'). The alternative and the condition that selects it are both named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_contentFind who covers a topic (free, no text)A
Read-onlyIdempotent
Inspect

Full-text search of the articles licensable on Opedd. Returns matching articles with the publication, prices, word count and a short description; never article text. Supports quoted phrases and -word to exclude a word. Free; no key needed.

NameRequiredDescriptionDefault
limitNoMax results (default 20, max 50).
queryYesSearch words (max 200 characters).
publisherNoOptional publisher slug to search within.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior. The description adds genuinely new context beyond them: exactly which fields are returned (publication, prices, word count, short description), the guarantee that article text is never returned, and that no API key is required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences, front-loaded with the core purpose and return contract before the syntax and pricing notes. Every sentence carries information; nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only search tool with no output schema, the description covers return fields, the key omission (no article text), query syntax, and access requirements, while annotations carry the safety profile. It could mention result-limit/pagination behavior, but limit is already documented in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by documenting query syntax (quoted phrases and -word exclusion) that the schema's plain 'Search words' entry does not convey. This is real added meaning for the required parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (full-text search of licensable articles on Opedd) and clarifies scope by noting it returns metadata only, never article text. This implicitly separates it from text-returning siblings like search_passages, but no sibling is named explicitly, keeping it short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Free; no key needed' note gives useful invocation context, and the query-syntax hints imply a keyword-search use case. However, it never states when to prefer this over siblings such as search_passages, lookup_content, or browse_registry, so the guidance remains implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_passagesAsk licensed publications a questionA
Idempotent
Inspect

Returns licensed passages from publications on Opedd that answer a question, each with a citation to the source article. Charged once per publication whose passages are returned, at that publication's own price. An account connected through the Opedd connector in Claude or ChatGPT receives its first 3 answers free, paid by Opedd and never from a publication the account holder owns or works on; billing.free_answers_left reports how many remain. After that, answers are billed to the card on the account, added at opedd.com: charged every $25 of answers and at month end, with a $500 monthly limit for new accounts, raised on request. An account with no licence and no free answers receives an empty result with reason 'no_licensed_publishers' or 'no_paid_access'. Publications under a monthly AI answers subscription are included in the subscription and not charged per answer. Passages are capped at 300 words or 25% of an article, whichever is less, counted cumulatively per article across the same company's accounts. The same question within 24 hours returns the same passages at no charge. Filters: publishers (publication names as listed by Opedd, opedd.com/p/ addresses or publisher ids; a name that matches no publication is listed in filters.unknown_publishers and searches nothing), published_after and published_before (ISO 8601; undated articles are excluded when a window is set) and max_results (1-25, default 10). Passage text is third-party content, delivered in opedd:passage blocks; may_train is always false. Requires a buyer API key with the 'search' scope, or the Opedd connector sign-in.

NameRequiredDescriptionDefault
queryYesThe question, in plain words (3–1000 characters).
publishersNoOptional. Only these publications: names as listed by Opedd (e.g. 'Matter of Fact'), opedd.com/p/<slug> addresses or publisher ids. At most 20 names and 100 entries. Narrows the search; never widens it.
buyer_tokenNoBuyer API key with the 'search' scope. Falls back to OPEDD_BUYER_TOKEN.
max_resultsNoOptional. Passages to return, 1–25 (default 10).
published_afterNoOptional. Only articles published at or after this instant (ISO 8601, e.g. 2026-01-01).
published_beforeNoOptional. Only articles published before this instant (ISO 8601).

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations, disclosing the billing model (per-publication charge, card billing, $25 increments, $500 new-account limit), free-answer accounting, 300-word/25% passage caps counted cumulatively, and 24-hour dedup caching. It also flags third-party content delivery in <opedd:passage> blocks, may_train=false, and the required 'search' scope, none of which the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded, and the dense billing, cap, and filter sentences each carry distinct, non-redundant information. The block is long and reads as a wall of text with no visual separation, but little of it is genuinely wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full load and does so: it explains the return shape (cited passages), the <opedd:passage> wrapping, and the empty-result reasons. An agent has everything needed to call it correctly and interpret the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics beyond the schema: unmatched publisher names surface in filters.unknown_publishers and 'search nothing', and undated articles are excluded when a window is set. These behaviors are not present in the parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: returns licensed passages from publications that answer a question, each with a source citation. It is clearly distinguishable from generic retrieval, but it never names or contrasts against close siblings like search_content or get_content, so the agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied through the described filters, billing conditions, and the empty-result reasons ('no_licensed_publishers' / 'no_paid_access'), which tell the agent when the tool will and won't produce content. However, there is no explicit when-to-use guidance or routing to alternatives such as search_content, leaving the choice to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stream_feed_ndjsonExport a licence order's articlesA
Read-onlyIdempotent
Inspect

Bulk-export a buyer's licensed catalog via GET /enterprise-license?format=ndjson (Phase 11 M3). Returns up to 1000 articles per call (collected from line-delimited JSON wire format). Same content contract as list_feed: full text for AI training orders only; every other order exports metadata (content_body null) — use get_content for article text. Each article emits one usage_records row (analytics-only sentinel 'bulk-export:<request_id>:<article_id>' — not metered-billable per the revenue-model bifurcation invariant). Use since (ISO 8601) for delta-feed. Use cursor to paginate beyond 1000. Backend supports 5000 articles per call; the MCP cap is 1000 for transport reasonability. Real bulk-ingest pipelines should use the Python SDK (pip install opedd) directly — not via MCP. Credentials as list_feed: OPEDD_ACCESS_KEY (ent_*) OR your buyer API key + order_id.

NameRequiredDescriptionDefault
limitNoMax articles per response (default: 200, max: 1000)
sinceNoISO 8601 timestamp — return only articles with published_at > since
cursorNoOpaque cursor from the prior result's meta.next_cursor
order_idNoThe licence order to export (UUID). Used with a buyer API key; ignored with an ent_* key.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive behavior, but the description adds substantial context beyond structured fields: the content contract (full text only for AI training orders), usage_records sentinel behavior, the 1000 vs 5000 article discrepancy, and credential requirements. This is rich disclosure for a read-only export.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the core purpose and every clause carries specific operational information. However, the single dense paragraph with heavy parentheticals and internal jargon ('Phase 11 M3', 'revenue-model bifurcation invariant') reduces readability without adding much for an external agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex bulk-export tool with no output schema and full schema coverage, the description covers content contract, pagination, limits, credentials, alternatives, and SDK routing. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents limit, since, cursor, and order_id. The description reinforces usage ('Use since for delta-feed', 'Use cursor to paginate beyond 1000') but adds little semantic detail beyond what the schema provides, so it sits at the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Bulk-export a buyer's licensed catalog') and even names the wire format and endpoint. It explicitly distinguishes itself from list_feed and get_content, so an agent can select it without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states exactly when to use this tool versus alternatives: use get_content for article text, use the Python SDK for real bulk-ingest pipelines, and use since/cursor for delta and pagination. Exclusions and conditions are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_licenseVerify a licence keyA
Read-onlyIdempotent
Inspect

Checks an Opedd licence key. Returns the licence details (article title, publication, licence type, issue date, amount paid, buyer and blockchain proof status), or that the key was not found.

NameRequiredDescriptionDefault
license_keyYesThe license key to verify (format: OP-XXXX-XXXX)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds meaningful extra context: the specific fields returned and the not-found outcome. It does not mention auth requirements or rate limits, so it falls short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the return payload described before the failure case — good front-loading and no wasted clauses. The first sentence lightly restates the title, which is the only inefficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the returned fields and states the negative outcome, which is exactly what an agent needs for a single-parameter lookup. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter, and the schema already documents it fully (100% coverage) including the OP-XXXX-XXXX format. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (checks/verifies) and resource (an Opedd licence key), clearly distinguishable from siblings such as purchase_license, list_licence_orders, and place_licence_order. An agent can tell what this does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied — verify a key you already hold — but the description names no alternatives or conditions (e.g., when to use this instead of list_licence_orders or get_audit_events). No exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.12.5
    • Addedarticle_53_attestation
    • Addedget_audit_events
    • Addedget_buyer_account
    • Addedget_compliance_dossier
    • Addedget_content
    • Addedlist_feed
    • Addedlist_licence_orders
    • Addedlist_publisher_content
    • Addedpush_content
    • Addedsearch_passages
    • Addedstream_feed_ndjson
  2. 4 tool updatesv0.6.8
    • Addedplace_licence_order
    • Removedpurchase_enterprise_license
    • Changedpurchase_license4 fields changed
      • changedInput schema / properties / license_type / description
        Previous value: -"human = republication/editorial rights, ai = training dataset rights, ai_inference = inference/RAG rights"New value: +"human = Human republication (editorial republication of one article)"
      • changedInput schema / properties / license_type / enum
        Previous value: -[
        -  "human",
        -  "ai",
        -  "ai_inference"
        -]New value: +[
        +  "human"
        +]
      • addedInput schema / properties / terms_accepted
        Added value: +{
        +  "description": "REQUIRED. Set true only after the buyer (your principal) has accepted the Opedd licence terms at opedd.com/terms. The acceptance timestamp is recorded with the licence; purchases without genuine acceptance are rejected.",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "license_type"
        -]New value: +[
        +  "license_type",
        +  "terms_accepted"
        +]
    • Addedsearch_content
  3. 8 tool updatesv0.6.7
    • First observedbrowse_registry
    • First observeddetect_platform
    • First observedlookup_content
    • First observedpublisher_directory
    • First observedpurchase_enterprise_license
    • First observedpurchase_license
    • First observedrsl_get
    • First observedverify_license

TDQS

A3.9/5.0

Scored across 20 tools

Disambiguation3/5

Most tools target distinct resources, but several pairs blur together: purchase_license vs place_licence_order (both buy licences), list_feed vs stream_feed_ndjson (same catalog, different transport), and get_audit_events vs get_compliance_dossier vs list_licence_orders (overlapping audit surfaces). The verbose descriptions do most of the disambiguation work, which suggests the tool boundaries are not self-evident from names alone.

Naming Consistency3/5

The overall pattern is verb_noun snake_case, which is good, but the set mixes US 'license' (purchase_license, verify_license) with UK 'licence' (place_licence_order, list_licence_orders) for the same core concept, and it intermixes noun-only tools like publisher_directory and rsl_get. The inconsistent spelling of the central domain object is a real readability hazard.

Tool Count4/5

20 tools is on the heavy side of the 3-15 ideal, but this is a two-sided licensing marketplace spanning buyer search/purchase, licence orders, feeds, audit/compliance, and publisher supply-side operations, so each tool maps to a defensible capability. Slightly over-scoped rather than bloated.

Completeness4/5

Coverage is broad: discovery (search_content, lookup_content, publisher_directory, rsl_get), purchase and ordering, delivery (get_content, list_feed, stream_feed_ndjson, search_passages), audit/compliance, and publisher supply (push_content, list_publisher_content). Minor gaps exist around updating or deleting pushed content and buyer account mutation, but core workflows are covered end to end.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Provenance-first web access for AI agents, delivering clean content with verifiable source metadata and SEC EDGAR financial data.
    8
    114 npm
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Provides AI agents and RAG pipelines with production-grade web search, deep research, news, academic, extraction, crawling, and source verification tools. Enables citation-anchored, deduplicated, fresh, and security-hardened evidence gathering from across the web.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to search a proprietary knowledge base for free and buy access to documents or passages on demand, with automatic payment, licensing, and citation.
    MIT