Skip to content

Overview

API sources provide a flexible HTTP tool that lets your agents connect to virtually any REST API. If a service has an API, your agent can use it - no MCP server required.

When you configure an API source, Craft Agents:

  1. Creates a flexible HTTP tool for making requests
  2. Handles auth by securely storing and injecting credentials
  3. Validates the connection using the test endpoint
  4. Enables the agent to make any request to the API’s base URL

The result: your agent can call any endpoint on the configured API.

API sources are configured with a JSON file:

{
"type": "api",
"name": "My API",
"tagline": "Description of the API",
"icon": "https://example.com/icon.png",
"api": {
"baseUrl": "https://api.example.com/",
"testEndpoint": {
"method": "GET",
"path": "health"
},
"authType": "bearer"
}
}
FieldRequiredDescription
typeYesMust be "api"
nameYesDisplay name for the source
taglineNoShort description
iconNoIcon URL, emoji, or local file (auto-discovered: icon.svg, icon.png)
api.baseUrlYesBase URL for all API requests
api.testEndpointNoObject to verify connection: { method: "GET" | "POST", path: "endpoint", body?: {}, headers?: {} }
api.authTypeYesAuthentication type (see below)
api.headerNameNoCustom header name for header auth type
api.queryParamNoQuery parameter name for query auth type
api.authSchemeNoBearer token prefix for bearer auth (default: "Bearer", can be "Token")
api.headerNamesNoArray of header names for multi-header auth (e.g., ["DD-API-KEY", "DD-APPLICATION-KEY"])
api.oauthNoGeneric OAuth 2.0 config block (see OAuth 2.0 section below)
api.renewEndpointNoOptional token renewal config for non-OAuth bearer APIs (see Token Renewal section below)

API sources support six authentication methods:

{
"api": {
"baseUrl": "https://api.example.com",
"authType": "bearer"
}
}

Sends credentials as Authorization: Bearer {token}.

{
"api": {
"baseUrl": "https://api.example.com",
"authType": "header",
"headerName": "X-API-Key"
}
}

Sends credentials in a custom header: X-API-Key: {token}.

{
"api": {
"baseUrl": "https://api.example.com",
"authType": "query",
"queryParam": "api_key"
}
}

Appends credentials as a query parameter: ?api_key={token}.

Two modes: auto-discovery (simplest) and explicit config (for providers without standard metadata).

If the API supports RFC 9728 (OAuth Protected Resource Metadata), just set authType — endpoints and client registration are handled automatically:

{
"api": {
"baseUrl": "https://connect.craft.do/my/api/v1/",
"authType": "oauth"
}
}

Craft Agents will hit the base URL, read the WWW-Authenticate header, discover OAuth metadata, dynamically register a client, and start the authorization flow. No oauth config block needed.

For providers that don’t expose standard OAuth metadata (e.g. GitHub, Linear), provide the endpoints manually:

{
"api": {
"baseUrl": "https://api.github.com/",
"authType": "oauth",
"oauth": {
"authorizationUrl": "https://github.com/login/oauth/authorize",
"tokenUrl": "https://github.com/login/oauth/access_token",
"clientId": "your_client_id",
"clientSecret": "your_client_secret",
"scopes": ["repo", "read:user"]
}
}
}
FieldRequiredDescription
oauth.authorizationUrlYesOAuth authorization endpoint
oauth.tokenUrlYesOAuth token exchange endpoint
oauth.clientIdYesYour OAuth app’s client ID
oauth.clientSecretNoClient secret (not required for public PKCE clients)
oauth.scopesNoRequested OAuth scopes
oauth.audienceNoAuth0-style audience parameter
oauth.extraParamsNoAdditional authorization URL params

Full OAuth 2.0 flow with PKCE in both modes. Tokens are automatically refreshed and sent as Authorization: Bearer {token}.

{
"api": {
"baseUrl": "https://api.example.com",
"authType": "none"
}
}

For public APIs that don’t require authentication.

{
"api": {
"baseUrl": "https://api.example.com",
"authType": "basic"
}
}

Sends credentials as Authorization: Basic {base64(username:password)}.

{
"api": {
"baseUrl": "https://api.example.com",
"authType": "header",
"headerNames": ["X-API-KEY", "X-APP-KEY"]
}
}

Sends multiple credentials as separate headers. Each header name in the array gets its own input field during authentication. All headers are included in every API request.

Common use cases:

  • Datadog: DD-API-KEY + DD-APPLICATION-KEY
  • APIs with identity + signing keys: Separate API key and secret
  • Services with app + user credentials: Application key plus user token

The testEndpoint field specifies an endpoint used to verify the connection works. When you test a source, Craft Agents makes a request to this endpoint to confirm:

  • The base URL is reachable
  • Authentication credentials are valid
  • The API responds correctly

Common test endpoints:

API TypeTest Endpoint
Health check/health
User info/me, /user
API status/status, /ping

For bearer-token APIs that provide their own token renewal endpoint (not OAuth), you can configure automatic token refresh with the optional renewEndpoint field. When the token expires, Craft Agents calls this endpoint to get a fresh token — no manual re-authentication needed.

{
"api": {
"baseUrl": "https://api.example.com/",
"authType": "bearer",
"renewEndpoint": {
"path": "auth/refresh",
"method": "POST",
"tokenField": "access_token",
"expiresInField": "expires_in"
}
}
}
FieldRequiredDefaultDescription
pathYesRenew URL — relative path (resolved against baseUrl) or absolute URL
methodNo"POST"HTTP method ("GET" or "POST")
bodyNoRequest body. Use {{token}} as placeholder for the current access token
headersNoExtra headers. {{token}} substitution applies here too
tokenFieldNo"access_token"JSON field name for the new token in the response
expiresInFieldNo"expires_in"JSON field name for expiry in seconds
fallbackTtlSecsNoFallback TTL when the response doesn’t include expiry

When body is omitted, the current token is sent via the Authorization header. When body is provided, {{token}} placeholders in string values are replaced with the current token (supports nested objects).

  • Universal Compatibility

    Any service with a REST API can be integrated.
  • Simple Configuration

    Just provide the base URL and auth details.
  • Flexible Requests

    The HTTP tool can make any request to the API — JSON bodies by default, with raw body support for plain text, XML, and other content types.
  • Secure Credentials

    API keys are stored encrypted, not in config files.
FeatureMCP SourcesAPI Sources
SetupNeed MCP server URLBase URL + auth config
ToolsPredefined by serverFlexible HTTP tool
AuthOAuth or bearerOAuth, bearer, header, query, basic, none
Best forServices with MCP supportAny REST API

Use MCP sources when available for richer integration with predefined tools. Use API sources for services without MCP support or when you need flexible HTTP access.

Practical Examples

Real-world examples of API source configurations.