{
  "name": "50heads",
  "description": "Ask fifty verified people a short question and see what they think. Use it for human preferences and first impressions, never for facts. Estimate first (free), then ask: the task works until the heads answer and completes with a results artifact.",
  "supportedInterfaces": [
    {
      "url": "https://mcp.50heads.com/a2a",
      "protocolBinding": "JSONRPC",
      "protocolVersion": "1.0"
    },
    {
      "url": "https://mcp.50heads.com/a2a/rest",
      "protocolBinding": "HTTP+JSON",
      "protocolVersion": "1.0"
    },
    {
      "url": "https://mcp.50heads.com/a2a",
      "protocolBinding": "JSONRPC",
      "protocolVersion": "0.3"
    },
    {
      "url": "https://mcp.50heads.com/a2a/rest",
      "protocolBinding": "HTTP+JSON",
      "protocolVersion": "0.3"
    }
  ],
  "provider": {
    "organization": "50heads",
    "url": "https://50heads.com"
  },
  "version": "2026.1013.2",
  "documentationUrl": "https://50heads.com/en-us/docs/a2a",
  "iconUrl": "https://50heads.com/icon-512.png",
  "capabilities": {
    "streaming": true,
    "pushNotifications": true,
    "extendedAgentCard": true
  },
  "securitySchemes": {
    "oauth": {
      "oauth2SecurityScheme": {
        "description": "Sign in a person with OAuth 2.1 (authorization code with PKCE S256). Tokens are issued for the resource https://mcp.50heads.com/mcp, the default when the RFC 8707 resource parameter is left out.",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://auth.50heads.com/authorize",
            "tokenUrl": "https://auth.50heads.com/token",
            "refreshUrl": "https://auth.50heads.com/token",
            "scopes": {
              "questions:read": "Read tasks (questions), their status and results.",
              "questions:write": "Estimate and ask (spends credits within the connection's caps), and cancel.",
              "account:read": "Show prices in the account's currency.",
              "webhooks:read": "Read a task's push notification configs.",
              "webhooks:write": "Set and delete a task's push notification configs."
            },
            "pkceRequired": true
          }
        },
        "oauth2MetadataUrl": "https://auth.50heads.com/.well-known/oauth-authorization-server"
      }
    },
    "device": {
      "oauth2SecurityScheme": {
        "description": "For agents without a browser: the device code flow (RFC 8628). Tokens are issued for the resource https://mcp.50heads.com/mcp, the default when the RFC 8707 resource parameter is left out.",
        "flows": {
          "deviceCode": {
            "deviceAuthorizationUrl": "https://auth.50heads.com/device_authorization",
            "tokenUrl": "https://auth.50heads.com/token",
            "refreshUrl": "https://auth.50heads.com/token",
            "scopes": {
              "questions:read": "Read tasks (questions), their status and results.",
              "questions:write": "Estimate and ask (spends credits within the connection's caps), and cancel.",
              "account:read": "Show prices in the account's currency.",
              "webhooks:read": "Read a task's push notification configs.",
              "webhooks:write": "Set and delete a task's push notification configs."
            }
          }
        },
        "oauth2MetadataUrl": "https://auth.50heads.com/.well-known/oauth-authorization-server"
      }
    },
    "serviceAccount": {
      "oauth2SecurityScheme": {
        "description": "An organization's service account (client credentials), where the organization has machine identities.",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://auth.50heads.com/token",
            "scopes": {
              "questions:read": "Read tasks (questions), their status and results.",
              "questions:write": "Estimate and ask (spends credits within the connection's caps), and cancel.",
              "account:read": "Show prices in the account's currency.",
              "webhooks:read": "Read a task's push notification configs.",
              "webhooks:write": "Set and delete a task's push notification configs."
            }
          }
        },
        "oauth2MetadataUrl": "https://auth.50heads.com/.well-known/oauth-authorization-server"
      }
    },
    "apiKey": {
      "httpAuthSecurityScheme": {
        "description": "A 50heads API key (fh_live_...) from https://50heads.com/app/developers, as a bearer token. Never from a browser.",
        "scheme": "Bearer",
        "bearerFormat": "API key"
      }
    }
  },
  "securityRequirements": [
    {
      "schemes": {
        "oauth": {
          "list": [
            "questions:read",
            "questions:write"
          ]
        }
      }
    },
    {
      "schemes": {
        "device": {
          "list": [
            "questions:read",
            "questions:write"
          ]
        }
      }
    },
    {
      "schemes": {
        "serviceAccount": {
          "list": [
            "questions:read",
            "questions:write"
          ]
        }
      }
    },
    {
      "schemes": {
        "apiKey": {
          "list": []
        }
      }
    }
  ],
  "defaultInputModes": [
    "text/plain",
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json",
    "text/plain"
  ],
  "skills": [
    {
      "id": "estimate",
      "name": "Estimate a question",
      "description": "Price a question before asking it: credits, the price in the account's currency, and any fixes it needs. Never spends. Send text (a goal, which becomes a first draft) or a data part {\"question\": {...}} with the same question object as the MCP ask tool. The reply is a message with the estimate and the question to send back to ask. This is the default skill.",
      "tags": [
        "estimate",
        "pricing",
        "human feedback"
      ],
      "examples": [
        "Which of these two names sounds more like a bakery: Crumb & Co or Steelworks?",
        "{\"skill\":\"estimate\",\"question\":{\"type\":\"single_choice\",\"text\":\"Which name sounds most like a bakery?\",\"language\":\"en\",\"options\":[{\"label\":\"Crumb & Co\"},{\"label\":\"Steelworks\"}],\"n\":50}}"
      ],
      "inputModes": [
        "text/plain",
        "application/json"
      ],
      "outputModes": [
        "application/json",
        "text/plain"
      ]
    },
    {
      "id": "ask",
      "name": "Ask verified people",
      "description": "Ask verified people a short question and get back what they think. Set metadata {\"skill\": \"ask\"} (or \"skill\" in the data part) and send the question object in a data part. Spends credits within the connection's caps; the message id is the idempotency key, so a retry never charges twice. The task is submitted or working until the heads answer, input-required while an organization's spend approval waits for a person, and completed with a \"results\" artifact (the same results object as the MCP results tool). A refusal is rejected; cancel refunds the answers not given. Ask about preferences and first impressions, never facts.",
      "tags": [
        "human feedback",
        "preferences",
        "first impressions",
        "verified people"
      ],
      "examples": [
        "{\"skill\":\"ask\",\"question\":{\"type\":\"yes_no\",\"text\":\"Would you pay £4.00 a month for this?\",\"language\":\"en\",\"n\":50,\"go_rule\":{\"go_above\":0.6}}}"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json",
        "text/plain"
      ]
    }
  ]
}