forecall-dev Servers API

The Servers API from forecall-dev — 4 operation(s) for servers.

GitHub OpenAPI

Operations 4

POST /v1/servers/{id}/lint Lint a tools/list and save it as the server's version #
POST /v1/servers/{id}/evaluations/estimate Estimate an evaluation of the server's latest version #
POST /v1/servers/{id}/evaluations Evaluate the server's latest version #
GET /v1/servers/{id}/lint/latest The latest lint of the server's latest version #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/forecall-dev:forecall-dev-servers-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

forecall-dev-servers-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Forecall Servers API
  version: v1
  description: 'Save and read the lints of the MCP servers registered in your Forecall dashboard, and evaluate how models choose their tools. Every endpoint but this document needs an API key from the dashboard (API keys): `Authorization: Bearer fc_…`.'
servers:
- url: https://api.forecall.dev
security:
- apiKey: []
tags:
- name: Servers
paths:
  /v1/servers/{id}/lint:
    post:
      operationId: saveLint
      summary: Lint a tools/list and save it as the server's version
      description: Adds the tools as the server's new version unless they are the same as its latest version (order included), lints them and saves the lint. Each call takes 1 unit from the month's allowance for the key's kind, then from the organization's credits; with neither, 402 and nothing is saved. Keys of kind ci and vendor may call it.
      parameters:
      - name: id
        in: path
        required: true
        description: The server's id, as in the dashboard's URL (/servers/{id}).
        schema:
          type: string
          format: uuid
      - name: label
        in: query
        required: false
        description: The server's own version, such as 1.4.0 (up to 50 characters).
        schema:
          type: string
          maxLength: 50
      requestBody:
        required: true
        description: 'The tools/list: an array of tools, {"tools": [...]}, or a JSON-RPC response {"result": {"tools": [...]}}. Up to 1048576 bytes and 200 tools, with the MCP wire format''s camelCase keys and one tool per name.'
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ToolsList'
      responses:
        '200':
          description: The saved lint, with the changes from the version before
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SavedLint'
        '401':
          description: '`unauthorized`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          description: '`quota_exceeded`, `payment_failed`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: '`not_found`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: '`input_too_large`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: '`invalid_json`, `unrecognized_shape`, `invalid_tool`, `too_many_tools`, `snake_case_keys`, `duplicate_names`, `invalid_label`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: '`rate_limited`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      tags:
      - Servers
  /v1/servers/{id}/evaluations/estimate:
    post:
      operationId: estimateEvaluation
      summary: Estimate an evaluation of the server's latest version
      description: 'What evaluating the server''s latest version would take, in units, without taking them: writing its cases (none when a ready evaluation of the same version and settings has them), and each model''s run (cases whose result the organization already has are not counted). Before the cases are written, each is estimated as an utterance of about 40 tokens. Vendor keys only; the Free plan has no evaluations.'
      parameters:
      - name: id
        in: path
        required: true
        description: The server's id, as in the dashboard's URL (/servers/{id}).
        schema:
          type: string
          format: uuid
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EvaluationRequest'
      responses:
        '200':
          description: The estimate
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Estimate'
        '401':
          description: '`unauthorized`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          description: '`plan_has_no_evaluations`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: '`not_found`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: '`invalid_json`, `invalid_request`, `unknown_models`, `unknown_distractors`, `lang_not_in_plan`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: '`rate_limited`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      tags:
      - Servers
  /v1/servers/{id}/evaluations:
    post:
      operationId: startEvaluation
      summary: Evaluate the server's latest version
      description: Takes the estimate's units from the month's vendor allowance, then the organization's credits (402 and nothing started when they fall short), and starts the evaluation. Follow it at the Location the answer gives. If the evaluation fails, the units of the cases it did not finish come back as credits. Vendor keys only; the Free plan has no evaluations.
      parameters:
      - name: id
        in: path
        required: true
        description: The server's id, as in the dashboard's URL (/servers/{id}).
        schema:
          type: string
          format: uuid
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EvaluationRequest'
      responses:
        '202':
          description: 'Started: the estimate it took, and a run for each model'
          headers:
            Location:
              description: /v1/evaluations/{id}
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StartedEvaluation'
        '401':
          description: '`unauthorized`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          description: '`quota_exceeded`, `payment_failed`, `plan_has_no_evaluations`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: '`not_found`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: '`invalid_json`, `invalid_request`, `unknown_models`, `unknown_distractors`, `lang_not_in_plan`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: '`rate_limited`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      tags:
      - Servers
  /v1/servers/{id}/lint/latest:
    get:
      operationId: getLatestLint
      summary: The latest lint of the server's latest version
      description: Takes no units.
      parameters:
      - name: id
        in: path
        required: true
        description: The server's id, as in the dashboard's URL (/servers/{id}).
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: The latest lint
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LatestLint'
        '401':
          description: '`unauthorized`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: '`not_found`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: '`rate_limited`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      tags:
      - Servers
