You need two things: an active Second Opinion for Sales seat, and the Microsoft 365 account that holds it.
There is no API key to copy or store. Your Microsoft sign-in is the credential. Your agent connects with a Microsoft token tied to your account and your seat.
Second Opinion for Sales is reached through a single tool, ocean_scores, over the Model Context Protocol. Access is gated by Microsoft Entra ID. When your agent connects, it signs in with your Microsoft 365 account and receives a short-lived token. That token carries your identity and confirms your seat on every call. Nothing else needs to be configured for authorization.
Some agent platforms sign in interactively the first time you connect. Others (developer APIs) expect you to supply a token you have already obtained. Both paths use the same connection details below.
Your agent signs in through an app registration that lives in your own Microsoft 365 tenant. You create it once and every agent platform below uses it. No Pansophy credential is ever shared with you, and your credential is never shared with Pansophy.
az ad sp create --id 86171dc8-e8f7-499f-ad82-595d75162961These values are the same for every agent platform. Use the ones your platform asks for.
If you are building an agent directly against a model API, you supply a Microsoft token to the MCP server yourself. First obtain a delegated user token for the scope above, then pass it on the connection.
Any standard Microsoft Entra sign-in that produces a delegated user token works. The device-code flow is the simplest for a one-time setup:
# 1. request a device code
curl -s -X POST \
https://login.microsoftonline.com/organizations/oauth2/v2.0/devicecode \
-d "client_id=YOUR_APP_CLIENT_ID" \
-d "scope=api://86171dc8-e8f7-499f-ad82-595d75162961/Score.Read offline_access openid"
# 2. open the verification_uri, enter the user_code, sign in
# 3. exchange the device_code for an access token
curl -s -X POST \
https://login.microsoftonline.com/organizations/oauth2/v2.0/token \
-d "grant_type=urn:ietf:params:oauth:grant-type:device_code" \
-d "client_id=YOUR_APP_CLIENT_ID" \
-d "device_code=<device_code>"
Use the resulting access_token as the bearer below. The refresh_token lets you renew it without signing in again.
{
"type": "mcp",
"server_label": "second-opinion-for-sales",
"server_url": "https://pansophy-apim.azure-api.net/mcp",
"headers": {
"Authorization": "Bearer <access_token>"
}
}
"mcp_servers": [
{
"type": "url",
"url": "https://pansophy-apim.azure-api.net/mcp",
"name": "second-opinion-for-sales",
"authorization_token": "<access_token>"
}
]
The tool takes the text you want analyzed and the role of the speaker, and returns behavioral (OCEAN) scores together with a sales-tuned interpretation and coaching.
400 and no more than 50,000 characters.seller for your own side of the conversation, or prospect for the counterparty's text. One speaker per call: submit one side of the conversation at a time.Your agent handles the speaker work. Second Opinion for Sales reads one person at a time and does not split a multi-speaker conversation for you. Your agent is responsible for parsing the conversation, identifying the speakers, isolating the text for the one person you want scored, and labeling whose words they are with the role input. Pass one speaker per call.
A high or low standing on any dimension is a position with trade-offs in a sales context, not a measure of good or bad. The interpretation describes patterns in the text, not the person.
Your submitted text is scrubbed for personal information, scored, and discarded. It is never stored. Each seat includes up to 100 analyses per month.
If a call is rejected, the response carries a code that tells you what to fix.
| Condition | What it means and what to do |
|---|---|
delegated_requiredinsufficient_scope | The token is not a delegated user token carrying Score.Read, or it was issued to an application rather than a signed-in user. Re-obtain the token using the scope above and make sure a person signs in. |
tenant_not_provisionedseat_verification_required | The account does not yet have an active seat, or the first-connect license check has not completed. Confirm the subscription in AppSource. The first call right after activation may need a moment. |
tenant_mismatch | The token was issued for a different Microsoft 365 tenant than the seat. Sign in with the account that holds the seat. |
invalid_jwtexpired_jwt | The token is malformed or has expired. Obtain a fresh token (or use your refresh token) and retry. |
monthly_cap_reached | This seat has used its 100 analyses for the month. The count resets at the start of the next month. |
role_requiredinvalid_role | The role input is missing or not one of seller / prospect. Set it and retry. |
| Text length | Submitted text must be between 400 and 50,000 characters. Shorten or lengthen the input and retry. |
If you are stuck on any step: