Get started with connectors
Add your first Aperture connector, grant access to its capabilities, and verify the connection from a client. For background on how connectors work, refer to How connectors work. For complete field definitions, refer to the connectors reference.
Prerequisites
Before you begin, you need the following:
- Aperture enabled for your tailnet. Refer to Get started with Aperture if you have not set this up.
- Admin access to edit the
connectorsandgrantssections of the Aperture configuration. - The URL of at least one upstream service such as an MCP server or HTTP API, reachable from the Aperture gateway.
Step 1: Add a connector
Connectors that use oauth2_authorization_code or oauth2_client_credentials require an upstream OAuth application. Authorization-code clients can use PKCE without a client secret, while client-credentials connectors require a client secret. On the MCP server or API provider:
- For either method, create the OAuth application and note the client ID and token URL. For client credentials, also note the required client secret. For authorization code, note the client secret only if the application uses one.
- For
oauth2_authorization_code, register Aperture's callback URL (https://<aperture-hostname>/aperture/auth/<connector-id>/callback) and note the authorization URL and user authorization scopes.
Connectors live in the connectors section of the Aperture configuration.
Open the Aperture admin dashboard and go to Administration > Connectors.
That page is the visual editor and holds the connector picker. To edit theconnectors section as JSON instead, use the Administration > Configuration page.
You can add connectors in two ways:
- From the verified registry: The connector picker includes pre-configured defaults for common providers such as Salesforce, Atlassian, Slack, GitHub, Notion, and Linear. Open the picker for the current list. Selecting a provider pre-fills its configuration. Some require OAuth client credentials, but connectors using
oauth2_dcr, including Atlassian, Notion, and Linear, do not because Aperture registers the OAuth client automatically. For more information, refer to Add a verified connector. - Custom configuration: Add a
connectorssection with one or more server entries. Each entry needs aprotocol("mcp"or"http") and aurl.
The following example adds an unauthenticated MCP server and an authenticated HTTP API:
{
"connectors": {
"servers": {
"docs": {
"protocol": "mcp",
"url": "http://mcp-server.example.ts.net:8185/v1/mcp"
},
"github": {
"protocol": "http",
"url": "https://api.github.com",
"description": "GitHub REST API (read-only)",
"auth": {
"type": "bearer_token",
"secret": "github_pat_example"
}
}
}
}
}
Each key in the servers map is a connector ID that Aperture uses as a name prefix. Connector IDs must contain only letters and digits, starting with a letter. The IDs tailscale, internal, and aperture are reserved. Refer to the connectors reference for the full ID rules and authentication types.
Aperture supports bearer_token, api_key, basic, oauth2_client_credentials, oauth2_authorization_code, and oauth2_dcr authentication. Refer to the connectors reference for each type's fields.
The Aperture gateway uses its tailnet HTTP client for connections, so you can use MagicDNS hostnames (for example, http://mcp-server.example.ts.net:8080/v1/mcp) without additional network configuration.
Step 2: Grant access
Aperture denies connector access unless a grant matches the request. Add grants in the grants section of your configuration.
Open the Aperture admin dashboard and go to Administration > Grants.
Use the visual grant editor, or edit the same grants as JSON on the Administration > Configuration page.To change the configuration programmatically, refer to the grants configuration reference.
The following example grants every capability from every connector, including Aperture's built-in tools:
{
"grants": [
{
"src": ["*"],
"app": {
"tailscale.com/cap/aperture": [
{"connectors": ["**"]}
]
}
}
]
}
Connector grants use the connectors field with "connectorID/category/resource" glob patterns. The valid categories are tools, resources, templates, and proxy. Both MCP and HTTP connectors require grants. Refer to the grants configuration reference for the full syntax.
A "**" grant reaches every connector you add later, including sensitive ones. Use it only while you verify your first connector.
Labels are another way to write a connector grant. A label is a flat string you set on a connector, and one label:<name> pattern grants every connector carrying that label. Once you have more than one connector, replace the broad grant with labeled groups. Refer to Grant connector access by label.
Step 3: Verify the connection
Verify the connector in Chat first, then verify client access.
Check the connector status
- Open Connectors in the Aperture Chat portal.
- Select the connector.
- Confirm it appears under Ready to use and shows Ready.
- For MCP, confirm Tools contains the expected tools.
Ready describes access and authorization, not upstream reachability. Select Refresh tools to contact the upstream and request current tools.
Diagnose a connector that is not ready
- Connect to use with Connect means authorization is required.
- Needs reconnect with Reconnect means saved authorization is unusable.
- Temporarily unavailable means Aperture could not read credential state. Reload and retry.
For non-admins, grant-denied configured connectors are omitted. Direct detail access uses the same not-found state as a nonexistent connector. Revisit Step 2 rather than looking for No access.
If Refresh tools returns 502 upstream error, confirm the URL is correct and reachable from the Aperture gateway.
Verify access from a client
Once the connector shows Ready, verify access from a client. Run these commands from a device in your tailnet whose identity has the grants from Step 2. Aperture authorizes each request from the caller's tailnet identity, and <aperture-hostname> is the Aperture gateway's MagicDNS name.
For MCP connectors, point your MCP client at the Aperture URL and list available tools:
curl http://<aperture-hostname>/v1/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "method": "tools/list", "id": 1}'
The response contains a tools array with prefixed entries from your configured connectors (for example, docs_search).
For HTTP connectors, send a request through the Aperture proxy path:
curl http://<aperture-hostname>/v1/connectors/github/user
Aperture forwards the request to https://api.github.com/user and injects the configured bearer token automatically.
Next steps
- Set up an HTTP API connector to proxy requests to an upstream REST API with automatic authentication.
- Set up a per-user OAuth 2.0 connector to connect agents to services that require individual user authorization.
- Use a connector once it is configured, to authorize and call its tools as an end-user.
- Grant connector access by label to replace a broad
"**"grant with labeled groups of connectors.