components:
  schemas:
    SavedLint:
      type: object
      properties:
        server:
          type: object
          properties:
            id:
              type: string
              format: uuid
            slug:
              type: string
            name:
              type: string
          required:
          - id
          - slug
          - name
        version:
          type: object
          properties:
            id:
              type: string
              format: uuid
            created:
              type: boolean
              description: False when the tools matched the latest version
            capturedAt:
              type: string
              format: date-time
            label:
              type:
              - string
              - 'null'
          required:
          - id
          - created
          - capturedAt
          - label
        lint:
          type: object
          properties:
            id:
              type: string
              format: uuid
            report:
              $ref: '#/components/schemas/LintReport'
          required:
          - id
          - report
        changes:
          oneOf:
          - $ref: '#/components/schemas/VersionDiff'
          - type: 'null'
          description: Null when there is no version before, or it has no lint
        units:
          type: object
          properties:
            fromIncluded:
              type: integer
            fromCredits:
              type: integer
          required:
          - fromIncluded
          - fromCredits
      required:
      - server
      - version
      - lint
      - changes
      - units
    VersionDiff:
      type: object
      properties:
        sameRules:
          type: boolean
          description: Scores compare only within one rules version
        scoreAvg:
          type: object
          properties:
            before:
              type: number
            after:
              type: number
          required:
          - before
          - after
        confusablePairsTotal:
          type: object
          properties:
            before:
              type: integer
            after:
              type: integer
          required:
          - before
          - after
        added:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              score:
                type: integer
            required:
            - name
            - score
        removed:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              score:
                type: integer
            required:
            - name
            - score
        changed:
          type: array
          items:
            type: object
        serverIssuesResolved:
          type: array
          items:
            type: object
        serverIssuesAdded:
          type: array
          items:
            type: object
      required:
      - sameRules
      - scoreAvg
      - confusablePairsTotal
      - added
      - removed
      - changed
      - serverIssuesResolved
      - serverIssuesAdded
      description: 'What changed from the version before: scores, tools added and removed, issues resolved and new, word diffs of descriptions and arguments'
    ToolsList:
      oneOf:
      - type: array
        items:
          $ref: '#/components/schemas/Tool'
      - type: object
        properties:
          tools:
            type: array
            items:
              $ref: '#/components/schemas/Tool'
        required:
        - tools
      - type: object
        properties:
          result:
            type: object
            properties:
              tools:
                type: array
                items:
                  $ref: '#/components/schemas/Tool'
            required:
            - tools
        required:
        - result
    LatestLint:
      type: object
      properties:
        server:
          type: object
          properties:
            id:
              type: string
              format: uuid
            slug:
              type: string
            name:
              type: string
          required:
          - id
          - slug
          - name
        version:
          type: object
          properties:
            id:
              type: string
              format: uuid
            capturedAt:
              type: string
              format: date-time
            label:
              type:
              - string
              - 'null'
          required:
          - id
          - capturedAt
          - label
        lint:
          type: object
          properties:
            id:
              type: string
              format: uuid
            source:
              type: string
              enum:
              - server
              - ci
            createdAt:
              type: string
              format: date-time
            report:
              $ref: '#/components/schemas/LintReport'
          required:
          - id
          - source
          - createdAt
          - report
      required:
      - server
      - version
      - lint
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
              - unauthorized
              - quota_exceeded
              - payment_failed
              - plan_has_no_evaluations
              - not_found
              - input_too_large
              - invalid_json
              - unrecognized_shape
              - invalid_tool
              - too_many_tools
              - snake_case_keys
              - duplicate_names
              - invalid_label
              - invalid_request
              - unknown_models
              - unknown_distractors
              - lang_not_in_plan
              - rate_limited
              - internal
            message:
              type: string
            detail:
              type: object
              description: 'Where the input went wrong: path, keys, names, count and limit…'
          required:
          - code
          - message
      required:
      - error
    StartedEvaluation:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        status:
          type: string
          enum:
          - queued
        server:
          type: object
          properties:
            id:
              type: string
              format: uuid
            slug:
              type: string
            name:
              type: string
          required:
          - id
          - slug
          - name
        version:
          type: object
          properties:
            id:
              type: string
              format: uuid
            label:
              type:
              - string
              - 'null'
          required:
          - id
          - label
        cases:
          type: integer
          description: 'The cases: reused, or planned'
        casesReused:
          type: boolean
        settings:
          $ref: '#/components/schemas/EvaluationSettings'
        units:
          type: integer
          description: All the units the evaluation takes
        casegen:
          type: object
          properties:
            calls:
              type: integer
            units:
              type: integer
          required:
          - calls
          - units
        models:
          type: array
          items:
            type: object
            properties:
              model:
                type: string
              calls:
                type: integer
              reused:
                type: integer
                description: Cases whose result is reused
              units:
                type: integer
            required:
            - model
            - calls
            - reused
            - units
        warnings:
          type: array
          items:
            type: object
        runs:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
              model:
                type: string
              units:
                type: integer
                description: 'The units taken for the run: the first''s include writing the cases'
            required:
            - id
            - model
            - units
      required:
      - id
      - name
      - status
      - server
      - version
      - cases
      - casesReused
      - settings
      - units
      - casegen
      - models
      - warnings
      - runs
    Estimate:
      type: object
      properties:
        server:
          type: object
          properties:
            id:
              type: string
              format: uuid
            slug:
              type: string
            name:
              type: string
          required:
          - id
          - slug
          - name
        version:
          type: object
          properties:
            id:
              type: string
              format: uuid
            label:
              type:
              - string
              - 'null'
          required:
          - id
          - label
        cases:
          type: integer
          description: 'The cases: reused, or planned'
        casesReused:
          type: boolean
        settings:
          $ref: '#/components/schemas/EvaluationSettings'
        units:
          type: integer
          description: All the units the evaluation takes
        casegen:
          type: object
          properties:
            calls:
              type: integer
            units:
              type: integer
          required:
          - calls
          - units
        models:
          type: array
          items:
            type: object
            properties:
              model:
                type: string
              calls:
                type: integer
              reused:
                type: integer
                description: Cases whose result is reused
              units:
                type: integer
            required:
            - model
            - calls
            - reused
            - units
        warnings:
          type: array
          items:
            type: object
        balance:
          type: object
          properties:
            included:
              type: integer
              description: This month's vendor units left
            credits:
              type: integer
          required:
          - included
          - credits
      required:
      - server
      - version
      - cases
      - casesReused
      - settings
      - units
      - casegen
      - models
      - warnings
      - balance
    Tool:
      type: object
      properties:
        name:
          type: string
        title:
          type: string
        description:
          type: string
        inputSchema:
          type: object
        outputSchema:
          type: object
        annotations:
          type: object
      required:
      - name
    LintReport:
      type: object
      properties:
        lintVersion:
          type: integer
          description: The scoring rules' version
        toolCount:
          type: integer
        scoreAvg:
          type: number
          description: Out of 100, one decimal
        confusablePairsTotal:
          type: integer
        tools:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              score:
                type: integer
              components:
                type: object
                description: Points of each of the six items
              issues:
                type: array
                items:
                  type: object
            required:
            - name
            - score
            - components
            - issues
        serverIssues:
          type: array
          items:
            type: object
      required:
      - lintVersion
      - toolCount
      - scoreAvg
      - confusablePairsTotal
      - tools
      - serverIssues
      description: 'The same report as the web linter''s (scores and issue codes: forecall.dev/en/docs/reading-scores)'
    EvaluationSettings:
      type: object
      properties:
        casesPerTool:
          type: integer
          description: 'Positive cases per tool: 8 on Pro, 20 on Team'
        lang:
          type: string
          enum:
          - en
          - ja
        distractors:
          type: array
          items:
            type: string
      required:
      - casesPerTool
      - lang
      - distractors
    EvaluationRequest:
      type: object
      properties:
        models:
          type: array
          maxItems: 10
          items:
            type: string
            examples:
            - anthropic/claude-sonnet-5-5
          description: 'vendor/name of the models to evaluate. Default: anthropic/claude-sonnet-5-5 and openai/gpt-6.1-sol (google/gemini-3.8-flash is paused)'
        distractors:
          type: array
          maxItems: 10
          items:
            type: string
          description: 'Bundled public servers whose tools the models see too, by name (bhived, context7, debugbase, filesystem, firecrawl, memory, notion, playwright). Default: none'
        lang:
          type: string
          enum:
          - en
          - ja
          description: 'The utterances'' language. Default: en; ja on Team'
        name:
          type: string
          minLength: 1
          maxLength: 100
      required: []
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: 'An API key: fc_ci_… or fc_vendor_…'