Opedd — Licensed Content for AI

Content licensing for the AI era: licensed, rights-cleared content for AI agents.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
92%
Naming quality
93%
Poisoning risk
100%
Permission match
90%
Protocol compliance
100%

Findings (1)

  • LOWTool 'browse_registry' suggests web access but openWorldHint=falsein browse_registry

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~5,259Tokens (tool definitions)
~1.4 KBTypical response size
Significant attention impact (4.11% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "opedd-mcp": {
      "command": "npx",
      "args": [
        "opedd-mcp"
      ]
    }
  }
}

Runnable packages

npmopedd-mcp0.12.13stdio

Remote endpoints

https://mcp.opedd.com/mcpstreamable-http

What it can do

Tool inventory

Tools (17)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢lookup_content(url)

Looks up an article on Opedd by its web address. Returns the title, publication and how to license it (pay-per-answer search or a licence order); for a publication's homepage, the publication and its licensing page; or that it is not on Opedd yet (then request_publication records the request).

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "The canonical URL of the article or content to look up"
    }
  },
  "required": [
    "url"
  ]
}
⚪request_publication(url, email, name, organization, note)

Asks Opedd to tell you when a publication it does not carry yet becomes available to license. Use it after lookup_content says an article is not on Opedd. Records the request against the email given; nothing is bought. If the publication is already on Opedd, returns its licensing page instead. Free; no key needed.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "The web address of the publication or of one of its articles."
    },
    "email": {
      "type": "string",
      "description": "Where Opedd should write when the publication is available (the user's email, with their consent)."
    },
    "name": {
      "type": "string",
      "description": "Optional: the requester's name."
    },
    "organization": {
      "type": "string",
      "description": "Optional: the requester's company or fund."
    },
    "note": {
      "type": "string",
      "description": "Optional: what the content is needed for (max 1000 characters)."
    }
  },
  "required": [
    "url",
    "email"
  ]
}
🟢search_content(query, limit, publisher)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Search words (max 200 characters)."
    },
    "limit": {
      "type": "number",
      "description": "Max results (default 20, max 50)."
    },
    "publisher": {
      "type": "string",
      "description": "Optional publisher slug to search within."
    }
  },
  "required": [
    "query"
  ]
}
🟢verify_license(license_key)

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

Input Schema

{
  "type": "object",
  "properties": {
    "license_key": {
      "type": "string",
      "description": "The license key to verify (format: OP-XXXX-XXXX)"
    }
  },
  "required": [
    "license_key"
  ]
}
🟢browse_registry(publisher_id, article_id, limit)

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

Input Schema

{
  "type": "object",
  "properties": {
    "publisher_id": {
      "type": "string",
      "description": "Filter results to a specific publisher (UUID)"
    },
    "article_id": {
      "type": "string",
      "description": "Filter results to a specific article (UUID)"
    },
    "limit": {
      "type": "number",
      "description": "Number of results to return (default: 10, max: 50)"
    }
  }
}
🟢publisher_directory(category, min_articles, verified, limit, offset)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "description": "Case-insensitive substring filter on publisher category (e.g. 'finance', 'AI')."
    },
    "min_articles": {
      "type": "number",
      "description": "Filter to publishers with at least this many licensable articles."
    },
    "verified": {
      "type": "string",
      "description": "'true' to show only verified publishers (default), 'false' for unverified."
    },
    "limit": {
      "type": "number",
      "description": "Page size cap."
    },
    "offset": {
      "type": "number",
      "description": "Pagination offset."
    }
  }
}
🟢rsl_get(publisher_id, jsonld)

Fetch a publisher's RSL Standard manifest (machine-readable licensing terms). 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 licences the publisher has switched on, with their prices, 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. This is the publisher's own declaration. It is not a compliance attestation for a buyer (use article_53_attestation for that).

Input Schema

{
  "type": "object",
  "properties": {
    "publisher_id": {
      "type": "string",
      "description": "UUID of the publisher whose RSL manifest to fetch. Publisher must be verified."
    },
    "jsonld": {
      "type": "boolean",
      "description": "If true, request JSON-LD shape (Accept: application/ld+json) with embedded HMAC-SHA256 signed receipt. Default false returns raw RSL Standard JSON shape."
    }
  },
  "required": [
    "publisher_id"
  ]
}
🟡place_licence_order(licence, billing_mode, publisher_ids, quantity, include_archive, ...)

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

