FluoTest MCP API
Model Context Protocol Streamable HTTP transport.
Model Context Protocol Streamable HTTP transport.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/fluotest-com:fluotest-com-mcp-api"
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.
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: 3.2.0
info:
title: FluoTest MCP API
version: 1.0.0
summary: Create, publish and read results of scored quizzes through FluoTest's MCP server.
description: 'FluoTest''s MCP server and supporting API surface. /api/mcp uses the Model Context Protocol''s JSON-RPC 2.0 Streamable HTTP transport (https://modelcontextprotocol.io). Tools: create_quiz, import_quiz, list_quizzes, get_quiz_questions, get_quiz_settings, update_quiz, publish_quiz, unpublish_quiz, duplicate_quiz, get_results, delete_quiz; call tools/list for their input and output JSON schemas. Connection guide: https://fluotest.com/en/docs/mcp-server. API reference: https://fluotest.com/en/docs/api-reference.
Errors: HTTP-level failures return a typed error body, RFC 9457 application/problem+json with a stable `code` and a `hint`, except 401/403 from the OAuth layer, which use the RFC 6750 error body plus a WWW-Authenticate header. Tool-level failures come back as a JSON-RPC result with isError: true.
Rate limits: every response carries RateLimit-Policy/RateLimit (IETF draft-ietf-httpapi-ratelimit-headers) and RateLimit-Limit/-Remaining/-Reset; a 429 adds Retry-After.
Versioning: the transport is versioned by the MCP-Protocol-Version request header (MCP''s date-based protocol versions; supported: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07). The tool surface follows semantic versioning in info.version: new tools and new optional arguments are additive and never break existing calls. A breaking change ships as a new tool name; the old tool keeps working for at least 90 days, responses that use it carry a Deprecation header (RFC 9745) and a Sunset header (RFC 8594) with the removal date, and the change is announced on the changelog (/en/changelog).'
contact:
name: FluoTest
email: info@fluosite.com
url: https://fluotest.com
termsOfService: https://fluotest.com/en/terms
x-deprecation-policy: 'Versioning: the transport is versioned by the MCP-Protocol-Version request header (MCP''s date-based protocol versions; supported: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07). The tool surface follows semantic versioning in info.version: new tools and new optional arguments are additive and never break existing calls. A breaking change ships as a new tool name; the old tool keeps working for at least 90 days, responses that use it carry a Deprecation header (RFC 9745) and a Sunset header (RFC 8594) with the removal date, and the change is announced on the changelog (/en/changelog).'
servers:
- url: https://fluotest.com
description: Production
tags:
- name: MCP
description: Model Context Protocol Streamable HTTP transport.
paths:
/api/mcp:
post:
operationId: sendMcpRequest
tags:
- MCP
summary: Send an MCP JSON-RPC request
description: 'Send one MCP JSON-RPC 2.0 request: initialize, tools/list, or tools/call with a tool name (for example create_quiz or get_results) and its arguments. Send Accept: application/json, text/event-stream.'
security:
- oauth2: []
- apiKey: []
parameters:
- $ref: '#/components/parameters/McpProtocolVersion'
- $ref: '#/components/parameters/McpSessionId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/JsonRpcRequest'
responses:
'200':
description: JSON-RPC response, as JSON or as a single-event SSE stream depending on Accept.
headers:
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
content:
application/json:
schema:
$ref: '#/components/schemas/JsonRpcResponse'
text/event-stream:
schema:
type: string
description: SSE stream whose data lines are JsonRpcResponse objects.
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/ServerError'
get:
operationId: openMcpEventStream
tags:
- MCP
summary: Open the MCP server-to-client event stream
description: Opens the Streamable HTTP transport's SSE stream for server-initiated messages. FluoTest's server is stateless, so most clients never need it.
security:
- oauth2: []
- apiKey: []
parameters:
- $ref: '#/components/parameters/McpProtocolVersion'
- $ref: '#/components/parameters/McpSessionId'
responses:
'200':
description: text/event-stream of JSON-RPC messages.
headers:
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
content:
text/event-stream:
schema:
type: string
'401':
$ref: '#/components/responses/Unauthorized'
'405':
$ref: '#/components/responses/MethodNotAllowed'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/ServerError'
delete:
operationId: terminateMcpSession
tags:
- MCP
summary: Terminate an MCP session
description: Ends the MCP session named by the Mcp-Session-Id header.
security:
- oauth2: []
- apiKey: []
parameters:
- $ref: '#/components/parameters/McpProtocolVersion'
- $ref: '#/components/parameters/McpSessionId'
responses:
'204':
description: Session terminated.
headers:
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
'401':
$ref: '#/components/responses/Unauthorized'
'405':
$ref: '#/components/responses/MethodNotAllowed'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/ServerError'
components:
responses:
ServerError:
description: Unexpected server error.
content:
application/json:
schema:
$ref: '#/components/schemas/OAuthError'
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
RateLimited:
description: Rate limit exceeded. Wait Retry-After seconds.
headers:
RateLimit-Policy:
$ref: '#/components/headers/RateLimitPolicy'
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
Retry-After:
$ref: '#/components/headers/RetryAfter'
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
Unauthorized:
description: Missing, invalid, expired or revoked Bearer credential.
headers:
WWW-Authenticate:
description: Bearer challenge with resource_metadata.
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/OAuthError'
MethodNotAllowed:
description: The transport does not support this method in stateless mode.
content:
application/json:
schema:
$ref: '#/components/schemas/JsonRpcResponse'
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
BadRequest:
description: Malformed JSON-RPC body or unsupported Accept / protocol version.
content:
application/json:
schema:
$ref: '#/components/schemas/JsonRpcResponse'
headers:
RetryAfter:
description: Seconds to wait before retrying (RFC 9110).
schema:
type: integer
RateLimitReset:
description: Seconds until the window resets.
schema:
type: integer
RateLimitLimit:
description: Requests allowed per window.
schema:
type: integer
RateLimit:
description: Remaining quota and seconds until reset, e.g. "default";r=119;t=60.
schema:
type: string
RateLimitRemaining:
description: Requests left in the current window.
schema:
type: integer
RateLimitPolicy:
description: Quota policy, e.g. "default";q=120;w=60 (draft-ietf-httpapi-ratelimit-headers).
schema:
type: string
parameters:
McpSessionId:
name: Mcp-Session-Id
in: header
required: false
description: Session ID returned by initialize, if the server issued one.
schema:
type: string
McpProtocolVersion:
name: MCP-Protocol-Version
in: header
required: false
description: MCP protocol version negotiated during initialize. This header is the API's version selector.
schema:
type: string
enum:
- '2025-11-25'
- '2025-06-18'
- '2025-03-26'
- '2024-11-05'
- '2024-10-07'
default: '2025-11-25'
schemas:
JsonRpcError:
type: object
required:
- code
- message
properties:
code:
type: integer
description: JSON-RPC error code, e.g. -32600 invalid request, -32601 method not found, -32602 invalid params.
message:
type: string
data: {}
JsonRpcResponse:
type: object
required:
- jsonrpc
properties:
jsonrpc:
type: string
enum:
- '2.0'
id:
oneOf:
- type: string
- type: integer
- type: 'null'
result:
type: object
additionalProperties: true
error:
$ref: '#/components/schemas/JsonRpcError'
JsonRpcRequest:
type: object
required:
- jsonrpc
- method
properties:
jsonrpc:
type: string
enum:
- '2.0'
id:
oneOf:
- type: string
- type: integer
method:
type: string
examples:
- initialize
- tools/list
- tools/call
params:
type: object
additionalProperties: true
Problem:
type: object
description: RFC 9457 problem details with FluoTest's `code` and `hint` extension members.
required:
- type
- title
- status
- code
properties:
type:
type: string
format: uri
description: Documentation URI for this error type.
title:
type: string
description: Short, human-readable summary.
status:
type: integer
description: HTTP status code.
code:
type: string
enum:
- not_found
- rate_limited
description: Stable machine-readable error code.
detail:
type: string
description: What went wrong for this request.
hint:
type: string
description: How to resolve it.
instance:
type: string
description: The request path.
OAuthError:
type: object
description: RFC 6750 bearer-token error body (sent with a WWW-Authenticate header pointing at the protected-resource metadata).
required:
- error
properties:
error:
type: string
enum:
- invalid_token
- insufficient_scope
- invalid_request
- server_error
error_description:
type: string
securitySchemes:
oauth2:
type: oauth2
description: 'Supabase OAuth 2.1 server: sign in and approve on a consent screen, no keys to copy.'
flows:
authorizationCode:
authorizationUrl: https://abvrtonacdgcxpkkrpie.supabase.co/auth/v1/oauth/authorize
tokenUrl: https://abvrtonacdgcxpkkrpie.supabase.co/auth/v1/oauth/token
scopes:
openid: OpenID Connect
email: Email address
profile: Profile info
apiKey:
type: http
scheme: bearer
description: 'Personal API key from Settings → Security → API keys, sent as ''Authorization: Bearer fluo_...''.'
externalDocs:
description: FluoTest API reference
url: https://fluotest.com/en/docs/api-reference