{"protocolVersion":"0.3.0","name":"AI Agent API","description":"A multi-capability AI agent API that provides question-answering, text summarization, classification, structured data extraction, content moderation, and autonomous action execution through a unified REST interface.\n\nThe agent processes natural language inputs and returns structured, machine-readable responses suitable for downstream analysis, monitoring, and integration. Each endpoint is designed around a specific AI capability, with consistent response envelopes that include confidence scores, token usage, and processing metrics.\n\nCredentials use prefix matching — append any suffix to get a unique client identity for per-client rate limiting (e.g., `sk-proj-mta-live-a1b2c3d4-myapp`).\n\nRate limiting: 10 requests per second per client (sliding window) by default. Returns 429 with `Retry-After` header when exceeded.\n\nResponse mode: Each endpoint accepts an optional `?response_mode=static` query parameter. LLM mode (default) returns live LLM-generated responses; the server returns 503 if LLM mode is unavailable on this deployment. Static mode returns deterministic responses from a fixed lookup table.\n\nAs an A2A agent, each endpoint is a skill. Choose one with `message.metadata.skillId` (the endpoint's name, e.g. `summarize`); a message without one goes to `ask`. A text part fills the skill's main input field, and data parts are merged into its request body. `message.metadata.response_mode` selects `static` or `llm`.","url":"https://devtools-mock-target-api.vercel.prod.i.lspd.ai/a2a","preferredTransport":"JSONRPC","additionalInterfaces":[{"url":"https://devtools-mock-target-api.vercel.prod.i.lspd.ai/a2a","transport":"JSONRPC"}],"version":"2.0.0","capabilities":{"streaming":true,"pushNotifications":false},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Bearer token authentication. Two token kinds are accepted on the same header:\n\n- **Static bearer tokens** registered in `CREDENTIALS_JSON.bearer`. Use prefix matching — any string starting with a registered prefix is accepted, so clients can append per-client suffixes for rate-limit isolation.\n- **OAuth2 access tokens** issued by `POST /oauth/token`. These are HMAC-SHA256 signed blobs (prefix `mat.`) carrying their own `exp`. Validated stateless per request; rejected at expiry with `401 WWW-Authenticate: Bearer error=\"invalid_token\"` per RFC 6750.\n\nStatic bearer prefixes MUST NOT start with `mat.` (OAuth2 access tokens) or `mrt.` (OAuth2 refresh tokens — `Authorization: Bearer` is not the correct way to present a refresh token, but the prefix is reserved to prevent prefix-confusion if one were ever presented by accident). The server enforces this at startup and refuses to boot on a violating CREDENTIALS_JSON."},"apiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key authentication via the X-API-Key header. Keys use prefix matching — append any suffix for per-client rate-limit isolation."},"basicAuth":{"type":"http","scheme":"basic","description":"HTTP Basic authentication. Username uses prefix matching (append a suffix for per-client isolation); password must match exactly."},"customAuth":{"type":"apiKey","in":"header","name":"X-Custom-Auth","description":"Custom header authentication via the X-Custom-Auth header. Values use prefix matching — append any suffix for per-client rate-limit isolation."},"oauth2ClientCredentials":{"type":"oauth2","description":"OAuth2 client_credentials flow (RFC 6749 §4.4). Exchange a client_id and client_secret at `/oauth/token` for a short-lived signed-blob bearer token. Client authentication accepts both `client_secret_basic` (RFC 6749 §2.3.1, the SHOULD-default) and `client_secret_post`. Issued access tokens carry their own `exp` (the active profile's `access_token.ttl_seconds_default`, 120s for the bundled profiles; overridable via `OAUTH_ACCESS_TOKEN_TTL_SECONDS`) and are validated stateless on every request — no token store on the server. Clients whose `grant_types` config also includes `refresh_token` additionally receive a `refresh_token` in the same response and can refresh via `grant_type=refresh_token` (non-rotating by default; rotating if the client uses a profile with `refresh_token.rotates=true`).","flows":{"clientCredentials":{"tokenUrl":"https://devtools-mock-target-api.vercel.prod.i.lspd.ai/oauth/token","scopes":{"agent:all":"Full access to all API endpoints"}}}}},"security":[{"bearerAuth":[]},{"apiKeyAuth":[]},{"basicAuth":[]},{"customAuth":[]},{"oauth2ClientCredentials":[]},{}],"defaultInputModes":["text/plain","application/json"],"defaultOutputModes":["application/json","text/plain"],"skills":[{"id":"ask","name":"Answer a question","description":"Accepts a natural language question and returns a grounded answer. When `context` is provided, the agent restricts its answer to information found in the supplied source material, enabling retrieval-augmented generation (RAG) workflows. Without context, the agent draws from its general knowledge base.\n\nThe response includes a confidence score indicating how certain the agent is in its answer, along with a list of internal knowledge sources that contributed to the response. Use the confidence score to implement threshold-based filtering.","tags":["Question Answering"],"examples":["What is the capital of France?"],"inputModes":["text/plain","application/json"],"outputModes":["application/json","text/plain"]},{"id":"summarize","name":"Summarize text","description":"Condenses input text into a shorter summary while preserving key information. Supports multiple output formats: a flowing paragraph, a bulleted list of key points, or a single headline. The agent attempts to maintain factual accuracy, though summaries may occasionally introduce information not present in the source.\n\nThe compression ratio in the response indicates how much the text was reduced.","tags":["Summarization"],"examples":["Researchers measured the orbital period of a newly discovered exoplanet around TRAPPIST-1, finding a 12.4-day cycle that confirms earlier transit observations."],"inputModes":["text/plain","application/json"],"outputModes":["application/json","text/plain"]},{"id":"classify","name":"Classify text into categories","description":"Assigns the input text to one of the provided categories using sentiment analysis and content understanding. Returns the predicted label along with confidence scores for all candidate categories.\n\nThe agent provides reasoning for its classification decision and a full score distribution across all categories, so callers can use either the hard label or the soft (probability) distribution.","tags":["Classification"],"examples":["The new release exceeded our expectations and the team is thrilled."],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"extract","name":"Extract structured data from text","description":"Parses unstructured text and extracts structured data in the specified output format (JSON or XML). Optionally guided by a schema definition that describes the expected output structure.\n\nExtraction quality varies — some responses produce valid, schema-conformant output while others may have missing fields, incorrect types, or malformed syntax.","tags":["Extraction"],"examples":["Contact Jane Doe at jane@example.com or +1-555-0100."],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"moderate","name":"Check content for policy violations","description":"Analyzes text content against safety policies and returns a moderation verdict. The response includes a binary safe/unsafe flag, per-category violation flags (hate, violence, sexual, self-harm), and an overall severity level.\n\nThe agent's moderation decisions vary in accuracy — some safe content may be flagged, and some unsafe content may be missed.","tags":["Moderation"],"examples":["Hello! Just checking in on next week's meeting."],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"act","name":"Execute an action using tools","description":"Accepts a task description and detailed instructions, then selects and invokes the most appropriate tool to complete the task. When no suitable tool is available, the agent returns a direct response explaining why it cannot proceed.\n\nThe agent evaluates the available tools against the task requirements, selects the best match, constructs appropriate parameters, and executes the action. The response includes the action taken, parameters used, execution result, and a step-by-step trace of the agent's reasoning process.","tags":["Agent Actions"],"examples":["Book a flight to Paris"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"shipment-status-interpreter","name":"Interpret a freight-rail shipment's current state and surface a structured status assessment","description":"Accepts a free-text shipment context (current location, telematics readings, route plan, customer SLA window, accessorial / commodity-specific handling rules) and returns a structured status assessment with projected ETA, exceptions, SLA status, demurrage risk, and a recommended next action.\n\nThe primary output wraps under `status_assessment` (per this API's convention of a single named output field), with `tokens_used`, `usage`, `model` and `processing_time_ms` as sibling metadata.\n\nInput complexity ranges from single-leg point-to-point lookups to multi-leg interchange shipments under tight SLA windows where accessorial accrual interacts with commodity-specific handling rules.","tags":["Rail Operations"],"examples":["Carload C-10001: boxcar (mixed dry goods) on BNSF Chicago to BNSF Denver, single-leg, current state in transit between Lincoln NE and Cheyenne WY. Customer SLA: 72 hours origin-to-destination, currently at hour 28. No exceptions. Free-time window 24 hours after placement."],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"condition-extractor","name":"Extract structured experimental conditions from in vivo research passages","description":"Accepts a passage from a scientific paper that describes an animal experimental setup and returns a JSON object capturing the experimental parameters in canonical form — species, strain, animals per group, group count, and a list of intervention/control/husbandry/genotype factors — wrapped under a single `conditions` field.\n\nIntended for biomedical research literature-extraction workloads (preclinical CRO software, IACUC-workflow vendors, pharma R&D platforms).","tags":["Scientific Extraction"],"examples":["Forty-eight male C57BL/6 mice (8 weeks old, 22-25g) were assigned to four groups (n=12 per group): vehicle control, low-dose drug X (5 mg/kg), high-dose drug X (20 mg/kg), and combination drug X + compound Y. The B6 cohort was housed under 12h light/dark cycle."],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"xenobiology-survey-pipeline","name":"Run a 3-step animal-experiment extraction pipeline (alien species) with per-step model selection","description":"Accepts a research-paper passage describing an animal experiment on an alien species (e.g. `Mus stellaris`, `Rattus chronos`) and runs a 3-step pipeline: (1) classifier decides whether the passage is an animal experiment; (2) extractor pulls structured cohort metadata; (3) validator assembles the canonical record with per-field grounding against the source. Each step's model is selectable independently via `step_<i>_model`. All steps always compute; the `output_mode` parameter selects which step(s) appear in the response. The task is the same as terrestrial animal-experiment extraction; only the species names differ.","tags":["Xenobiology Survey Pipeline"],"examples":["Forty Mus stellaris (strain Stellaris-7B/Zeta, 8 weeks of age, 22-25g) were assigned to four groups (n=12 per group): group A — vehicle control, daily IP, 14 days; group B — drug-X 5 mg/kg, daily IP, 14 days; group C — drug-X 20 mg/kg, daily IP, 14 days; group D — combination drug-X + compound Y, daily IP, 14 days."],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"hle-tool-use-answer","name":"Answer a Humanity's Last Exam (HLE) question with optional simulated web-search tool use","description":"Accepts a single HLE (Humanity's Last Exam) question and returns an answer with self-reported confidence. The `use_search` boolean toggles between two arms: when `false`, the agent answers from parametric knowledge alone; when `true`, the agent simulates a bounded web-search loop and emits a `search_log` of `{query, snippets}` pairs alongside the answer.\n\nHLE is the Center for AI Safety's adversarial frontier-knowledge benchmark covering math, physical and life sciences, engineering, computer science, humanities, and trivia. Each call answers exactly one question — callers can ask the same question twice (once per `use_search` value) to compare with-vs-without-search performance.\n\nSearch is simulated: no real web-search call is made, and the `search_log` is generated by the model when `use_search=true`.","tags":["HLE Tool-Use Benchmark"],"examples":["What is the largest prime factor of 600851475143?"],"inputModes":["text/plain","application/json"],"outputModes":["application/json","text/plain"]}]}