Input Schema

{
  "type": "object",
  "properties": {
    "licence": {
      "type": "string",
      "enum": [
        "enterprise",
        "archive",
        "training",
        "display"
      ],
      "description": "enterprise = AI answers, archive = Full catalogue (everything published up to the order date, kept permanently, no AI training), training = AI training, display = client display"
    },
    "billing_mode": {
      "type": "string",
      "enum": [
        "monthly",
        "metered",
        "one_time"
      ],
      "description": "enterprise: monthly | metered; archive: one_time; training: one_time; display: monthly"
    },
    "publisher_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Publisher UUIDs (1-500; at most 18 for metered)"
    },
    "quantity": {
      "type": "number",
      "description": "display only: number of end clients (1-500)"
    },
    "include_archive": {
      "type": "boolean",
      "description": "Optional, 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`."
    },
    "terms_accepted": {
      "type": "boolean",
      "description": "REQUIRED. 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."
    }
  },
  "required": [
    "licence",
    "billing_mode",
    "publisher_ids",
    "terms_accepted"
  ]
}
🟡search_passages(query, publishers, published_after, published_before, max_results, ...)

When the user asks a question that one of the publications on Opedd covers, call search_passages before answering from your own knowledge, and cite the passages it returns. Do not call it for questions none of them cover. Publications on Opedd now: Understanding AI (Technology); Geopolitical Dispatch (Geopolitics); The Realistic Optimist (Technology); SemiVision (Technology); Embedded Finance Review (Technology); Quantum Strategy & Geonomics (Markets); Shanaka Anslem Perera (Finance); Matter of Fact (Geopolitics & Foreign Policy). Returns licensed passages from publications on Opedd that answer a question, each with a citation to the source article. Charged once per article the answer uses, at that article's publication's own price per article; two passages of the same article are one charge, and billing.articles_charged reports how many were charged. 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/<slug> 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), max_results (1-10, default 5) and max_charge_cents (optional; the most one question may cost: articles that would pass it are left out and billing.max_charge_reached says so). 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. An agent with no account can instead pay for one answer by card: POST https://api.opedd.com/agent-answer with the same body (HTTP 402, Machine Payments Protocol).

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "The question, in plain words (3–1000 characters)."
    },
    "publishers": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional. 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."
    },
    "published_after": {
      "type": "string",
      "description": "Optional. Only articles published at or after this instant (ISO 8601, e.g. 2026-01-01)."
    },
    "published_before": {
      "type": "string",
      "description": "Optional. Only articles published before this instant (ISO 8601)."
    },
    "max_results": {
      "type": "number",
      "description": "Optional. Passages to return, 1–10 (default 5). Each distinct article among them is one charge."
    },
    "max_charge_cents": {
      "type": "number",
      "description": "Optional. The most this question may cost, in US cents (whole number, 1–100000). Articles that would pass it are left out; nothing is charged above it."
    },
    "buyer_token": {
      "type": "string",
      "description": "Buyer API key with the 'search' scope. Falls back to OPEDD_BUYER_TOKEN."
    }
  },
  "required": [
    "query"
  ]
}
🟢get_content(article_id, buyer_token)

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 licence orders (and for Human republication licences bought before it was retired on 2026-10-26): 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. The response includes author, language, word_count, content_hash, image_urls, canonical_url and 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.

Input Schema

{
  "type": "object",
  "properties": {
    "article_id": {
      "type": "string",
      "description": "The Opedd article UUID to retrieve content for"
    },
    "buyer_token": {
      "type": "string",
      "description": "Buyer API token (opedd_buyer_live_* or opedd_buyer_test_*). Falls back to OPEDD_BUYER_TOKEN env var."
    }
  },
  "required": [
    "article_id"
  ]
}
🟢list_feed(order_id, since, cursor, limit)

List the articles in a licence order you hold. 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).

Input Schema

