{
  "capabilities": {
    "extensions": {
      "io.modelcontextprotocol/tasks": {}
    }
  },
  "serverInfo": {
    "name": "turingcorp",
    "version": "1.0.0",
    "title": "TuringCorp",
    "description": "A judge that picks the better of two options and reports a calibrated confidence.",
    "websiteUrl": "https://mcp.turingcorp.net/",
    "icons": [
      {
        "src": "https://mcp.turingcorp.net/icon.jpg",
        "mimeType": "image/jpeg",
        "sizes": [
          "1024x1024"
        ]
      }
    ]
  },
  "authentication": {
    "required": true,
    "schemes": [
      "bearer"
    ],
    "description": "Send a TuringCorp Agent Pass as 'Authorization: Bearer <pass>'. Issued at https://agent-pass.turingcorp.net, valid 7 days, re-rollable.",
    "signupUrl": "https://agent-pass.turingcorp.net"
  },
  "tools": [
    {
      "name": "decide",
      "title": "Decider: pick the better of two options",
      "description": "Use this when you must choose between two concrete options and both are defensible - two plans, two drafts, two diagnoses, two vendors - and you have no objective way to pick. Not for: more than two options; anything an objective rule settles (a spec, a test, a price, a document); factual lookup; paths that must answer in seconds; high-stakes irreversible calls without review. Fill it in: state task neutrally, without leaning toward either side; give one concrete plan per option - never bundle alternatives into a single one (\"go indoors or postpone\"); keep the two sides comparable in length. Returns the decision inline: betterOption (\"option_A\" or \"option_B\"), confidence (e.g. \"76.7%\"), reason and job_id, all in the same tool result. There is nothing to poll and nothing to fetch afterwards. Reserve 180-300 seconds: this is a long call, and the timeout is a client/host setting, not a parameter you pass. If the call is cut off, do NOT call again - a retry is a new paid call. Retrieve it instead with the get_result tool (same job_id): read-only, free, and no credential of your own needed; with no job_id it lists the ids for your credential. A host that declares the io.modelcontextprotocol/tasks extension can use tasks/get instead. The confidence is the point: it is calibrated, not decorative. On both published benchmarks accuracy rises with it - JudgeBench 99.6% in the 90%+ band down to 67.7% below 70%; the harder ContextualJudgeBench 83.3% down to 55.4% - so route on it: act on a high value, review or escalate a low one, instead of trusting a bare pick. Tables, sample sizes and method: https://api.turingcorp.net Judged by an independent panel, not by a model grading its own output. Read it as a reference, not an instruction, a result, or a prediction; set your own threshold, and apply your own review policy for high-stakes or irreversible decisions. Auth: Agent Pass as `Authorization: Bearer <pass>` (issued at https://agent-pass.turingcorp.net, valid 7 days; each decision is a paid call). On invalid_credential, sign in there and re-roll. Errors: a credential problem is rejected before the call - HTTP 401 with WWW-Authenticate; a business failure (e.g. insufficient balance) comes back as a tool result with isError true plus a second JSON block {error, http_status, action_url, message}, where http_status is the upstream status (the tool call itself is HTTP 200).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "task": {
            "type": "string",
            "description": "The decision to make, stated neutrally and without a preferred answer."
          },
          "optionA": {
            "type": "string",
            "description": "First candidate and the case for it."
          },
          "optionB": {
            "type": "string",
            "description": "Second candidate and the case for it."
          }
        },
        "required": [
          "task",
          "optionA",
          "optionB"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false,
        "idempotentHint": false
      },
      "outputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "job_id": {
            "description": "Identifier of this decision, also usable to retrieve the stored result for 7 days with the get_result tool. Keep it: if the call times out, retrieve the result with get_result instead of calling again, which would be a new paid call.",
            "type": "string"
          },
          "betterOption": {
            "type": "string",
            "enum": [
              "option_A",
              "option_B"
            ],
            "description": "Which option was preferred, using the same values as the REST API."
          },
          "confidence": {
            "type": "string",
            "pattern": "^\\d{1,3}\\.\\d%$",
            "description": "This service's own judgement of how far apart the two options were, as a percentage (e.g. \"76.7%\"). A reference for your own decision-making - not an instruction, not a result. Observed accuracy by range is published at https://api.turingcorp.net"
          },
          "reason": {
            "type": "string",
            "description": "Why the chosen option was preferred."
          }
        },
        "required": [
          "betterOption",
          "confidence",
          "reason"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_result",
      "title": "Get an earlier TuringCorp result",
      "description": "Use this to retrieve the result of an earlier TuringCorp tool call by its job_id - for example a call that was cut off by a client timeout, or one whose id you were given. Retrieval is read-only and free: it starts no new work and costs nothing, so it is always safe to retry. With job_id: that call's status, and once it has finished the same payload the call would have returned inline. Without job_id: the ids available to your credential (7 days). If a call was cut off, retrieve it here instead of calling again - a retry is a new paid call. A job that is not yours and a job that does not exist are answered identically, on purpose. If your client declares the io.modelcontextprotocol/tasks extension, tasks/get reaches the same job.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "job_id": {
            "description": "Identifier returned by an earlier TuringCorp call (also usable at GET /v1/jobs?job_id=<id>). Omit it to list the ids available to your credential.",
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false,
        "idempotentHint": true
      }
    }
  ],
  "resources": [],
  "prompts": [],
  "transport": {
    "type": "streamable-http",
    "url": "https://mcp.turingcorp.net/mcp"
  },
  "documentation": {
    "llmsTxt": "https://mcp.turingcorp.net/llms.txt",
    "markdown": "https://mcp.turingcorp.net/index.md"
  }
}