<aside> 🧭
</aside>
Connecting MCP Client to Cashmere MCP Server
How to access Wiley Content in Perplexity
Preparing Structured Data for Ingestion
Uploading New Content via the website
Cashmere Link Guide (OAuth) Overview
Third-Party OAuth Integration Guide for Publishers (BYOL / Short Link)
Connecting Wiley with Perplexity | DEPRECATED
This guide is for publishers who want to allow users to access their content on Cashmere that has already been licensed on the publishers platform. We refer to this setup as Bring Your Own License (BYOL) and Short Link.

This image visualizes the flow of how your integration would work. In the first Image, Cashmere Link notifies the user that a 3rd party is facilitating the connection. The second and third images are intended to represent your auth flow. In the last image, when the token and the scopes have been returned to Cashmere, we present it back to the user and confirm the authentication process.
As a third-party publisher, you will:
In your OAuth provider (Auth0, Okta, custom implementation, etc.), create a new web application with these specifications:
Your OAuth application must support these scopes:
openid - Standard OpenID Connect scopeemail - User email address (required for account matching)offline_access - Refresh token support (required for Cashmere to check user access later)https://cashmere.io/collection_ids - Custom scope for collection accessSet your OAuth application's redirect URI to:
<https://cashmere.io/publisher_oauth/callback>
Important: The redirect URI must match exactly. Contact Cashmere if you need a different domain or custom redirect URL.
You'll need to provide these details to Cashmere:
The most critical part of the integration is implementing the https://cashmere.io/collection_ids custom claim. This claim tells Cashmere which content collections a user has access to. Cashmere validates passed collection ids to ensure you are the owner of them.
https://cashmere.io/collection_ids"1,5,10,15" (user has access to collections 1, 5, 10, and 15)Auth0 Post Login Trigger:
exports.onExecutePostLogin = async (event, api) => {
if (event.transaction?.requested_scopes?.includes("<https://cashmere.io/collection_ids>")) {
// Determine user's collection access based on your business logic
const userCollections = getUserCollections(event.user.user_id);
api.idToken.setCustomClaim(
"<https://cashmere.io/collection_ids>",
userCollections.join(',') // eg "1,2,3"
);
}
};
You need to implement logic to determine which collections a user can access. This typically involves:
It also might be as simple as a hard-coded list if you are granting all of your users access to a set list of collections.
function getUserCollections(userId) {
const user = getUserFromDatabase(userId);
const collections = [];
// Add collections based on subscription tier
if (user.subscription === 'premium') {
collections.push(1, 2, 3, 4, 5); // Premium collections
} else if (user.subscription === 'basic') {
collections.push(1, 2); // Basic collections only
}
// Add organization-specific collections
if (user.organization === 'university_a') {
collections.push(10, 11, 12); // University A collections
}
return collections;
}
Your implementation should support dynamic access changes. Cashmere will update the collections list via an OAuth token refresh after each API Token each time it is used.
Contact Cashmere with the following information:
https://your-provider.com/oauth/authorizehttps://your-provider.com/oauth/tokenYou will receive a unique identifier which you will be able to test the connection with via
https://cashmere.io/publisher_oauth/<publisher_provider_uuid>