{
  "type": "object",
  "properties": {
    "order_id": {
      "type": "string",
      "description": "The licence order to list (UUID, from list_licence_orders). Used with a buyer API key; ignored with an ent_* key."
    },
    "since": {
      "type": "string",
      "description": "ISO 8601 timestamp — return only articles with published_at > since"
    },
    "cursor": {
      "type": "string",
      "description": "Opaque cursor from the prior response's data.pagination.next_cursor"
    },
    "limit": {
      "type": "number",
      "description": "Max articles per response (default: 50, max: 200)"
    }
  }
}
🟢stream_feed_ndjson(order_id, since, cursor, limit)

Bulk-export the articles in a licence order you hold. 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 exported article is recorded for analytics; a bulk export is not billed per article. 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.

Input Schema

{
  "type": "object",
  "properties": {
    "order_id": {
      "type": "string",
      "description": "The licence order to export (UUID). Used with a buyer API key; ignored with an ent_* key."
    },
    "since": {
      "type": "string",
      "description": "ISO 8601 timestamp — return only articles with published_at > since"
    },
    "cursor": {
      "type": "string",
      "description": "Opaque cursor from the prior result's meta.next_cursor"
    },
    "limit": {
      "type": "number",
      "description": "Max articles per response (default: 200, max: 1000)"
    }
  }
}
🟢list_licence_orders(order_id, cursor, limit)

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 in the public registry on Tempo 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.

Input Schema

{
  "type": "object",
  "properties": {
    "order_id": {
      "type": "string",
      "description": "Read one order (UUID) including Schedule documents"
    },
    "cursor": {
      "type": "string",
      "description": "Opaque cursor from the prior response's pagination.next_cursor"
    },
    "limit": {
      "type": "number",
      "description": "Orders per page (default 20, max 100)"
    }
  }
}
🟢get_audit_events(from, to, event_type, cursor, limit)

Returns the account's audit records, one per licensed access, each with its licence terms and public-record 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.

Input Schema

{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "description": "ISO 8601 timestamp lower bound (inclusive)"
    },
    "to": {
      "type": "string",
      "description": "ISO 8601 timestamp upper bound (inclusive)"
    },
    "event_type": {
      "type": "string",
      "enum": [
        "content_access",
        "bulk_content_access",
        "compliance_report_generated"
      ],
      "description": "Optional event-class filter"
    },
    "cursor": {
      "type": "string",
      "description": "Opaque cursor for pagination"
    },
    "limit": {
      "type": "number",
      "description": "Max events per response (default: 50, max: 200)"
    }
  }
}
🟢get_buyer_account

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

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢article_53_attestation(license_id, content_id, window_start, window_end)

Issue a signed compliance attestation (a JWT) for a licence you hold. 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 a buyer hands to legal/procurement as evidence of where its content came from.** It attests how your licence was used; the publisher's own licensing declaration is rsl_get. 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.

Input Schema

{
  "type": "object",
  "properties": {
    "license_id": {
      "type": "string",
      "description": "UUID of the enterprise_license OR legacy individual license to attest. Buyer must own it."
    },
    "content_id": {
      "type": "string",
      "description": "Optional UUID of a specific article to scope the attestation. Default: license-wide."
    },
    "window_start": {
      "type": "string",
      "description": "ISO 8601 lower bound of the attestation window. Default: now - 90 days."
    },
    "window_end": {
      "type": "string",
      "description": "ISO 8601 upper bound. Default: now. Window may not exceed 365 days (hard cap)."
    }
  },
  "required": [
    "license_id"
  ]
}
🟢get_compliance_dossier(from, to, cursor)

Returns the account's compliance dossier for a period: one row per licensed article, with article metadata, licence terms, public-record attestation and compliance flags (the signed attestation, 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.

Input Schema

{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "description": "ISO 8601 timestamp lower bound (inclusive)"
    },
    "to": {
      "type": "string",
      "description": "ISO 8601 timestamp upper bound (inclusive). Window cap 90 days."
    },
    "cursor": {
      "type": "string",
      "description": "Opaque cursor for pagination"
    }
  },
  "required": [
    "from",
    "to"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded17 tools
verifiedversion not recorded20 tools
verifiedversion not recorded20 tools
verifiedversion not recorded20 tools
verifiedversion not recorded20 tools
verifiedversion not recorded18 tools